多列熊猫滚动时间窗口自定义函数

时间:2018-12-17 07:47:33

标签: python pandas rolling-computation dtw

我在pandas DataFrame中有时间序列数据,如下所示:

ts                         serial_number    device_tp       tp
2017-09-19T15:00:00.000Z    4ktpjlv     21.7760333333333    17
2017-09-19T14:00:00.000Z    4ktpjlv     19.8849833333333    16
2017-09-19T13:00:00.000Z    4ktpjlv     18.8565818181818    15
2017-09-19T12:00:00.000Z    4ktpjlv     18.7219666666667    13
2017-09-19T11:00:00.000Z    4ktpjlv     18.8341272727273    13
2017-09-19T10:00:00.000Z    4ktpjlv     18.9697833333333    14
2017-09-19T09:00:00.000Z    4ktpjlv     19.0422416666667    14

我正在尝试计算tpdevice_tp之间的皮尔逊相关因子,并使用滚动时间窗在每个数据上应用动态时间规整算法(使用fastdtw)。对于每个样本,我都会回顾过去的12小时,并计算相关因子和距离。

我知道熊猫是滚动函数,但是,它不返回数据帧,而是返回系列(或数组?)。问题在于,相关因子和fastdtw都需要两个参数才能起作用:df.tpdf.device_tp

我找到了另一种方法,使用循环来获取所需的内容:

for key, meas in df.iterrows(): 
   now = meas.ts
   start_date = now - pd.Timedelta(hours=12)
   new_df = df[(df['ts'] >= start_date) & (df['ts'] < now)]   
   if(new_df.shape[0] > 1):
       tp = df.tp.values
       device_tp = df.device_tp.values
       distance, _ = fastdtw(df['tp'], df['device_tp'])
       corr = stats.pearsonr(tp, device_tp)[0]
       # ... Predict flag here
       if(flag == 0):
           output = output.append(meas)

但是,这当然不是很节省时间!我也想知道有什么更好的方法吗?我读了一些有关重新定义滚动功能的内容,而不是使用内置的pandas,但是我真的看不到该怎么做。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

好的,所以获取窗口相关性的有效方法是df["device_tp"].rolling(12, min_periods=2).corr(other=df["tp"])

我也无法想到直接获得DTW距离的方法。 使我的速度提高8倍左右的一种解决方案是滚动pd.Series索引,然后将结果索引与Rolling.apply一起使用:

from fastdtw import fastdtw 
def rolling_dtw(df, win=12, center=False, min_periods=2,
                col0="ts", col1="A", col2="B"):
    indices = df[col0]
    a = df[col1].values
    b = df[col2].values
    def rolldist(inds):  # calculate DTW for current indices
        inds = inds.astype(int)  # manual type-cast is needed here
        return fastdtw(a[inds], b[inds])[0]

    return indices.rolling(win, center=center,
                           min_periods=min_periods).apply(rolldist)

但是该解决方案也不是很漂亮。假定数据点之间的距离恒定为1h(以便使用索引)。如果不是这种情况,则需要进行调整。