据我所知,OHLC使用一列数据对Pandas中的时间序列数据进行重新采样将完美地运行,例如在以下数据帧上:
>>df
ctime openbid
1443654000 1.11700
1443654060 1.11700
...
df['ctime'] = pd.to_datetime(df['ctime'], unit='s')
df = df.set_index('ctime')
df.resample('1H', how='ohlc', axis=0, fill_method='bfill')
>>>
open high low close
ctime
2015-09-30 23:00:00 1.11700 1.11700 1.11687 1.11697
2015-09-30 24:00:00 1.11700 1.11712 1.11697 1.11697
...
但如果数据已经是OHLC格式,我该怎么办?根据我的收集,API的OHLC方法为每列计算OHLC切片,因此如果我的数据采用以下格式:
ctime openbid highbid lowbid closebid
0 1443654000 1.11700 1.11700 1.11687 1.11697
1 1443654060 1.11700 1.11712 1.11697 1.11697
2 1443654120 1.11701 1.11708 1.11699 1.11708
当我尝试重新采样时,我会为每个列获得一个OHLC,如下所示:
openbid highbid \
open high low close open high
ctime
2015-09-30 23:00:00 1.11700 1.11700 1.11700 1.11700 1.11700 1.11712
2015-09-30 23:01:00 1.11701 1.11701 1.11701 1.11701 1.11708 1.11708
...
lowbid \
low close open high low close
ctime
2015-09-30 23:00:00 1.11700 1.11712 1.11687 1.11697 1.11687 1.11697
2015-09-30 23:01:00 1.11708 1.11708 1.11699 1.11699 1.11699 1.11699
...
closebid
open high low close
ctime
2015-09-30 23:00:00 1.11697 1.11697 1.11697 1.11697
2015-09-30 23:01:00 1.11708 1.11708 1.11708 1.11708
有没有一个快速(ish)的解决方法,有人愿意分享,没有我不得不深入了解熊猫手册?
感谢。
ps,有这个答案 - Converting OHLC stock data into a different timeframe with python and pandas - 但它是4年前的,所以我希望有一些进展。
答案 0 :(得分:33)
这与您链接的答案类似,但它更清洁,更快,因为它使用优化的聚合,而不是lambdas。
请注意,resample(...).agg(...)
语法需要pandas版本0.18.0
。
In [101]: df.resample('1H').agg({'openbid': 'first',
'highbid': 'max',
'lowbid': 'min',
'closebid': 'last'})
Out[101]:
lowbid highbid closebid openbid
ctime
2015-09-30 23:00:00 1.11687 1.11712 1.11708 1.117
答案 1 :(得分:3)
您需要使用OrderedDict在较新版本的pandas中保持行顺序,如下所示:
import pandas as pd
from collections import OrderedDict
df['ctime'] = pd.to_datetime(df['ctime'], unit='s')
df = btceur.set_index('ctime')
df = df.resample('5Min').agg(
OrderedDict([
('open', 'first'),
('high', 'max'),
('low', 'min'),
('close', 'last'),
('volume', 'sum'),
])
)
答案 2 :(得分:0)
给出一个包含价格和金额列的数据框
def agg_ohlcv(x):
arr = x['price'].values
names = {
'low': min(arr) if len(arr) > 0 else np.nan,
'high': max(arr) if len(arr) > 0 else np.nan,
'open': arr[0] if len(arr) > 0 else np.nan,
'close': arr[-1] if len(arr) > 0 else np.nan,
'volume': sum(x['amount'].values) if len(x['amount'].values) > 0 else 0,
}
return pd.Series(names)
df = df.resample('1min').apply(agg_ohlcv)
df = df.ffill()
答案 3 :(得分:0)
这个似乎很有效,
npm install
答案 4 :(得分:0)
从OHLC到OHLC的对话对我来说是这样的:
df.resample('1H').agg({
'openbid':'first',
'highbid':'max',
'lowbid':'min',
'closebid':'last'
})