Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 26.05.2014
Сообщений: 96

Создать таблицу по условию

07.03.2022, 21:08. Показов 2288. Ответов 7

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста с созданием таблицы.
Существует таблицы, содержащая в себе данные : id- номер пользователя, FirstVisit - дата первого визита, LastVisit - дата последнего визита.
Необходимо создать таблицу с полями: Month - месяц, MAU- количество уникальных пользователей.

Я пока создал список месяцев, через минимальную и максимальную дату в таблице.
Python
1
df=pd.date_range(visit.FirstVisit.min(),visit.LastVisit.max()).strftime('%Y-%m')
B придумал примерный способ как посчитать MAU, это - Количество уникальных id, у которых FirstVisit<=Month, и LastVisit>=Month. Но реализовать это не получается. Пробовал через функцию, но пока не выходит, помогите пожалуйста.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.03.2022, 21:08
Ответы с готовыми решениями:

Создать таблицу из данных иных таблиц по условию
Здравствуйте. Помогите, пожалуйста с запросом. Попробую описать: есть 2 таблицы T1 A F AVal1 FVal1 AVal2 FVal2 ...

Как в процедуре создать таблицу и заполнить ее данными из других таблиц, по определенному условию
Подскажите пожалуйста, я новичок в SQL, и не совсем понимаю, как можно создать такую процедуру, в которой будет создаваться таблица, и ...

Задано линейную таблицу X. Переписать из него в таблицу В элементы, соответствующие заданному условию: а) начи
Задано линейную таблицу X. Переписать из него в таблицу В элементы, соответствующие заданному условию: а) начиная со второго с шагом 3; ...

7
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
07.03.2022, 23:09
Ace23000, таблиц нет. Посмотри:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
import numpy as np
 
df = pd.DataFrame({'id': [1,2,3,1,2,3,1,2,3], 
              'A': np.random.randint(1,12,9),
              'B': np.random.randint(1,12,9)})
print(df)
 
df1 = pd.DataFrame({'Month': np.arange(1,13)})
 
fun = lambda m: np.where((df.A <= m) & (df.B >= m), df.id, 0)
df1['cnt'] = df1.Month.map(lambda x: np.count_nonzero(np.unique(fun(x))))
print(df1)
0
0 / 0 / 0
Регистрация: 26.05.2014
Сообщений: 96
08.03.2022, 21:47  [ТС]
Попробовал так, не получилось, не правильно считает суммы по промежуткам, закономерность к сожалению не обнаружил.

+ немного исправил создание фрейма, для первого столбца:

Python
1
df=pd.DataFrame(pd.date_range(visit.FirstVisit.min(),visit.LastVisit.max(), freq='M').strftime('%Y-%m'),columns=['Month'])
Добавлено через 22 минуты
Может нужно обратить внимание на то, что у пользователя, FirstVisit и LastVisit всегда одинаковая, но запись может повторяться, т.к пропущены столбцы. Т.е по факту дубли можно удалить и считать просто количество записей.
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
08.03.2022, 22:00
Лучший ответ Сообщение было отмечено Ace23000 как решение

Решение

Ace23000,
закономерность к сожалению не обнаружил.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import pandas as pd
import numpy as np
 
df = pd.DataFrame({'id': [1,2,3,1,2,3,1,2,3], 
              'A': np.random.randint(1,12,9),
              'B': np.random.randint(1,12,9)})
print(df)
 
df1 = pd.DataFrame({'Month': np.arange(1,13)})
 
# функция - возвращает по условию
# ,        (df.A <= m) & (df.B >= m)
#         df.A - столбец месяца первого визита
#         df.B - последнего визита
#         'm' - значение в столбце df1['Month']
# если попадает во временной промежуток - 'id'
# и 0, если нет
# работает для всего "'df' и каждой строки df1
 
fun = lambda m: np.where((df.A <= m) & (df.B >= m), df.id, 0)
 
# считает в начале уникальные значения,
# полученные в функции выше
# (все 'id' и 0 при заданном 'm'),
# затем считает количество
# уникальных значений, исключая 0
df1['cnt'] = df1.Month.map(lambda x: np.count_nonzero(np.unique(fun(x))))
print(df1)
1
0 / 0 / 0
Регистрация: 26.05.2014
Сообщений: 96
09.03.2022, 14:22  [ТС]
Да, получилось, спасибо. Сначала не увидел, что если учитывать id пользователя, то все правильно считает.
Только вот остался вопрос, как добавить в эту таблицу еще поле с месяцем первого визита (FirstVisit).
То есть должна выполняться таже функция, только с добавлением группировке по месяцу первого визита.

Скорее всего, нужно делать через цикл, вначале создать пустой датафрейм и дальше по строке его заполнять.
Попробовал сделать, но ругается даже на сопоставление с месяцем, можете подсказать как сделать:

Python
1
2
3
4
5
6
7
for i in (pd.date_range(visit.FirstVisit.min(),visit.FirstVisit.max(),freq='M').strftime('%Y-%m')):
 
    for m in (pd.date_range(visit.FirstVisit.min(),visit.LastVisit.max(),freq='M').strftime('%Y-%m')):
 
        if (visit.FirstVisit.strftime('%Y-%m') = i) & (visit.FirstVisit<=m) & (visit.LastVisit >= m) :
 
            df1=df1.append({'FirstVisit:' i,'Months': m,'cnt'= df1.Month.map(lambda x:np.count_nonzero(np.unique(fun(x))))})
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
09.03.2022, 15:16
Ace23000, нужны реальные таблицы (хотя бы с минимумом строк и колонок):
*- "такая" на входе
*- нужно получить "вот такую", используя "вот твкое" условие
Причина - в pandas очень часто возникают проблемы с временными (дата) рядами (столбцами или строками).
0
0 / 0 / 0
Регистрация: 26.05.2014
Сообщений: 96
09.03.2022, 16:43  [ТС]
Сразу скажу что у всех дат тип datetime64
Вот пример на входе :
idFirstVisitLastVisit
103.02.202110.10.2021
210.02.202112.12.2021
315.01.202101.02.2022
414.05.202104.03.2022
512.05.202115.05.2021
103.02.202110.10.2021
315.01.202101.02.2022

Вот результирующая таблица, группируется по FirstVisit, и считает количество пользователей:
FirstVisitMonthcnt
2021.012021.011
2021.012021.021
2021.012021.031
2021.012021.041
2021.012021.051
2021.012021.061
2021.012021.071
2021.012021.081
2021.012021.091
2021.012021.101
2021.012021.111
2021.012021.121
2021.012022.011
2021.012022.021
2021.022021.022
2021.022021.032
2021.022021.042
2021.022021.052
2021.022021.062
2021.022021.072
2021.022021.082
2021.022021.092
2021.022021.102
2021.022021.111
2021.022021.121
2021.052021.052
2021.052021.061
2021.052021.071
2021.052021.081
2021.052021.091
2021.052021.101
2021.052021.111
2021.052021.121
2021.052022.011
2021.052022.021
2021.052022.031
0
0 / 0 / 0
Регистрация: 26.05.2014
Сообщений: 96
12.03.2022, 20:52  [ТС]
Нашел, ошибки в цикле, но пока все равно не получается.
Python
1
2
3
4
5
6
7
for i in (pd.date_range(visit.FirstVisit.min(),visit.FirstVisit.max(),freq='M').strftime('%Y-%m')):
 
    for m in (pd.date_range(visit.FirstVisit.min(),visit.LastVisit.max(),freq='M').strftime('%Y-%m')):
 
        if (pd.to_datetime(visit.FirstVisit, format ='%Y-%m')==i) & (visit.FirstVisit<=m) & (visit.LastVisit >= m) :
 
            df1=df1.append({'FirstVisit': i,'Months': m,'cnt': df1.Month.map(lambda x:np.count_nonzero(np.unique(fun(x))))})
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.03.2022, 20:52
Помогаю со студенческими работами здесь

Создать таблицу БД, создать БД и поместить в неё ранее созданную таблицу
создать тадлицу БД,создание БД и помещение в неё ранее созданную таблицу(с помощъю CREAT)

Создать таблицу Person (id, name, gender), в которой id является первичным ключом. Создать таблицу Food (id, food,
id_Person), где id_Person является внешним ключом. Заполнить. Вывести на экран всю информацию из двух таблиц.

Из запроса в таблицу по условию
Здравствуйте. Помогите, пожалуйста, решить 2 задачи, уже прочитал ряд похожих ранее созданных тем, но то, что конкретно необходимо мне,...

Разделить таблицу по условию
Помогите, пожалуйста, доделать или переделать Selection.Find.ClearFormatting With Selection.Find .Text =...

Сформировать таблицу по заданному условию.
Разработать программу, в которой по заданным целым числом N (2 ≤ N &lt;99) формируется таблица с N строк и N столбцов следующей структуры ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru