2017-07-21 3 views
2

Arbeiten mit folgendem Python-Pandas Datenrahmen df:Python Pandas berechnet durchschnittliche Anzahl der Tage zwischen Terminen

Customer_ID | Transaction_ID 
ABC   2016-05-06-1234 
ABC   2017-06-08-3456 
ABC   2017-07-12-5678 
ABC   2017-12-20-6789 
BCD   2016-08-23-7891 
BCD   2016-09-21-2345 
BCD   2017-10-23-4567 

Das Datum leider in dem TRANSACTION_ID String versteckt ist. Ich habe den Datenrahmen auf diese Weise bearbeitet.

#year of transaction 
df['year'] = df['Transaction_ID'].astype(str).str[:4] 

#date of transaction 
df['date'] = df['Transaction_ID'].astype(str).str[:10] 

#format date 
df['date']=pd.to_datetime(df['date'], format='%Y-%m-%d') 

#calculate visit number per year 
df['visit_nr_yr'] = df.groupby(['Customer_ID', 'year']).cumcount()+1 

Jetzt sieht die df wie folgt aus:

  • Was ist die durchschnittliche Anzahl der Tage zwischen den Besuchen von Besuch (so zwischen 1 & 2 und zwischen:

    Customer_ID | Transaction_ID | year | date  |visit_nr_yr 
    ABC   2016-05-06-1234 2016 2016-05-06 1    
    ABC   2017-06-08-3456 2017 2017-06-08 1    
    ABC   2017-07-12-5678 2017 2017-07-12 2    
    ABC   2017-12-20-6789 2017 2017-12-20 3    
    BCD   2016-08-23-7891 2016 2016-08-23 1    
    BCD   2016-09-21-2345 2016 2016-09-21 2    
    BCD   2017-10-23-4567 2017 2017-10-23 1    
    

    ich folgendes berechnen müssen 2 & 3)

  • Wie hoch sind die durchschnittlichen Tage zwischen den Besuchen im Allgemeinen

Zuerst möchte ich die folgende Spalte „days_between_visits_by Jahr“ schließen (Mathematik durch Customer_ID getan werden):

Customer_ID|Transaction_ID |year| date  |visit_nr_yr|days_bw_visits_yr 
ABC   2016-05-06-1234 2016 2016-05-06 1    NaN 
ABC   2017-06-08-3456 2017 2017-06-08 1    NaN 
ABC   2017-07-12-5678 2017 2017-07-12 2    34 
ABC   2017-12-20-6789 2017 2017-12-20 3    161 
BCD   2016-08-23-7891 2016 2016-08-23 1    NaN 
BCD   2016-09-21-2345 2016 2016-09-21 2    29 
BCD   2017-10-23-4567 2017 2017-10-23 1    NaN 

Bitte beachten Sie, dass ich 0s absichtlich vermieden und die Nans gehalten, falls jemand hatte zwei Besuche am selben Tag.

Als nächstes möchte ich die durchschnittlichen Tage zwischen Besuchen von besuchen (also zwischen 1 & 2 und zwischen 2 & 3 innerhalb eines Jahres) berechnen. Suche nach dieser Ausgabe: mit

output: 203.8 
#the days between visits are 398,34,161,29,397 and the average of those 
numbers is 203.8 

Ich bin fest an der, wie die Spalte „days_bw_visits_yr“ zu erstellen:

avg_days_bw_visits_1_2 | avg_days_bw_visits_2_3 
31.5      161 

Schließlich habe ich die durchschnittliche Anzahl der Tage zwischen den Besuchen im Allgemeinen berechnet werden soll. Nans müssen aus der Mathematik ausgeschlossen werden.

+0

Können Sie Ihre gewünschte (Ende) Datensatz schreiben? – MaxU

+0

@MaxU, der Datenrahmen mit der Spalte days_bw_visits_yr, ist der gewünschte Enddatensatz - die beiden anderen Berechnungen werden dann für diesen Datensatz ausgeführt, aber nicht zum Datenrahmen hinzugefügt, da es sich um aggregierte Durchschnittswerte handelt. danke – jeangelj

Antwort

2

Sie können vorherigen Besuch Datum (gruppiert nach Kunde und Jahr) erhalten, indem die Spalte „Datum“ Verschiebung um 1 nach unten:

df['previous_visit'] = df.groupby(['Customer_ID', 'year'])['date'].shift() 

Von diesem Tage zwischen den Besuchen ist einfach der Unterschied:

df['days_bw_visits'] = df['date'] - df['previous_visit'] 

Mittelwert zu berechnen, konvertieren das Datum Delta Objekt innerhalb von Tagen:

df['days_bw_visits'] = df['days_bw_visits'].apply(lambda x: x.days) 

Durchschnittliche Tage b wischen Besuche:

df.groupby('visit_nr_yr')['days_bw_visits'].agg('mean') 

df['days_bw_visits'].mean() 
+0

Vielen Dank - Testen Sie diese Lösung jetzt; die Verschiebung Option klingt gut – jeangelj

+0

Ich bekomme leider die 'Dataerror: Fehlermeldung Keine numerischen Typen zu aggregieren "Ich denke, es ist mit dem Datum nicht ein Datum Typ? – jeangelj

+0

Ich habe es geschafft! Vielen Dank – jeangelj

1

Quelle DF:

In [96]: df 
Out[96]: 
    Customer_ID Transaction_ID 
0   ABC 2016-05-06-1234 
1   ABC 2017-06-08-3456 
2   ABC 2017-07-12-5678 
3   ABC 2017-12-20-6789 
4   BCD 2016-08-23-7891 
5   BCD 2016-09-21-2345 
6   BCD 2017-10-23-4567 

Lösung:

df['Date'] = pd.to_datetime(df.Transaction_ID.str[:10]) 
df['visit_nr_yr'] = df.groupby(['Customer_ID', df['Date'].dt.year]).cumcount()+1 
df['days_bw_visits_yr'] = \ 
    df.groupby(['Customer_ID', df['Date'].dt.year])['Date'].diff().dt.days 

Ergebnis:

In [98]: df 
Out[98]: 
    Customer_ID Transaction_ID  Date visit_nr_yr days_bw_visits_yr 
0   ABC 2016-05-06-1234 2016-05-06   1    NaN 
1   ABC 2017-06-08-3456 2017-06-08   1    NaN 
2   ABC 2017-07-12-5678 2017-07-12   2    34.0 
3   ABC 2017-12-20-6789 2017-12-20   3    161.0 
4   BCD 2016-08-23-7891 2016-08-23   1    NaN 
5   BCD 2016-09-21-2345 2016-09-21   2    29.0 
6   BCD 2017-10-23-4567 2017-10-23   1    NaN 
+0

Vielen Dank @MaxU; I Befolgen Sie Ihre Schritte genau, aber für die letzte Zeile für days_bw_visits_yr, bekomme ich diesen Fehler AttributeError: Kann nur .dt Accessor mit datumsgleichen Werten verwenden – jeangelj

Verwandte Themen