2015-12-29 104 views
-1

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

这是函数(位于脚本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

如果选中的dftypehurst函数中,你会看到rolling_apply并将其作为numpy.array

如果您从numpy.array内部创建DataFramerolling_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] 
+0

感谢您的回答! – Gabriel

相关问题