首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >滚动每周技术指标使用塔利班,蟒蛇和熊猫。

滚动每周技术指标使用塔利班,蟒蛇和熊猫。
EN

Stack Overflow用户
提问于 2015-10-29 19:58:48
回答 1查看 1.8K关注 0票数 2

*更新了问题,更好的代码示例,现在用列表理解来完成它*

我试着每周用熊猫和泰利来获得技术指标。

所谓“每周滚动”,我的意思是,如果今天是星期四,那么今天的ADX每周价值将仅使用本周四、前一个星期四等等计算。之前的ADX在每周ADX系列中只使用星期三等计算。所以现在,有一天过去了,我们站在星期五,只应该用星期五来计算每周的ADX。最后,ADX系列就是附加在一个系列中的所有这些ADX。

目前,我使用一个列表理解,它生成5个列表在"adxs_list“中,每个列表是一周中的一天。例如,adxs_list显示仅用星期一计算的talib.ADX值,adxs_list1,显示仅用星期二计算的talib.ADX值,等等。

现在,当我试图将这些列表放回原始的dataframe时,我陷入了困境。试图把它们混在一起,然后把它们添加到DataFrame中,但却搞不清楚.

因此,问题是,如何才能将这些计算重新加入到原始数据中,尊重df的索引?

代码语言:javascript
复制
import pandas as pd
import numpy as np
import talib

df  = pd.DataFrame(np.random.randn(1000,4),
    index=pd.date_range(pd.datetime(2000,3,30), freq='B', periods=1000),
    columns =['PX_OPEN', 'PX_LAST', 'PX_HIGH', 'PX_LOW'] )

lista4 = ['W-MON','W-TUE','W-WED','W-THU','W-FRI']

adxs_list = [([talib.ADX(df['PX_HIGH'].resample(w).values, 
                      df['PX_LOW'].resample(w).values, df['PX_LAST'].resample(w).values
                      , timeperiod=3)]) for w in lista4]

试图用以下方法来做:

代码语言:javascript
复制
adxs_frame = reduce(pd.DataFrame.combine_first,adxs_list)

并得到了以下错误:

TypeError:必须以DataFrame实例作为第一个参数调用未绑定方法combine_first() (改为got列表实例)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-02 14:20:23

最后,我想我想明白了。必须转置,然后重新分配原来的索引。不确定这是否是最快的方法,但如下所示:

代码语言:javascript
复制
import pandas as pd
import numpy as np
import talib

df  = pd.DataFrame(np.random.randn(100,4),
    index=pd.date_range(pd.datetime(2000,3,30), freq='B', periods=100),
    columns =['PX_OPEN', 'PX_LAST', 'PX_HIGH', 'PX_LOW'] )


lista3 = ['PX_OPEN', 'PX_LAST', 'PX_HIGH', 'PX_LOW']
lista4 = ['W-MON','W-TUE','W-WED','W-THU','W-FRI']
i0=[]
i1=[]
i2=[]
i3=[]
i4=[]

adxs_list = [([talib.ADX(df['PX_HIGH'].resample(w).values, 
                      df['PX_LOW'].resample(w).values, df['PX_LAST'].resample(w).values
                      , timeperiod=3)]) for w in lista4]

    # transposing the arrays and assigning them the original index of that week day
for u,v in [(u,v) for u,v in zip(range(5),lista4)]:    
    r = "i{0} = pd.DataFrame(adxs_list[{0}]).transpose().set_index(df.PX_OPEN.resample('{1}').index)".format(u,v)    
    exec r

    # combining all the new dataframes into a single dataframe (respecting their indexes)
y0 = [i0, i1, i2, i3, i4]   
i_frame = reduce(pd.DataFrame.combine_first, y0)

    # merging this new dataframe into the original df
df = df.merge(i_frame, left_index=True, right_index=True)

    # for some strange reason new column is named 0, so renaming it 
names = df.columns.values
names[-1] = 'ADX_w'
df.columns = names
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33423495

复制
相关文章

相似问题

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