pandas 时间序列滑动窗口

构造序列

import matplotlib.pylab
import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randn(600, 3), index = pd.date_range('7/1/2016', freq = 'D', periods = 600), columns = ['A', 'B', 'C'])
df.plot(subplots=True)

在这里插入图片描述

滑动平均

r = df.rolling(window = 10)
#r.agg, r.apply, r.count, r.exclusions, r.max, r.median, r.name, r.quantile, r.kurt, r.cov, r.corr, r.aggregate, r.std, r.skew, r.sum, r.var
r.mean().plot(subplots=True)

在这里插入图片描述

自定义窗口内函数

除了使用 rolling 自带的函数 mean, agg, apply, count, exclusions, max, median, name, quantile 之外,还可以自定义。

比如如下 lambda 函数实现了计算窗口内的平均绝对误差:
E[∣x−E[x]∣]E[|x-E[x]|]E[xE[x]]

df.rolling(window = 10)\
.apply(lambda x: np.fabs(x - x.mean()).mean(), raw=True)\
.plot(subplots=True)

raw=True 表示 lambda 函数的输入实参为 np.ndarray,否则为 Series
下图中的所有值都大于零了
在这里插入图片描述

### 实现时间序列数据上的滑动窗口比较 为了实现时间序列数据上的滑动窗口比较,可以按照以下方式构建算法逻辑: 定义误差分析的目标窗口,在该窗口内通过均值和标准差来识别异常序列。对于远离平均值的误差(例如超过四个标准差),其索引被分类为异常。存储对应于每个异常序列的起始/结束索引对及其评分。随后移动窗口并重复此过程[^2]。 下面是一个简单的Python函数示例,用于执行基于上述原则的时间序列滑动窗口比较: ```python import numpy as np def detect_anomalies(data, window_size=30, threshold=4): anomalies = [] # 计算滚动统计量 rolling_mean = data.rolling(window=window_size).mean() rolling_std = data.rolling(window=window_size).std() # 创建一个布尔掩码表示哪些点被认为是异常值 anomaly_condition = abs((data - rolling_mean)) > (threshold * rolling_std) # 获取所有满足条件的位置 indices_of_anomalies = anomaly_condition[anomaly_condition].index for i in range(len(indices_of_anomalies)-1): start_index = indices_of_anomalies[i] # 如果连续两个异常点之间间隔不大,则认为它们属于同一段异常区间 if i+1 < len(indices_of_anomalies) and \ indices_of_anomalies[i+1]-start_index <= window_size: continue stop_index = indices_of_anomalies[i] anomalies.append({ 'start': start_index, 'end': stop_index, 'score': float(abs(data[start_index] - rolling_mean[start_index]) / rolling_std[start_index]) }) return anomalies ``` 这段代码实现了基本的时间序列滑动窗口异常检测功能。给定输入参数`data`(pandas Series),它会返回一系列字典对象组成的列表,其中包含了每一段异常区间的起点、终点以及严重程度得分。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值