DataFrame 的rolling()函数
rolling参数
DataFrame.rolling(window,
min_periods=None,
center=False,
win_type=None,
on=None,
axis=0,
closed=None)
-
window:表示时间窗口的大小;可省略不写。两种形式:int和offset。如果使用int,数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗口的大小
-
min_periods:每个窗口内最少包含的观测值的数量,如果小于这个值的窗口,则结果为
NA
。值可以是int
,默认None
。offset
情况下,默认为1。offset类型是专门针对时间类型 -
center: 把窗口的标签设置为居中。布尔类型,默认
False
,向右对齐。 -
win_type:窗口的类型。截取窗的各种函数。字符串类型,默认为
None
。 -
on:可选参数;对于
dataframe
而言,指定要计算滚动窗口的列,值可以是dataframe
中的列名。 -
axis:
int
或者字符串;如果是0或者index,则按照行进行计算,如果是1或者columns,则按照列进行计算。默认是0
,即对列进行计算 -
closed:用于定义区间的开闭,支持int类型的窗口window。对于offset类型默认是
左开右闭
,即默认为right
,也可以根据具体的情况指定为left、both
等.
统计相关函数
一般在使用了移动窗口函数rolling之后,我们需要配合使用相关的统计函数,比如sum、mean、max等。使用最多的是mean函数,生成移动平均值。下面汇总了常用的统计相关函数:
方法 | 描述 |
---|---|
count() | 统计非空数量 |
sum() | 求和 |
mean() | 求均值 |
median() | 求中位数 |
min() | 最小值 |
max() | 最大值 |
std() | 求标准差 |
var() | 有偏方差 |
skew() | 偏度 |
kurt() | 峰度 |
quantile() | 求四分位数 |
apply() | apply函数使用 |
cov() | 无偏方差 |
corr() | 相关系数 |
异常值处理
使用滑动窗口方法计算异常值的周围均值、中值或其他统计量,将异常值替换为滑动窗口内的均值或中值。例如,使用一个固定大小的窗口,在窗口内计算统计量,并用窗口中心的统计值替换异常点。
import pandas as pd
import numpy as np
from scipy.stats import zscore
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft Yahei'] # 雅黑
plt.rcParams['axes.unicode_minus'] = False # 负号正常显示
data = pd.read_csv('data.csv')
# 计算 Z-score
data['ZScore'] = zscore(data['数量'])
# 设置阈值来识别异常值,Z-score 大于 3 的被认为是异常值
threshold = 3
# 设置异常值前后的窗口大小
window_size = 3
# 使用 rolling() 函数计算窗口内的均值 (如:前后 3 天,即 7 天窗口)
rolling_mean = data['数量'].rolling(window=2*window_size + 1, min_periods=1).mean()
rolling_mean = rolling_mean.astype(np.float64)
# 创建数据副本以保存清理后的数据
replaced_data = data.copy()
# 替换异常值为附近的平均值
for i in range(window_size, len(data) - window_size): # 遍历数据,跳过前后 window_size 天
if abs(data['ZScore'][i]) > threshold: # 如果是异常值
# 不使用rolling()
# replaced_data.loc[i, '数量'] = data['数量'][i - window_size:i + window_size + 1].mean()
replaced_data.loc[i, '数量'] = rolling_mean[i] # 用滚动窗口均值替换异常值
# 重新计算 Z-score 以确认替换后的数据
replaced_data['ZScore'] = zscore(replaced_data['数量'])
# 绘图
fig, axes = plt.subplots(1,2, figsize=(15, 6))
# # 原始数据图
axes[0].plot(data['date'], data['数量'], linestyle ='--',label = 'Original Data')
axes[0].plot(replaced_data['date'], replaced_data['数量'], color='red', label = 'Outliers Replaced')
axes[0].set_xlabel('Date')
axes[0].set_ylabel('数量')
axes[0].legend()
# # 替换后的数据图
axes[1].plot(data['ZScore'], label = 'Original Data')
axes[1].plot(replaced_data['ZScore'], color='red', label = 'Outliers Replaced')
axes[1].set_xlabel('Date')
axes[1].set_ylabel('Z-score')
axes[1].legend(loc=4)
plt.show()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人