pandas rolling_apply TypeError:int对象不可迭代“

时间:2015-12-29 17:33:50

标签: python pandas

我在一个名为 TechAnalisys.py 的不同脚本中保存并定义了一个函数。这个函数只输出一个标量,所以我打算用pd.rolling_apply()生成一个新的原始列。 dataframe(df)。 该函数在执行时工作正常,但在使用rolling_apply()应用程序时遇到问题。此链接Passing arguments to rolling_apply显示了您应该如何操作,这就是我认为我的代码是如何但它仍然显示错误“TypeError:int object is iterable”出现

这是函数(位于脚本TechAnalisys.py中)

def hurst(df,days):
    import pandas as pd
    import numpy as np

    df2 = pd.DataFrame()
    df2 = df[-days:]    
    rango = lambda x: x.max() - x.min()

    df2['ret'] = 1 - df.PX_LAST/df.PX_LAST.shift(1)
    df2 = df2.dropna()    
    ave = pd.expanding_mean(df2.ret)
    df2['desvdeprom'] = df2.ret - ave
    df2['acum'] = df2['desvdeprom'].cumsum()
    df2['rangorolled'] = pd.expanding_apply(df2.acum, rango)
    df2['datastd']  =   pd.expanding_std(df2.ret)
    df2['rango_rangostd'] = np.log(df2.rangorolled/df2.datastd)
    df2['tiempo1'] = np.log(range(1,len(df2.index)+1))
    df2 = df2.dropna()
    model1 = pd.ols(y=df2['rango_rangostd'], x=df2['tiempo1'], intercept=False)
    return model1.beta

现在这是主要的脚本:

import pandas as pd
import numpy as np
import TechAnalysis as ta

df  = pd.DataFrame(np.log(np.cumsum(np.random.randn(100000)+1)+1000),columns =['PX_LAST'])

以下作品:

print ta.hurst(df,50)

这不起作用:

df['hurst_roll'] = pd.rolling_apply(df, 15 , ta.hurst, args=(50))  

代码中有什么问题?

1 个答案:

答案 0 :(得分:1)

如果您在type功能中查看df的{​​{1}},则会看到hurst将其作为rolling_apply传递给numpy.array

如果您从DataFrame内的numpy.array创建rolling_apply,则可以使用。我还使用了一个更长的窗口,因为每个阵列只有15个值,但您似乎计划使用最近50天。

def hurst(df, days):
    df = pd.DataFrame(df, columns=['PX_LAST'])
    df2 = pd.DataFrame()
    df2 = df.loc[-days:, :]
    rango = lambda x: x.max() - x.min()

    df2['ret'] = 1 - df.loc[:, 'PX_LAST']/df.loc[:, 'PX_LAST'].shift(1)
    df2 = df2.dropna()

    ave = pd.expanding_mean(df2.ret)
    df2['desvdeprom'] = df2.ret - ave
    df2['acum'] = df2['desvdeprom'].cumsum()
    df2['rangorolled'] = pd.expanding_apply(df2.acum, rango)
    df2['datastd']  =   pd.expanding_std(df2.ret)
    df2['rango_rangostd'] = np.log(df2.rangorolled/df2.datastd)
    df2['tiempo1'] = np.log(range(1, len(df2.index)+1))
    df2 = df2.dropna()
    model1 = pd.ols(y=df2['rango_rangostd'], x=df2['tiempo1'], intercept=False)
    return model1.beta

def rol_apply():

    df = pd.DataFrame(np.log(np.cumsum(np.random.randn(1000)+1)+1000), columns=['PX_LAST'])
    df['hurst_roll'] = pd.rolling_apply(df, 100, hurst, args=(50, ))


      PX_LAST  hurst_roll
0    6.907911         NaN
1    6.907808         NaN
2    6.907520         NaN
3    6.908048         NaN
4    6.907622         NaN
5    6.909895         NaN
6    6.911281         NaN
7    6.911998         NaN
8    6.912245         NaN
9    6.912457         NaN
10   6.913794         NaN
11   6.914294         NaN
12   6.915157         NaN
13   6.916172         NaN
14   6.916838         NaN
15   6.917235         NaN
16   6.918061         NaN
17   6.918717         NaN
18   6.920109         NaN
19   6.919867         NaN
20   6.921309         NaN
21   6.922786         NaN
22   6.924173         NaN
23   6.925523         NaN
24   6.926517         NaN
25   6.928552         NaN
26   6.930198         NaN
27   6.931738         NaN
28   6.931959         NaN
29   6.932111         NaN
..        ...         ...
970  7.562284    0.653381
971  7.563388    0.630455
972  7.563499    0.577746
973  7.563686    0.552758
974  7.564105    0.540144
975  7.564428    0.541411
976  7.564351    0.532154
977  7.564408    0.530999
978  7.564681    0.532376
979  7.565192    0.536758
980  7.565359    0.538629
981  7.566112    0.555789
982  7.566678    0.553163
983  7.566364    0.577953
984  7.567587    0.634843
985  7.568583    0.679807
986  7.569268    0.662653
987  7.570018    0.630447
988  7.570375    0.659497
989  7.570704    0.622190
990  7.571009    0.485458
991  7.571886    0.551147
992  7.573148    0.459912
993  7.574134    0.463146
994  7.574478    0.463158
995  7.574671    0.535014
996  7.575177    0.467705
997  7.575374    0.531098
998  7.575620    0.540611
999  7.576727    0.465572

[1000 rows x 2 columns]