2016-03-03 43 views
2

我有一个DataFramedatetime索引和价格列。我想要ohlc数据。 (开放,高,低,关闭)熊猫:获取每一行的欧元数据

我想在给定频率在每行重新采样此数据帧。

frame.resample('60S', how = 'ohlc')有效,但现在数据帧的索引间隔60秒。我想在前面60年代的每行中重新抽样。 (如果索引相隔5秒,则为12)。这样我可以为原始数据帧中的每一行提供ohlc值。

我不认为我想要做的事可能与df.resample但可能与.agg.map

我该如何获得的每个行的ohlc数据?

n = 10000 

prices = np.linspace(100.0, 103.0, n) + np.random.normal(0.0, 0.3, n) 
f = pd.DataFrame({'price': prices}, index = pd.date_range(end = datetime.utcnow(), freq = '5S', periods = n)) 

ohlcized = f.resample('60S', how = 'ohlc') # resampling doesnt work (834 != 10000) 
len(ohlcized) # 834 
len(f) # 10000 

if len(ohlcized) == len(f): 
    print "question answered" 
+0

能否请您提供一些样本数据? – Alexander

+0

完成。如果你需要我澄清更多,我可以。问题是重采样会删除行。我希望保留所有的数据,并在过去的60S数据的每一行预先形成'ohlc'操作。 –

回答

2

对于等距时间戳:

bars = 12 
df = pd.concat([f.shift(bars - 1), pd.rolling_max(f, bars), pd.rolling_min(f, bars), f], 
       axis=1) 
df.columns = ['Open', 'High', 'Low', 'Close'] 

>>> df.tail() 
            Open  High   Low  Close 
2016-03-03 19:20:49.336236 102.510446 103.603518 102.438872 102.810945 
2016-03-03 19:20:54.336236 102.916919 103.603518 102.438872 103.072880 
2016-03-03 19:20:59.336236 103.603518 103.603518 102.438872 103.290665 
2016-03-03 19:21:04.336236 102.966331 103.290665 102.438872 103.095781 
2016-03-03 19:21:09.336236 102.438872 103.409546 102.438872 103.409546 
+0

rolling_min和rolling_max应该切换 –

+0

修正了上面的问题。谢谢。 – Alexander