2017-01-17 1 views
1

Ich habe folgende Datenrahmen verwenden, eine wöchentliche Preisdaten timeserie mit einem Zeitraum Index. Nennen wir es dfResampling/Upsample Zeitraum Index und beide extreme Zeit „Kanten“ der Daten

      timestamp   open  high  low  close volume 
timestamp      
2009-02-01/2009-02-07 733442.166309 830.540773 832.586910 828.788627 830.706009 48401.952790 
2009-02-08/2009-02-14 733449.166309 839.945279 841.763948 837.812232 839.742489 53429.330472 
2009-02-15/2009-02-21 733456.245777 790.733108 792.399775 788.897523 790.549550 50671.887387 
2009-02-22/2009-02-28 733463.166309 760.586910 762.640558 758.234979 760.428112 60565.506438 

Wenn ich versuche, es zu sampeln df.resample('30min').mean() mit den Daten an 2009-02-22 endet. Ich möchte, dass es bei 2009-02-28 endet, während immer noch bei 2009-02-01 gestartet wird. Wie kann ich das machen?
Ich vermute, es hat mit den closed und label Werte der resample Funktion zu tun, aber die sind nicht sehr gut in der doc erklärt.

Hier ein Ausschnitt der Datenrahmen zu rekonstruieren:

import pandas as pd 
from pandas import Period 
dikt={'volume': {Period('2009-02-01/2009-02-07', 'W-SAT'): 48401.952789699571, Period('2009-02-08/2009-02-14', 'W-SAT'): 53429.330472103007, Period('2009-02-15/2009-02-21', 'W-SAT'): 50671.887387387389, Period('2009-02-22/2009-02-28', 'W-SAT'): 60565.506437768243}, 'close': {Period('2009-02-01/2009-02-07', 'W-SAT'): 830.70600858369096, Period('2009-02-08/2009-02-14', 'W-SAT'): 839.74248927038627, Period('2009-02-15/2009-02-21', 'W-SAT'): 790.54954954954951, Period('2009-02-22/2009-02-28', 'W-SAT'): 760.42811158798281}, 'open': {Period('2009-02-01/2009-02-07', 'W-SAT'): 830.54077253218884, Period('2009-02-08/2009-02-14', 'W-SAT'): 839.94527896995703, Period('2009-02-15/2009-02-21', 'W-SAT'): 790.73310810810813, Period('2009-02-22/2009-02-28', 'W-SAT'): 760.58690987124464}, 'high': {Period('2009-02-01/2009-02-07', 'W-SAT'): 832.58690987124464, Period('2009-02-08/2009-02-14', 'W-SAT'): 841.76394849785413, Period('2009-02-15/2009-02-21', 'W-SAT'): 792.39977477477476, Period('2009-02-22/2009-02-28', 'W-SAT'): 762.64055793991417}, 'low': {Period('2009-02-01/2009-02-07', 'W-SAT'): 828.78862660944208, Period('2009-02-08/2009-02-14', 'W-SAT'): 837.8122317596567, Period('2009-02-15/2009-02-21', 'W-SAT'): 788.89752252252254, Period('2009-02-22/2009-02-28', 'W-SAT'): 758.23497854077254}, 'timestamp': {Period('2009-02-01/2009-02-07', 'W-SAT'): 733442.16630901292, Period('2009-02-08/2009-02-14', 'W-SAT'): 733449.16630901292, Period('2009-02-15/2009-02-21', 'W-SAT'): 733456.24577702698, Period('2009-02-22/2009-02-28', 'W-SAT'): 733463.16630901292}} 
pd.DataFrame(dikt, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) 

Antwort

1

Da Sie die start_time entsprechend dem ersten PeriodIndex und end_time entsprechend dem letzten, die Schlüsselwort-Argumente in DF.resample wäre wenig hilfreich aufnehmen möchten hier, da diese als ganze/gegenseitig aus in der Natur betreiben (dh jede Änderung arg beeinträchtigen würde entweder die start_time oder end_time aber nicht beides).

Stattdessen können Sie diese auf die Tagesfrequenz herunterrechnen, "D" und dann die Aggregation des Mittelwerts für jede Gruppe innerhalb von 30 Minuten durchführen.

df.resample('D').asfreq().resample('30T').mean() 

Die convention arg hätte verwendet werden können, wenn über Resampling start_time oder end_time waren speziell durchgeführt werden.


zu prüfen:

resamp_start = df.resample('30min').mean() 
resamp_all = df.resample('D').asfreq().resample('30T').mean().head(resamp_start.shape[0]) 
resamp_start.equals(resamp_all) 
True 

Wenn Sie nur den neu abgetastete Index erfordern und es ist nicht Aggregation, dann wäre es sinnvoll, boden Probe macht es aktuelle Frequenz auf dem niedrigste ganzzahlige Frequenz, die der Frequenz entspricht, die für [Hier, 1 minute] wiederabgetasteten werden soll und dann Scheiben jeweils 30 Zeilen nehmen th zu berechnen ist für jeden 30 Minuten Probe.

df.resample('T').asfreq().iloc[::30] 

Diese Sie für die gesamten 2009-02-28 die Proben in Bezug auf den früheren Fall verglichen würden, wo die Daten bis zu und einschließlich nicht 2009-02-28 aufgrund ihrer Normalisierung angesehen wurden (Zeiten bis Mitternacht eingestellt) während .resample('D') Betriebes auferlegt.

+0

Ja thx es funktioniert. Es ist ein bisschen verwirrend für mich, warum die Verwendung dieses mittleren Schrittes von 'D' freq das Ergebnis verändert? – Radar

+0

Der Grund für die Downsampling-Frequenz von wöchentlich war täglich, um sicherzustellen, dass wir beide den Beginn und das Ende Zeitraum Daten als Teil unserer 'DateTimeIndex' haben für uns, unsere Ergebnisse zu extrapolieren. 'asfreq()' spielt dann die Rolle, dies zu ändern und Lücken für fehlende Daten zu füllen. –

+0

Die Verwendung der '.asfreq()' Methode für das Resampling von Perioden wird in den Dokumenten auch etwas erwähnt. Lesen Sie: http://pandas.pydata.org/pandas-docs/stable/timeseries.html # frequency-conversion-and-resampling-with-periodindex –

Verwandte Themen