目录
1. rolling() 函数的应用
以 5 为间隔,求每个窗口内数据的标准差。
df_10min_1['tstd'] = df_10min_1['tempe'].rolling(window=5).agg([lambda x: x, np.std])
若 df 的 index 为时间格式,可以以时间作为间隔,进行 rolling,如下代码所示:
sta_all_itvl = df.rolling(t_itvl).agg([lambda x: x[0], np.ptp])
np.ptp:求最大值与最小值的差
np.ptp([1, 2, 3, 10])
Out[1]: 9
2. rolling(60)和rolling(‘60s’)有何区别
2.1 abnormal_diffs[column].rolling(60).sum()
和abnormal_diffs[column].rolling('60s').sum()
有何区别?
abnormal_diffs[column].rolling(60).sum()
和 abnormal_diffs[column].rolling('60s').sum()
这两个表达式在 pandas
的上下文中有着重要的区别,主要体现在滚动窗口的类型上:
-
abnormal_diffs[column].rolling(60).sum()
:- 这个表达式创建了一个固定大小的滚动窗口,窗口大小为60个数据点。
- 这意味着在计算滚动总和时,它会考虑当前点和之前的59个数据点(共60个点)。
- 这种方法适用于数据点间隔是均匀的情况,即每个数据点之间的时间间隔相同。
-
abnormal_diffs[column].rolling('60s').sum()
:- 这个表达式创建了一个基于时间的滚动窗口,窗口大小为60秒。
- 这意味着它会考虑当前时间点向前60秒内的所有数据点。
- 这种方法适用于数据点间隔是不均匀的情况,即每个数据点之间的时间间隔可能不同。在这种情况下,窗口内包含的数据点数量可能因时间而异。
因此,选择哪种类型的滚动窗口取决于数据特性。如果每个数据点都是以固定的时间间隔(比如每秒)记录的,那么使用固定大小的滚动窗口(rolling(60)
)是合适的。但如果数据点记录的时间间隔不均匀,那么基于时间的滚动窗口(rolling('60s')
)会是更好的选择,因为它可以确保窗口涵盖的是真实的60秒时间跨度。
2.2 使用这两个表达式时对数据的索引有要求吗
对数据的索引有一定的要求:
-
对于
abnormal_diffs[column].rolling(60).sum()
:- 这个表达式不要求数据的索引是特定类型。它只是简单地将每个连续的60个数据点作为一个窗口。
- 这种方法适用于数据点间隔均匀的情况,但它并不关心数据点的实际时间戳。
-
对于
abnormal_diffs[column].rolling('60s').sum()
:- 这个表达式要求数据的索引是时间序列型(例如
pandas.DatetimeIndex
)。这是因为它根据时间间隔(在此例中为60秒)来确定窗口的大小。 - 这种方法用于处理时间间隔不均匀的数据,能够确保每个窗口准确地覆盖指定的时间长度。因此,数据的索引必须是时间戳,以便
pandas
能够理解和计算基于时间的窗口。
- 这个表达式要求数据的索引是时间序列型(例如
综上,选择哪种滚动窗口方法取决于数据索引类型以及数据点间隔的均匀性。如果数据索引不是时间序列类型,但您希望使用基于时间的窗口,您可能需要先将数据索引转换为 DatetimeIndex
。反之,如果数据索引已经是时间序列类型,但数据点间隔非常均匀,您可以选择使用固定大小的窗口。