Pandas zählen Werte für die letzten 7 Tage ab jedem Datum
Frage
Es gibt zwei Datenrahmen. Erstens ist so:
print df1
id date month is_buy
0 17 2015-01-16 2015-01 1
1 17 2015-01-26 2015-01 1
2 17 2015-01-27 2015-01 1
3 17 2015-02-11 2015-02 1
4 17 2015-03-14 2015-03 1
5 18 2015-01-28 2015-01 1
6 18 2015-02-12 2015-02 1
7 18 2015-02-25 2015-02 1
8 18 2015-03-04 2015-03 1
Im zweiten Datenrahmen gibt es einige aggregierte Daten nach Monat aus dem ersten:
df2 = df1[df1['is_buy'] == 1].groupby(['id', 'month']).agg({'is_buy': np.sum})
print df2
id month buys
0 17 2015-01 3
1 17 2015-02 1
2 17 2015-03 1
3 18 2015-01 1
4 18 2015-02 2
5 18 2015-03 1
Ich versuche, eine neue DF2 -Spalte namens 'last_week_buys' mit aggregierten Käufen bis zu den letzten 7 Tagen ab dem ersten Tag jedes DF1 ['Monat'] zu erhalten. Mit anderen Worten, ich möchte Folgendes bekommen:
id month buys last_week_buys
0 17 2015-01 3 NaN
1 17 2015-02 1 2
2 17 2015-03 1 0
3 18 2015-01 1 NaN
4 18 2015-02 2 1
5 18 2015-03 1 1
Gibt es Ideen, um diese Kolumne zu erhalten?
Lösung
Das Haupthindernis besteht darin, herauszufinden, ob ein Datum innerhalb der letzten 7 Tage des Monats liegt. Ich würde etwas Hacky wie Folgendes empfehlen:
from datetime import datetime, date, timedelta
def last7(datestr):
orig = datetime.strptime(datestr,'%Y-%m-%d')
plus7 = orig+timedelta(7)
return plus7.month != orig.month
Sobald Sie das haben, ist es relativ einfach, Ihren vorherigen Code anzupassen:
df3 = df1[df1['is_buy'] == 1 && last7(df1['date'])].groupby(['id', 'month']).agg({'is_buy': np.sum})
Jetzt schließen wir uns einfach zusammen df2
und df3
Und wir sind fertig.
Andere Tipps
Sie können auch so etwas tun:
patterns = df [['Total','Date']]
patterns = purchase_patterns.set_index("Date")
resample = patterns.resample ('D' , how = sum)
#to extract the last items of the list
last_7 = resample[-7:]
# and to get the total
last_7 = resample[-7:].sum()
Eine Referenz für das Datenschneiden ist hier: http://chris.friedline.net/2015-12-15-rutgers/lessons/python2/02-index-slice-subset.html