Группировать клиентов по периодам в Python ⇐ Python
-
Гость
Группировать клиентов по периодам в Python
Я не могу осознать эту проблему. У меня есть образец df, содержащий данные об транспортных средствах и людях, которые в какой-то момент владели ими или совладельцами. Есть 4 важных столбца:
CREATED_ON_DT — время создания записи (не меняется) CHANGED_ON_DT — когда запись была изменена (RELATION_KEY, который является статусом владения) SALE_DT_KEY — это когда автомобиль был впервые продан самому первому покупателю. RELATION_KEY — статус владения. Это может быть 9 (бывший владелец), 4 (бывший совладелец), 3 (нынешний владелец), 5 (текущий совладелец)
Способ отслеживания продажи автомобиля состоит в том, чтобы получить измененный_on_dt для статуса 9, если следующая строка также имеет статус 9. Однако проблема в том, что владельцы и совладельцы могут переключаться между собой, и точка продажи иногда будет иметь статус. 9 в статус 4 (это значит, что я был бывшим владельцем и продал машину тому, кто потом из владельца стал совладельцем).
Я пытаюсь собрать группы владельцев, например, я владел им, а моя жена была совладельцем (группа 1). Затем мы продали его другой семье, и оно какое-то время принадлежало им, но поменяли владельцев и совладельцев (группа 2), прежде чем продать его третьей семье (группа 3).
В следующем коде приведены примеры данных и моя попытка хотя бы зафиксировать периоды состояния. Там также есть столбец NEEDED_RESULT.
Заранее спасибо!
# Пример кадра данных copy_of_df = pd.DataFrame({ «VEHICLE_KEY»: [4331229, 4331229, 4331229, 4331229, 4331229, 4331229, 4331229, 4331229, 4331229], "PERSON_KEY": [10778254, 10778265, 20841772, 20122268, 20935263, 20962087, 21096582, 21096580, 21133677], "CREATED_ON_DT": pd.to_datetime(["2013-08-27 00:33:48", "2013-08-27 00:33:48", "2016-07-26 12:07:41", "2016 -08-01 11:35:57", "2016-08-01 11:36:00", "2016-08-03 00:27:22", "2016-08-04 00:26:04", "2016-08-04 00:26:04", "2016-08-07 00:26:01"]), "CHANGED_ON_DT": pd.to_datetime(["2016-07-26 12:07:40", "2016-07-26 12:07:40", "2016-08-01 11:35:57", "2016 -08-03 00:19:06", "2016-08-03 00:19:14", "2016-08-04 00:18:21", "2016-08-07 00:19:51", "2016-08-07 00:19:38", "2016-08-07 05:02:01"]), «SALE_DT_KEY»: [20130826, 20130826, 20130826, 20130826, 20130826, 20130826, 20130826, 20130826, 20130826], "RELATION_KEY": [9, 4, 4, 9, 4, 9, 4, 9, 3], «NEEDED_RESULT»:['group1', 'group1', 'group2', 'group2', 'group2', 'group3', 'group4', 'group4', 'group5'] }) # дф copy_of_df = copy_of_df.sort_values(['VEHICLE_KEY', 'PERSON_KEY', 'CREATED_ON_DT']) # Определить коды состояния текущий_владелец = 3 бывший_владелец = 9 совладелец = 5 бывший_совладелец = 4 # Глобальный счетчик глобальный_счетчик = 0 total_rows = len(copy_of_df) # Функция для назначения комбинации владения и совладения защита Assign_combination (группа): глобальный global_counter владелец_счет = 0 последний_владелец_статус = Нет Owner_start_date = group.iloc[0]['SALE_DT_KEY'] if pd.notnull(group.iloc[0]['SALE_DT_KEY']) else group.iloc[0]['CREATED_ON_DT'] для i, строка в group.iterrows(): print(f"Обработка строки {global_counter+1} из {total_rows}") current_owner_status = строка['RELATION_KEY'] # Проверьте, начинается ли новый период владения если текущий_статус_владельца в [текущий_владелец, совладелец] и (статус последнего_владельца в [бывший_владелец, бывший_совладелец]): печать('3') число_владельцев += 1 #group.loc[group['ownership_combination'] == f'{owner_count}ownercoowner', 'ownership_ period'] = f'{ownership_start_date} - {pd.Timestamp("сегодня")}' group.at[i, 'ownership_combination'] = f'{owner_count}ownercoowner' group.at[i, 'ownership_ period'] = f'{ownership_start_date} - {pd.Timestamp("сегодня")}' # Проверьте, начинается ли новый период владения elif current_owner_status в [current_owner, coowner] и (last_owner_status — None): печать('y') число_владельцев += 1 #group.loc[group['ownership_combination'] == f'{owner_count}ownercoowner', 'ownership_ period'] = f'{ownership_start_date} - {pd.Timestamp("сегодня")}' group.at[i, 'ownership_combination'] = f'{owner_count}ownercoowner' group.at[i, 'ownership_ period'] = f'{ownership_start_date} - {pd.Timestamp("сегодня")}' #ownership_start_date = строка['CHANGED_ON_DT'] elif текущий_статус_владельца в [бывший_владелец, бывший_совладелец] и (статус последнего_владельца в [бывший_владелец, бывший_совладелец]): печать('2') число_владельцев += 1 Owner_end_date = строка['CHANGED_ON_DT'] #group.loc[group['ownership_combination'] == f'{owner_count}ownercoowner', 'ownership_ period'] = f'{ownership_start_date} - {ownership_end_date}' group.at[i, 'ownership_combination'] = f'{owner_count}ownercoowner' печать (владение_start_date) group.at[i, 'ownership_ period'] = f'{ownership_start_date} – {ownership_end_date}' # Сброс даты начала следующего периода владения Owner_start_date = строка['CHANGED_ON_DT'] elif current_owner_status в [former_owner, ex_coowner] и (last_owner_status — None): печать('1') владелец_счет = 1 Owner_start_date = строка['SALE_DT_KEY'] Owner_end_date = строка['CHANGED_ON_DT'] print(f'{ownership_start_date} - {ownership_end_date}') #group.loc[group['ownership_combination'] == f'{owner_count}ownercoowner', 'ownership_ period'] = f'{ownership_start_date} - {ownership_end_date}' group.at[i, 'ownership_combination'] = f'{owner_count}ownercoowner' group.at[i, 'ownership_ period'] = f'{ownership_start_date} – {ownership_end_date}' # Сброс даты начала следующего периода владения Owner_start_date = строка['CHANGED_ON_DT'] печать (текущий_владелец_статус) последний_владелец_статус = текущий_владелец_статус печать (последний_владелец_статус) group.loc[i, 'ownership_combination'] = f'{owner_count}ownercoowner' глобальный_счетчик += 1 группа возврата copy_of_df['ownership_combination'] = Нет copy_of_df['ownership_ period'] = Нет copy_of_df = copy_of_df.groupby('VEHICLE_KEY').apply(assign_combination)
Я не могу осознать эту проблему. У меня есть образец df, содержащий данные об транспортных средствах и людях, которые в какой-то момент владели ими или совладельцами. Есть 4 важных столбца:
CREATED_ON_DT — время создания записи (не меняется) CHANGED_ON_DT — когда запись была изменена (RELATION_KEY, который является статусом владения) SALE_DT_KEY — это когда автомобиль был впервые продан самому первому покупателю. RELATION_KEY — статус владения. Это может быть 9 (бывший владелец), 4 (бывший совладелец), 3 (нынешний владелец), 5 (текущий совладелец)
Способ отслеживания продажи автомобиля состоит в том, чтобы получить измененный_on_dt для статуса 9, если следующая строка также имеет статус 9. Однако проблема в том, что владельцы и совладельцы могут переключаться между собой, и точка продажи иногда будет иметь статус. 9 в статус 4 (это значит, что я был бывшим владельцем и продал машину тому, кто потом из владельца стал совладельцем).
Я пытаюсь собрать группы владельцев, например, я владел им, а моя жена была совладельцем (группа 1). Затем мы продали его другой семье, и оно какое-то время принадлежало им, но поменяли владельцев и совладельцев (группа 2), прежде чем продать его третьей семье (группа 3).
В следующем коде приведены примеры данных и моя попытка хотя бы зафиксировать периоды состояния. Там также есть столбец NEEDED_RESULT.
Заранее спасибо!
# Пример кадра данных copy_of_df = pd.DataFrame({ «VEHICLE_KEY»: [4331229, 4331229, 4331229, 4331229, 4331229, 4331229, 4331229, 4331229, 4331229], "PERSON_KEY": [10778254, 10778265, 20841772, 20122268, 20935263, 20962087, 21096582, 21096580, 21133677], "CREATED_ON_DT": pd.to_datetime(["2013-08-27 00:33:48", "2013-08-27 00:33:48", "2016-07-26 12:07:41", "2016 -08-01 11:35:57", "2016-08-01 11:36:00", "2016-08-03 00:27:22", "2016-08-04 00:26:04", "2016-08-04 00:26:04", "2016-08-07 00:26:01"]), "CHANGED_ON_DT": pd.to_datetime(["2016-07-26 12:07:40", "2016-07-26 12:07:40", "2016-08-01 11:35:57", "2016 -08-03 00:19:06", "2016-08-03 00:19:14", "2016-08-04 00:18:21", "2016-08-07 00:19:51", "2016-08-07 00:19:38", "2016-08-07 05:02:01"]), «SALE_DT_KEY»: [20130826, 20130826, 20130826, 20130826, 20130826, 20130826, 20130826, 20130826, 20130826], "RELATION_KEY": [9, 4, 4, 9, 4, 9, 4, 9, 3], «NEEDED_RESULT»:['group1', 'group1', 'group2', 'group2', 'group2', 'group3', 'group4', 'group4', 'group5'] }) # дф copy_of_df = copy_of_df.sort_values(['VEHICLE_KEY', 'PERSON_KEY', 'CREATED_ON_DT']) # Определить коды состояния текущий_владелец = 3 бывший_владелец = 9 совладелец = 5 бывший_совладелец = 4 # Глобальный счетчик глобальный_счетчик = 0 total_rows = len(copy_of_df) # Функция для назначения комбинации владения и совладения защита Assign_combination (группа): глобальный global_counter владелец_счет = 0 последний_владелец_статус = Нет Owner_start_date = group.iloc[0]['SALE_DT_KEY'] if pd.notnull(group.iloc[0]['SALE_DT_KEY']) else group.iloc[0]['CREATED_ON_DT'] для i, строка в group.iterrows(): print(f"Обработка строки {global_counter+1} из {total_rows}") current_owner_status = строка['RELATION_KEY'] # Проверьте, начинается ли новый период владения если текущий_статус_владельца в [текущий_владелец, совладелец] и (статус последнего_владельца в [бывший_владелец, бывший_совладелец]): печать('3') число_владельцев += 1 #group.loc[group['ownership_combination'] == f'{owner_count}ownercoowner', 'ownership_ period'] = f'{ownership_start_date} - {pd.Timestamp("сегодня")}' group.at[i, 'ownership_combination'] = f'{owner_count}ownercoowner' group.at[i, 'ownership_ period'] = f'{ownership_start_date} - {pd.Timestamp("сегодня")}' # Проверьте, начинается ли новый период владения elif current_owner_status в [current_owner, coowner] и (last_owner_status — None): печать('y') число_владельцев += 1 #group.loc[group['ownership_combination'] == f'{owner_count}ownercoowner', 'ownership_ period'] = f'{ownership_start_date} - {pd.Timestamp("сегодня")}' group.at[i, 'ownership_combination'] = f'{owner_count}ownercoowner' group.at[i, 'ownership_ period'] = f'{ownership_start_date} - {pd.Timestamp("сегодня")}' #ownership_start_date = строка['CHANGED_ON_DT'] elif текущий_статус_владельца в [бывший_владелец, бывший_совладелец] и (статус последнего_владельца в [бывший_владелец, бывший_совладелец]): печать('2') число_владельцев += 1 Owner_end_date = строка['CHANGED_ON_DT'] #group.loc[group['ownership_combination'] == f'{owner_count}ownercoowner', 'ownership_ period'] = f'{ownership_start_date} - {ownership_end_date}' group.at[i, 'ownership_combination'] = f'{owner_count}ownercoowner' печать (владение_start_date) group.at[i, 'ownership_ period'] = f'{ownership_start_date} – {ownership_end_date}' # Сброс даты начала следующего периода владения Owner_start_date = строка['CHANGED_ON_DT'] elif current_owner_status в [former_owner, ex_coowner] и (last_owner_status — None): печать('1') владелец_счет = 1 Owner_start_date = строка['SALE_DT_KEY'] Owner_end_date = строка['CHANGED_ON_DT'] print(f'{ownership_start_date} - {ownership_end_date}') #group.loc[group['ownership_combination'] == f'{owner_count}ownercoowner', 'ownership_ period'] = f'{ownership_start_date} - {ownership_end_date}' group.at[i, 'ownership_combination'] = f'{owner_count}ownercoowner' group.at[i, 'ownership_ period'] = f'{ownership_start_date} – {ownership_end_date}' # Сброс даты начала следующего периода владения Owner_start_date = строка['CHANGED_ON_DT'] печать (текущий_владелец_статус) последний_владелец_статус = текущий_владелец_статус печать (последний_владелец_статус) group.loc[i, 'ownership_combination'] = f'{owner_count}ownercoowner' глобальный_счетчик += 1 группа возврата copy_of_df['ownership_combination'] = Нет copy_of_df['ownership_ period'] = Нет copy_of_df = copy_of_df.groupby('VEHICLE_KEY').apply(assign_combination)
Мобильная версия