Вычитание из словаря словарей в кадре данных pandas ⇐ Python
-
Anonymous
Вычитание из словаря словарей в кадре данных pandas
У меня есть фрейм данных, в котором я хочу найти разницу в unique_users за последний день (2023-09-06) и предыдущий день (2023-09-07) для определенного часа 2 и 13 отдельно для каждого ключа ' bsnl» и «other» и для определенного Exception. Мне нужно учитывать Исключение, Час и Дата, чтобы вычислить разницу.
DateTime Дата Час Исключение IMSI_Operator 0 06.09.2023, 02:00:00 06.09.2023, 00:00:00 2 s2ap {'bsnl': {'total_sessions': 50007, 'unique_users': 38880}, 'Другое': {'total_sessions' : 50, 'unique_users': 32}} 1 06.09.2023, 13:00:00 06.09.2023, 00:00:00 13 s2ap {'bsnl': {'total_sessions': 60004, 'unique_users': 49816}, 'Другое': {'total_sessions' : 34, 'unique_users': 22}} 2 07.09.2023, 13:00:00 07.09.2023, 00:00:00 13 s2ap {'bsnl': {'total_sessions': 45224, 'unique_users': 37525}, 'Другое': {'total_sessions' : 32, 'unique_users': 27}} 3 07.09.2023, 02:00:00 07.09.2023, 00:00:00 2 s2ap {'bsnl': {'total_sessions': 47713, 'unique_users': 37284}, 'Другое': {'total_sessions' : 43, 'unique_users': 27}} Что я пробовал:
импортировать панд как pd импортировать JSON # Пример фрейма данных данные = { 'Дата': ['2023-09-06 00:00:00', '2023-09-06 00:00:00', '2023-09-07 00:00:00', '2023-09-07 00:00:00'], «Час»: [2, 13, 13, 2], «Исключение»: ['s2ap', 's2ap', 's2ap', 's2ap'], 'IMSI_Оператор': [ {'bsnl': {'total_sessions': 50007, 'unique_users': 38880}, 'Другое': {'total_sessions': 50, 'unique_users': 32}}, {'bsnl': {'total_sessions': 60004, 'unique_users': 49816}, 'Другое': {'total_sessions': 34, 'unique_users': 22}}, {'bsnl': {'total_sessions': 45224, 'unique_users': 37525}, 'Другое': {'total_sessions': 32, 'unique_users': 27}}, {'bsnl': {'total_sessions': 47713, 'unique_users': 37284}, 'Другое': {'total_sessions': 43, 'unique_users': 27}} ] } result_df = pd.DataFrame (данные) # Преобразование даты в дату и время result_df['Дата'] = pd.to_datetime(result_df['Дата']) # Фильтр по последнему дню последний_день = result_df[result_df['Дата'] == result_df['Дата'].max()] # Фильтр по предыдущему дню предыдущий_день = result_df[result_df['Дата'] == (result_df['Дата'].max() - pd.DateOffset(days=1))] результат = {} для ключа в late_day['IMSI_Operator'].values[0].keys(): latest_unique_users = последний_день['IMSI_Operator'].values[0][ключ]['unique_users'] previous_unique_users = previous_day['IMSI_Operator'].values[0][ключ]['unique_users'] результат[ключ] = { 'unique_users_diff': последние_уникальные_пользователи - предыдущие_уникальные_пользователи, } печать (результат) Но я хотел бы получить разницу в самом исходном кадре данных. Предыдущие строки с датой 2023-09-06 не нужны в конечном кадре данных. мой текущий код не учитывает конкретный час и конкретное исключение для расчета.
Ожидаемый результат:
Час Дата исключения IMSI_Operator bsnl_unique_users_diff Other_unique_users_diff 2 s2ap 07.09.2023 {'bsnl': {'total_sessions': 60004, 'unique_users': 49816}, 'Другое': {'total_sessions': 34, 'unique_users': 22}} -1596 5 13 s2ap 07.09.2023 {'bsnl': {'total_sessions': 50007, 'unique_users': 38880}, 'Другое': {'total_sessions': 50, 'unique_users': 32}} -12291 -5
У меня есть фрейм данных, в котором я хочу найти разницу в unique_users за последний день (2023-09-06) и предыдущий день (2023-09-07) для определенного часа 2 и 13 отдельно для каждого ключа ' bsnl» и «other» и для определенного Exception. Мне нужно учитывать Исключение, Час и Дата, чтобы вычислить разницу.
DateTime Дата Час Исключение IMSI_Operator 0 06.09.2023, 02:00:00 06.09.2023, 00:00:00 2 s2ap {'bsnl': {'total_sessions': 50007, 'unique_users': 38880}, 'Другое': {'total_sessions' : 50, 'unique_users': 32}} 1 06.09.2023, 13:00:00 06.09.2023, 00:00:00 13 s2ap {'bsnl': {'total_sessions': 60004, 'unique_users': 49816}, 'Другое': {'total_sessions' : 34, 'unique_users': 22}} 2 07.09.2023, 13:00:00 07.09.2023, 00:00:00 13 s2ap {'bsnl': {'total_sessions': 45224, 'unique_users': 37525}, 'Другое': {'total_sessions' : 32, 'unique_users': 27}} 3 07.09.2023, 02:00:00 07.09.2023, 00:00:00 2 s2ap {'bsnl': {'total_sessions': 47713, 'unique_users': 37284}, 'Другое': {'total_sessions' : 43, 'unique_users': 27}} Что я пробовал:
импортировать панд как pd импортировать JSON # Пример фрейма данных данные = { 'Дата': ['2023-09-06 00:00:00', '2023-09-06 00:00:00', '2023-09-07 00:00:00', '2023-09-07 00:00:00'], «Час»: [2, 13, 13, 2], «Исключение»: ['s2ap', 's2ap', 's2ap', 's2ap'], 'IMSI_Оператор': [ {'bsnl': {'total_sessions': 50007, 'unique_users': 38880}, 'Другое': {'total_sessions': 50, 'unique_users': 32}}, {'bsnl': {'total_sessions': 60004, 'unique_users': 49816}, 'Другое': {'total_sessions': 34, 'unique_users': 22}}, {'bsnl': {'total_sessions': 45224, 'unique_users': 37525}, 'Другое': {'total_sessions': 32, 'unique_users': 27}}, {'bsnl': {'total_sessions': 47713, 'unique_users': 37284}, 'Другое': {'total_sessions': 43, 'unique_users': 27}} ] } result_df = pd.DataFrame (данные) # Преобразование даты в дату и время result_df['Дата'] = pd.to_datetime(result_df['Дата']) # Фильтр по последнему дню последний_день = result_df[result_df['Дата'] == result_df['Дата'].max()] # Фильтр по предыдущему дню предыдущий_день = result_df[result_df['Дата'] == (result_df['Дата'].max() - pd.DateOffset(days=1))] результат = {} для ключа в late_day['IMSI_Operator'].values[0].keys(): latest_unique_users = последний_день['IMSI_Operator'].values[0][ключ]['unique_users'] previous_unique_users = previous_day['IMSI_Operator'].values[0][ключ]['unique_users'] результат[ключ] = { 'unique_users_diff': последние_уникальные_пользователи - предыдущие_уникальные_пользователи, } печать (результат) Но я хотел бы получить разницу в самом исходном кадре данных. Предыдущие строки с датой 2023-09-06 не нужны в конечном кадре данных. мой текущий код не учитывает конкретный час и конкретное исключение для расчета.
Ожидаемый результат:
Час Дата исключения IMSI_Operator bsnl_unique_users_diff Other_unique_users_diff 2 s2ap 07.09.2023 {'bsnl': {'total_sessions': 60004, 'unique_users': 49816}, 'Другое': {'total_sessions': 34, 'unique_users': 22}} -1596 5 13 s2ap 07.09.2023 {'bsnl': {'total_sessions': 50007, 'unique_users': 38880}, 'Другое': {'total_sessions': 50, 'unique_users': 32}} -12291 -5