Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅
π ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° Π² ΠΊΠ°Π½Π°Π» ΠΈ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ° Π‘Π°Π½ΠΊΠ΅ΠΉ #ΠΊΠΎΠ΄ΠΈΠΌΠΏΠΈΡΠΎΠ½ΠΈΠΌ ΠΠ°ΡΠΌΠΎΡΡΠ΅Π²ΡΠΈΡΡ Π½Π° ΠΠ°Π»Π΅ΡΠΈΡ Ρ ΠΊΠ°Π½Π°Π»Π° "ΠΠΈΡ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ " ΡΠ΅ΡΠΈΠ» ΡΠΎΠΆΠ΅ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΈΡΠ°ΡΡ ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΠΈΡ Π·Π°Π΄Π°ΡΠ°Ρ Π½Π° ΠΏΠΈΡΠΎΠ½Π΅ ΠΈ ΡΠΏΠΎΡΠΎΠ±Π΅ ΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ. Π ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠ»ΠΎΠΆΠ΅Π½ ΠΏΠΈΡΠΎΠ½ΠΎΠ²ΡΠΊΠΈΠΉ ΡΠ°ΠΉΠ» ΡΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠΉ Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ Π² ΠΊΠΎΠ΄Π΅ ΠΡΠ»Π° ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π·Π°Π΄Π°ΡΠ° ΡΠ·Π½Π°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠ΅Π½ΡΠ»ΠΈ ΠΊΠ°Π½Π°Π» ΠΏΡΠΎΠ΄Π°ΠΆ, ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΌΠ΅ΡΡΡΠ΅. Π‘Π΅ΠΉΡΠ°Ρ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π° ΡΠ°ΠΊ-ΠΆΠ΅ ΠΏΠΎΡΡΡΠΎΠΈΠΌ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π°Π½Π½ΡΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ Π‘Π°Π½ΠΊΠ΅ΠΉ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎ, ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΠΊΠ°Π½Π°Π»Π° ΠΊΡΠ΄Π° ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ (Π° Π±ΠΎΠ½ΡΡΠΎΠΌ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΠΌ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ Π² Π³ΠΎΠ½ΠΎΡΠ½ΡΠΉ ΡΡΠ΅ΠΊ π ) ΠΡΠ°ΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ Π΄Π°ΡΠ°ΡΠ΅Ρ, ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ - ΠΊΠ»ΠΈΠ΅Π½Ρ - ΠΊΠ°Π½Π°Π» - ΠΈ ΠΌΠ΅ΡΡΡ - ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΡΡΠΎ Ρ Π½Π°Ρ Π²ΡΠ³ΡΡΠ·ΠΊΠ° Π·Π° ΠΏΠΎΠ» Π³ΠΎΠ΄Π° Π‘Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π΄Π°ΡΠ°ΡΠ΅Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ: import random import pandas as pd import numpy as np clients = [str(random.randint(1, 999999)) for _ in range(20)] clients = clients * 6 channels = ['E-com', 'B2B', 'B2C'] channel = [random.choice(channels) for _ in range(120)] date_month = [] for i in range(2, 8): date_month.extend([str(i)] * 20) data = { 'client': clients, 'channel': channel, 'date_month': date_month } df = pd.DataFrame(data) ΠΡΠΎΠ±Π΅ΠΆΠΈΠΌΡΡ ΠΏΠΎ ΠΊΠΎΠ΄Ρ: 1. Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² Π² ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ 20, ΠΈ ΡΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ Π½Π° 6, ΠΏΠΎΠ»ΡΡΠ°Ρ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π²ΡΠ³ΡΡΠ·ΠΊΠΈ ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΉ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΌΠ΅ΡΡΡΡ 2. Π€ΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ· Π΄ΠΎΠΏΡΡΡΠΈΠΌ ΡΡΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π² ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ 120, ΠΏΠΎΠ΄ Π²Π΅ΡΡ Π½Π°Ρ Π΄Π°ΡΠ°ΡΠ΅Ρ 3. ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΠΌΠ΅ΡΡΡΡ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΎΡ 2 Π΄ΠΎ 7 ΠΌΠ΅ΡΡΡΠ° - ΠΏΠΎ 20 ΡΠ°Π· ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ ΠΈΠ·ΡΡΠ°ΡΡ Π΄Π°ΡΠ°ΡΠ΅Ρ: Π‘Π½Π°ΡΠ°Π»Π° ΠΏΠΎΡΡΠΈΡΠ°Π΅ΠΌ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ°Π½Π°Π»ΠΎΠ² Π±ΡΠ»ΠΎ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΡΠΈΡΡΡ Π² Π½Π°Ρ Π΄Π°ΡΠ°ΡΠ΅Ρ count_channel = df.groupby('client')['channel'].nunique().rename('unique_channels') dfmain = df.join(count_channel, on='client', how='left') ΠΠ°ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΌΠ΅ΡΠΊΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ - ΠΌΠ΅Π½ΡΠ»ΡΡ ΠΈΠ»ΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΠ»ΡΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΊΠ°Π½Π°Π», Π½Π°Π³Π»ΡΠ΄Π½Π΅Π΅ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ numpy. Π Π½Π°ΡΠ΅ΠΉ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠ΅ ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΊΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² Π½Π΅ Π±ΡΠ΄Π΅Ρ, Π½ΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ ΡΠ°ΠΊΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² Π±ΡΠ»ΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ dfmain['change_channel'] = np.where(dfmain['unique_channels'] > 1, 'change', 'no change') ΠΠ°Π»Π΅Π΅ Π² ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΌΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°ΠΊΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², Π½ΠΎ ΡΡΡ ΠΌΠ΅ΡΡΠ° ΠΌΠ°Π»ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ°Π·Ρ ΠΎΡΡΠΎΡΡΠΈΡΡΠ΅ΠΌ Π΄Π°ΡΠ°ΡΠ΅Ρ: ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡ, Π° ΠΏΠΎΡΠΎΠΌ ΠΏΠΎ ΠΌΠ΅ΡΡΡΡ Π² ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΡΠΎΡΠΎΠ½Ρ dfs = filtered_alldf.sort_values(by=['client', "date_month"], ascending=[True, False]) Π£Π±ΠΈΡΠ°Π΅ΠΌ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΡ ΡΡΡΠΎΠΊ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΠΏΠ΅ΡΠ²ΡΠΌ ΠΊΠ°Π½Π°Π»ΠΎΠΌ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Ρ Π½Π°Ρ ΠΎΡΡΠ°Π½ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΊΠ°Π½Π°Π» ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Ρ dfa = dfs.drop_duplicates(subset=['client', 'channel'], keep='first') Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° cumcount() ΠΏΡΠΎΠ½ΡΠΌΠ΅ΡΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ ΠΏΠΎ ΡΡΠΎΠ»Π±ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½ΠΎΠ²ΡΠΉ ΡΡΠΎΠ»Π±Π΅Ρ Π³Π΄Π΅ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΊΠ°Π½Π°Π» ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ°Π²Π΅Π½ 0, Π²ΡΠΎΡΠΎΠΉ 1, ΠΈ ΡΠ΄. ΠΠ°Π»ΡΡΠ΅ ΡΠΈΠ»ΡΡΡΡΠ΅ΠΌ ΡΠ°Π±Π»ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π³Π΄Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠΎΠ»Π±ΡΠ° ΡΠ°Π²Π½ΠΎ 1, Ρ.Π΅. ΡΡΡΠΎΠΊΡ Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌ ΠΊΠ°Π½Π°Π»ΠΎΠΌ ΠΈ ΠΌΠ΅ΡΡΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΠΌΠ΅Π½Ρ dfa['line'] = dfa.groupby('client').cumcount() result_df = dfa[dfa['line'] == 1] ΠΠΎΡ Π² ΡΠ΅Π»ΠΎΠΌ ΠΌΡ ΠΈ ΡΠ΅ΡΠΈΠ»ΠΈ Π·Π°Π΄Π°ΡΡ, ΠΎΡΡΠ°Π»ΠΎΡΡ Π²ΡΡ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ ΡΡΠΎΠ»Π±ΡΡ, ΡΠΌΡΡΠΆΠΈΡΡ, ΠΈ ΡΠ±ΡΠ°ΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ ΠΌΠ΅ΡΡΡΡ result_df = result_df.rename(columns={"channel": "last_channel", "date_month": "last_date_month"}) dfmain5 = pd.merge(dfmain, result_df[['client', 'last_channel', 'last_date_month']], on='client', how='left') dfmain5 = dfmain5[dfmain5['date_month'] == '7'] ΠΠΎΠ΄ Π½Π° Π³ΡΠ°ΡΠΈΠΊ Π±ΡΠ΄Π΅Ρ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ . ΠΡΠ°ΡΠΈΠΊ Π‘Π°Π½ΠΊΠ΅ΠΉ (ΡΠ°ΡΡΡ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΡΠΎΠΊΠΈ) Ρ ΠΎΡΠ΅Π½Ρ Π»ΡΠ±Π»Ρ, Π½ΠΎ ΠΎΠ½ Π½Π΅ Π½Π° Π²ΡΠ΅Ρ Π΄Π°Π½Π½ΡΡ Ρ ΠΎΡΠΎΡΠΎ ΡΠΌΠΎΡΡΠΈΡΡΡ. Π’ΡΡ ΠΏΡΡΠΌΠΎ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ Π·Π°ΡΡΠ». (ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΠ΅Π½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ Π³ΡΠ°ΡΠΈΠΊΠ° Π² ΠΏΡΠΈΠ»Π°Π³Π°Π΅ΠΌΠΎΠΌ ipynb ΡΠ°ΠΉΠ»Π΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°Ρ ) Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΡΠΎΡΠΌΠΎΡΡ, Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠΉ ΡΠΎΡΠΌΠ°Ρ Π²Π°ΠΌ ΠΏΠΎΠ½ΡΠ°Π²ΠΈΠ»ΡΡ - ΡΡΠ°Π²ΡΡΠ΅ Π»Π°ΠΉΠΊ.