2015-12-29 2 views
-1

У меня есть функция, сохраненная и определенная в другом скрипте под названием TechAnalisys.py Эта функция просто выводит скаляр, поэтому я планирую использовать pd.rolling_apply() для создания новый столбец в исходный dataframe (df). Функция работает нормально, когда выполняется, но у меня проблемы при использовании приложения rolling_apply(). Эта ссылка Passing arguments to rolling_apply показывает, как вы должны это делать, и именно так я считаю, что это мой код, но он по-прежнему отображается ошибка «TypeError: int object is is iterable»pandas 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

Если вы проверяете type из df в функции 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] 
+0

благодарит за ответ! – Gabriel

Смежные вопросы