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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top