我在 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
我正在尝试计算和之间的皮尔逊相关因子,tp
并device_tp
使用滚动时间窗口对每个数据应用动态时间规整算法(使用 fastdtw)。对于每个样本,我回顾过去 12 小时并计算相关因子和距离。
我知道 pandas 作为一个滚动函数,但是,它不返回一个数据帧,而是一个系列(或一个数组?)。问题是相关因子和fastdtw都需要两个参数才能工作:df.tp
和df.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 内置函数的东西,但真的不知道该怎么做。
感谢您的帮助!