首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫OHLC的OHLC数据聚合

熊猫OHLC的OHLC数据聚合
EN

Stack Overflow用户
提问于 2016-03-25 15:32:17
回答 5查看 44.1K关注 0票数 45

据我所知,OHLC重新抽样Pandas中的时间序列数据,使用一列数据,将完美地工作,例如在以下数据方面:

代码语言:javascript
复制
>>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切片,因此,如果我的数据是格式的:

代码语言:javascript
复制
             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,如下所示:

代码语言:javascript
复制
                     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年前的事了,所以我希望有一些进展。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-25 15:52:24

这与您所链接的答案相似,但它更简洁、更快,因为它使用优化的聚合,而不是lambdas。

请注意,resample(...).agg(...)语法要求熊猫版本0.18.0

代码语言:javascript
复制
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
票数 78
EN

Stack Overflow用户

发布于 2018-03-31 20:02:24

在新版本的熊猫中,您需要使用OrderedDict来保持行顺序,如下所示:

代码语言:javascript
复制
import pandas as pd
from collections import OrderedDict

df['ctime'] = pd.to_datetime(df['ctime'], unit='s')
df = df.set_index('ctime')
df = df.resample('5Min').agg(
    OrderedDict([
        ('open', 'first'),
        ('high', 'max'),
        ('low', 'min'),
        ('close', 'last'),
        ('volume', 'sum'),
    ])
)
票数 11
EN

Stack Overflow用户

发布于 2019-09-02 04:25:34

给出包含价格和金额列的数据

代码语言:javascript
复制
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()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36222928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档