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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top