大熊猫滚动结合两列

时间:2019-04-16 06:33:39

标签: pandas rolling-computation

我正在使用每日报价数据进行股票交易数据分析。假设有一个列是closed_price表示每日的收盘价,tick_price表示tick_price的是下午2:30。这个想法是自定义滚动窗口,以在前几天之间使用closed_price,而在当天使用tick_price。 在滑动窗口中,window [-n:-1]来自closed_price,最后一个元素window [0]来自tick_price。 处理单个列时,滚动可以做得很好。但是我找不到将两列数据组合到一个滚动对象中的方法。 我应该如何在可接受的期限内执行此操作?

我尝试了df.rolling(n).apply(func),但是在函数内部,我无法获取列信息。似乎滚动是在一个序列上迭代另一个序列,而不是逐行。 我正在阅读有关rolling和np.stride的源代码,但感到不知所措。 最后一种方法是使用for循环,但我觉得它会慢很多。

the data can be copied in jupyter and it is like:
pd.DataFrame(np.array([[3535.229 , 3547.2157],
       [3564.038 , 3554.8975],
       [3541.727 , 3549.8678],
       [3471.456 , 3453.7913],
       [3480.13  , 3480.0087]]),columns=['closed_price','tick_price'])

典型的滚动(窗口)可以在单列上完成。 但是我要做的是:

   my_rolling(3) return:
      3535.229(close)
      3564.038(close)
      3453.7913(tick)

例如,我正在实现我的rolling_sum()如下:

def rolling_sum(df_w,window,output_column='rolling_3_sum'):
    df=df_w.copy()
    w=window
    df[output_column]=0
    index_output_column = df.columns.get_loc(output_column)
    for i in range(w-1,df.shape[0]):
        window=df.iloc[i-w+1:i+1]['closed_price'].values # get closed price window
        window[-1]=df.iloc[i]['tick_price'] # replace the latest value with tick price
        df.iat[i, index_output_column] =np.sum(window) # sum the values in window
    return df[output_column]

它现在可以正常工作,但是以这种方式,我不得不重写几乎所有的函数,例如rolling()。sum,rolling()。std()。而且有点慢。 我要实现的是rolling_func(),它返回修改后的滚动对象。如果它可以满足我上面的需求,那么我可以像这样调用它:

 rolling_func(n).sum() 
 rolling_func(n).std() 

无需大量重写。

编辑: 阅读类似的解决方案后。我尝试了以下功能:

def roll(df, w, **kwargs):
# np.dstack([df.values[i:i+w, :] for i in range(len(df.index) - w + 1)]).T
#roll_array=np.dstack([np.array(np.append(df.values[i:i+w-1,0],df.values[i+w-1:i+w,1])) for i in range(len(df.index) - w + 1)]).T
    roll_array=np.array([[np.append(df.values[i:i+w-1,0],df.values[i+w-1:i+w,1])] for i in range(len(df.index) - w + 1)])
    panel = pd.Panel(roll_array, 
                     items=df.index[w-1:],
                     major_axis=[df.columns[0]],
                     minor_axis=pd.Index(range(w), name='roll'))
    df_window=panel.to_frame().unstack().T.groupby(level=0, **kwargs)
    return df_window

目前,它既具有系统功能又具有定制功能。但是这里有一些问题: 1.返回的结果缺少窗口大小的数据,这与熊猫的滚动行为不同。它要求插入空数据以填充丢失的索引。 2.面板似乎已贬值。 3.与我写的forloops相比,运行速度没有太大差别。

我将尝试深入研究pandas roll src代码并解决此问题。

0 个答案:

没有答案