2016-08-03 27 views
0

Betrachten Sie einen Datenrahmen mit spärlichen temporalen Daten. Die Zeitstempel können sehr alt (z. B. vor Jahren) oder sehr neu sein.Effizientes Datensampling mit spärlichen Zeitstempeln für einen vordefinierten Datumsbereich

Als Beispiel wollen sie die folgenden Datenrahmen nehmen:

    tstamp  item_id budget 
2016-07-01 14:56:51.882649 0Szr8SuNbY 5000.00 
2016-07-20 14:57:23.856878 0Szr8SuNbY 5700.00 
2016-07-17 16:32:27.838435 0Lzu1xOM87 303.51 
2016-07-30 21:50:03.655102 0Lzu1xOM87 94.79 
2016-08-01 14:56:31.081140 0HzuoujTsN 100.00 

Sagen wir dieser Datenrahmen für jeden item_id so zu resample müssen, dass wir einen dichten Datenrahmen erhalten, die einen Datenpunkt für jeden Tag für einen vordefinierten Zeitraum, mit einer Forward füllen.

Mit anderen Worten, wenn ich die oben für das Zeitintervall

pd.date_range(date(2016,7,15), date(2016,7,31) 

Resampling soll ich:

 date  item_id budget 
    2016-07-15 0Szr8SuNbY 5000.00 
    2016-07-16 0Szr8SuNbY 5000.00 
    2016-07-17 0Szr8SuNbY 5000.00 
    ... 
    2016-07-31 0Szr8SuNbY 5000.00 
    2016-07-15 0Lzu1xOM87  NaN 
    2016-07-16 0Lzu1xOM87  NaN 
    2016-07-17 0Lzu1xOM87 303.51 
    ... 
    2016-07-31 0Lzu1xOM87 94.79 
    2016-07-15 0HzuoujTsN  NaN 
    2016-07-16 0HzuoujTsN  NaN 
    2016-07-17 0HzuoujTsN  NaN 
    ... 
    2016-07-31 0HzuoujTsN  NaN 

Beachten Sie, dass der ursprüngliche Datenrahmen enthält spärlich Zeitstempel und eine potenziell sehr hohe Zahl von einzigartigen item_id s. Mit anderen Worten, ich hoffe, eine recheneffiziente Art der Resampling dieser Daten mit täglicher Häufigkeit auf einen vordefinierten Zeitraum der Betrachtung zu finden.

Was können wir am besten in Pandas, Numpy oder Python im Allgemeinen tun?

+0

Sie können nun dieses Verzeichnis tun in 0.19 .0 (in Kürze); http://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#whatsnew-0190-enhancements-rolling-ts und siehe verlinkte Dokumente – Jeff

+0

Danke @Jeff! Ich kann die Version in 'Master' verwenden. Wie genau würden Sie dieses Problem mit 'rolling' lösen (oder eine andere Methode?) –

Antwort

1

Sie können eine groupby auf 'item_id' tun und rufen reindex auf jeder Gruppe:

# Define the new time interval. 
new_dates = pd.date_range('2016-07-15', '2016-07-31', name='date') 

# Set the current time stamp as the index and perform the groupby. 
df = df.set_index(['tstamp']) 
df = df.groupby('item_id').apply(lambda grp: grp['budget'].reindex(new_dates, method='ffill').to_frame()) 

# Reset the index to remove 'item_id' and 'date' from the index. 
df = df.reset_index() 

Eine weitere Möglichkeit ist pivot, reindex und unstack:

# Define the new time interval. 
new_dates = pd.date_range('2016-07-15', '2016-07-31', name='date') 

# Pivot to have 'item_id' columns with 'budget' values. 
df = df.pivot(index='tstamp', columns='item_id', values='budget').ffill() 

# Reindex with the new dates. 
df = df.reindex(new_dates, method='ffill') 

# Unstack and reset the index to return to the original format. 
df = df.unstack().reset_index().rename(columns={0:'budget'})