panda contano valori per ultimi 7 giorni dalla data di ciascun
Domanda
Ci sono due Dataframes. In primo luogo è come questo:
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
Nella seconda trama dati ci sono alcuni dati aggregati per mese dalla prima:
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
Sto cercando di ottenere nuova colonna DF2 denominata 'last_week_buys' con acquisti aggregati di ultimi 7 giorni dal primo giorno di ogni df1 [ 'mese']. In altre parole, voglio arrivare a questo:
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
Ci sono idee per questa colonna?
Soluzione
L'ostacolo principale è capire se una data è negli ultimi 7 giorni del mese. Mi raccomando qualcosa di hacky come il seguente:
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
Una volta che avete, è relativamente semplice per adattare il codice precedente:
df3 = df1[df1['is_buy'] == 1 && last7(df1['date'])].groupby(['id', 'month']).agg({'is_buy': np.sum})
Ora non ci resta uniscono df2
e df3
e abbiamo finito.
Altri suggerimenti
Si può anche fare qualcosa di simile:
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()
Un riferimento per affettare dati è qui: http://chris.friedline.net/2015-12-15-rutgers/lessons/python2/02-index-slice-subset.html