← Π”Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΠ² Π΄Π°Π½Π½Ρ‹Ρ…
Π”Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΠ² Π΄Π°Π½Π½Ρ‹Ρ… avatar

TGINSIGHT POST

Post #232

@detective_data

Π”Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΠ² Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Ρ‹2,880ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ просмотров
ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½23 июл.23.07.2024, 18:24
Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ поста

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅

🐍 ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° Π² ΠΊΠ°Π½Π°Π» ΠΈ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° Π‘Π°Π½ΠΊΠ΅ΠΉ #ΠΊΠΎΠ΄ΠΈΠΌΠΏΠΈΡ‚ΠΎΠ½ΠΈΠΌ ΠΠ°ΡΠΌΠΎΡ‚Ρ€Π΅Π²ΡˆΠΈΡΡŒ Π½Π° Π’Π°Π»Π΅Ρ€ΠΈΡŽ с ΠΊΠ°Π½Π°Π»Π° "ΠœΠΈΡ€ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…" Ρ€Π΅ΡˆΠΈΠ» Ρ‚ΠΎΠΆΠ΅ пСриодичСски ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΈΡ… Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… Π·Π°Π΄Π°Ρ‡Π°Ρ… Π½Π° ΠΏΠΈΡ‚ΠΎΠ½Π΅ ΠΈ способС ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Π’ коммСнтариях Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π»ΠΎΠΆΠ΅Π½ питоновский Ρ„Π°ΠΉΠ» Ρ‡ΡƒΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ коммСнтариями Π² ΠΊΠΎΠ΄Π΅ Π‘Ρ‹Π»Π° поставлСна Π·Π°Π΄Π°Ρ‡Π° ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ мСняли ΠΊΠ°Π½Π°Π» ΠΏΡ€ΠΎΠ΄Π°ΠΆ, ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ мСсяцС. БСйчас посмотрим Π° Ρ‚Π°ΠΊ-ΠΆΠ΅ построим Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ Π‘Π°Π½ΠΊΠ΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ, ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΠΊΠ°Π½Π°Π»Π° ΠΊΡƒΠ΄Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ (Π° бонусом ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠΌ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ Π² Π³ΠΎΠ½ΠΎΡ‡Π½Ρ‹ΠΉ Ρ‚Ρ€Π΅ΠΊ 😁 ) Π˜Ρ‚Π°ΠΊ прСдставим Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ датасСт, со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ - ΠΊΠ»ΠΈΠ΅Π½Ρ‚ - ΠΊΠ°Π½Π°Π» - ΠΈ мСсяц - ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Ρ‡Ρ‚ΠΎ Ρƒ нас Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° Π·Π° ΠΏΠΎΠ» Π³ΠΎΠ΄Π° Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ датасСт для Ρ€Π°Π±ΠΎΡ‚Ρ‹: 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 Ρ„Π°ΠΉΠ»Π΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ…) Бпасибо Π·Π° просмотр, Ссли Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Π°ΠΌ понравился - ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π»Π°ΠΉΠΊ.