Python 具有多列的滚动时间窗口自定义函数

Python 具有多列的滚动时间窗口自定义函数,python,pandas,rolling-computation,dtw,Python,Pandas,Rolling Computation,Dtw,我在熊猫数据框中有timeseries数据,如下所示: 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 4ktpj

我在熊猫数据框中有timeseries数据,如下所示:

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
我试图计算
tp
device\u tp
之间的皮尔逊相关系数,并使用滚动时间窗口对每个数据应用动态时间扭曲算法(使用fastdtw)。对于每个样本,我回顾过去12小时,计算相关系数和距离

我知道pandas是一个滚动函数,但是,它不返回数据帧,而是返回一个序列(或数组?)。问题是相关因子和fastdtw都需要两个参数才能工作:
df.tp
df.device\u 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)
对于键,在df.iterrows()中表示:
现在=测量
开始日期=现在-局部时间增量(小时=12)
新df=df[(df['ts']>=开始日期)和(df['ts']<现在)]
如果(新形状[0]>1):
tp=df.tp.values
设备\u tp=df.device\u tp.values
距离,u=fastdtw(df['tp'],df['device_tp'])
corr=stats.pearsonr(tp,device_tp)[0]
# ... 这里有国旗
如果(标志==0):
输出=输出。追加(meas)
但当然,这真的不节省时间!我还想知道有什么更好的方法可以做到这一点?我读了一些关于重新定义滚动函数而不是使用pandas内置函数的资料,但我真的不知道如何做到这一点


谢谢你的帮助

好的,因此获得窗口相关性的有效方法是
df[“device\u tp”].rolling(12,min\u periods=2).corr(other=df[“tp”])

我也无法想出一种直接的方法来获得DTW距离。 有一种解决方案可以让我获得大约8倍的加速比,那就是滚动索引的
pd.系列
,并将结果索引与
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时为常数(以便使用指数)。如果不是这样的话,你需要调整它。

我对这个主题不太熟悉,但是我知道
df[“device_tp”]。滚动(12,min_periods=2)。corr(other=df[“tp”])
相关部分的帮助?@SamProell是的,这是用于相关的,谢谢。由于有了这个帮助,我仍然在努力寻找其他函数。我只需将创建索引的方式更改为:
index=pd.Series(range(0,df.shape[0])
。其余的工作正常。我也使用同样的函数来计算滚动相关性。如果我使用内置Pandas
rolling.corr
,我会有一些SciPy中没有的NaN值。找不到原因。。。