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,默认Noneoffset情况下,默认为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()

posted @   华小电  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示