循环遍历时间序列数据并收集特定时间范围 window 保持运行时间 O(N)
Loop through time series data and collect specific timeframe window keeping the runtime O(N)
我正在尝试遍历一个时间序列数据帧,在特定时间,我需要返回 5 分钟和 10 分钟(需要确保我也不会因为多重共线性而过度计算数据)并检查是否满足条件。下面是我写的代码,我希望它在 O(N) 中并且不必进行两个循环。我正在考虑以某种方式保存索引以保存 space 但这里需要帮助。
提前致谢
我不完全确定你的代码中发生了什么,但我相信它可以用一个前向传递来代替。假设您的数据已排序。
last_short = filldata['time'][0] - np.timedelta64(9,'ms')
last_long = filldata['time'][0] - np.timedelta64(9,'ms')
for row in fillData.itertuples():
if row.fill == 1:
last_short = row.time + np.timedelta64(250,'ms')
last_long = row.time + np.timedelta64(3, 'm')
#filldata['250 mili'][row.Index] = 1 #you might want this line
else:
if row.time <= last_short:
filldata['250 mili'][row.Index] = 1
elif row.time <= last_long:#if\elif your choice
filldata['6 min'][row.Index] = 1
或者您可以使用数据框的 rolling
方法。
这是否符合您的要求:
fillData.set_index('time', drop=True, inplace=True)
condition = fillData.fill.eq(1)
fillData['500 milli'] = (condition.rolling(pd.Timedelta('500ms'))
.agg(any)
.astype(int))
fillData['6 minutes'] = (condition.rolling(pd.Timedelta('6m'))
.agg(any)
.astype(int))
fillData['6 minutes'][fillData['500 milli'].eq(1)] = 0
fillData.reset_index(drop=False, inplace=True)
我不确定 fillData
是如何排序的。我的假设是排序是升序的(及时)。不然就得反了。
我正在尝试遍历一个时间序列数据帧,在特定时间,我需要返回 5 分钟和 10 分钟(需要确保我也不会因为多重共线性而过度计算数据)并检查是否满足条件。下面是我写的代码,我希望它在 O(N) 中并且不必进行两个循环。我正在考虑以某种方式保存索引以保存 space 但这里需要帮助。
提前致谢
我不完全确定你的代码中发生了什么,但我相信它可以用一个前向传递来代替。假设您的数据已排序。
last_short = filldata['time'][0] - np.timedelta64(9,'ms')
last_long = filldata['time'][0] - np.timedelta64(9,'ms')
for row in fillData.itertuples():
if row.fill == 1:
last_short = row.time + np.timedelta64(250,'ms')
last_long = row.time + np.timedelta64(3, 'm')
#filldata['250 mili'][row.Index] = 1 #you might want this line
else:
if row.time <= last_short:
filldata['250 mili'][row.Index] = 1
elif row.time <= last_long:#if\elif your choice
filldata['6 min'][row.Index] = 1
或者您可以使用数据框的 rolling
方法。
这是否符合您的要求:
fillData.set_index('time', drop=True, inplace=True)
condition = fillData.fill.eq(1)
fillData['500 milli'] = (condition.rolling(pd.Timedelta('500ms'))
.agg(any)
.astype(int))
fillData['6 minutes'] = (condition.rolling(pd.Timedelta('6m'))
.agg(any)
.astype(int))
fillData['6 minutes'][fillData['500 milli'].eq(1)] = 0
fillData.reset_index(drop=False, inplace=True)
我不确定 fillData
是如何排序的。我的假设是排序是升序的(及时)。不然就得反了。