当前位置: 首页 > news >正文

Python数据分析实现滚动统计

大家好,在数据分析和处理过程中,滚动统计是一种非常常见且有用的技术,尤其是在处理时间序列数据时。滚动统计可以在一个滑动窗口内计算统计量,从而捕捉数据的变化趋势。Pandas库提供了强大的窗口函数,可以轻松地进行各种滚动统计操作。本文将介绍如何使用Python Pandas的窗口函数进行滚动统计,涵盖基础概念、函数用法以及具体的代码示例,帮助更好地理解和应用这些技术。

1.窗口函数简介

窗口函数(Window Functions)是指在数据的某个子集(窗口)内应用的函数。这些函数在移动窗口中计算统计量,并返回结果。Pandas中的窗口函数主要包括rolling()expanding()ewm()等,它们分别用于滑动窗口计算、累积计算和指数加权计算。

窗口函数在许多场景中非常有用,尤其是在以下情况下:

  • 平滑数据:通过移动平均等方法,可以消除数据中的短期波动,揭示长期趋势。

  • 捕捉局部特征:滚动窗口可以帮助捕捉数据在不同时间段内的局部特征。

  • 实时数据处理:在处理实时数据时,窗口函数可以帮助我们计算滑动窗口内的实时统计量。

2.Pandas的窗口函数类型

在Pandas中,主要有三种类型的窗口函数,它们各自适用于不同的场景。rolling是滑动窗口计算,用于在固定大小的窗口内计算统计量。expanding是累积计算,随着数据量的增加,窗口逐步扩展。ewm为指数加权平均,用于给予最近的数据更高的权重。

2.1 滑动窗口函数rolling()

rolling()是最常用的窗口函数之一,它允许我们在一个固定大小的滑动窗口内计算统计量,例如移动平均、移动标准差等。

DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
  • window:窗口的大小,可以是一个整数,表示窗口的宽度。

  • min_periods:窗口中最少的观测数量,如果少于这个数量,将返回NaN。

  • center:如果为True,则窗口结果居中对齐。

  • win_type:指定窗口的权重类型,如boxcartriang等。

  • on:对于DataFrame,指定用于计算窗口的列。

  • axis:沿着哪一个轴计算,默认是0。

  • closed:定义窗口的边界是否包含起点或终点。

下面通过一个简单的示例,展示如何使用rolling()函数计算时间序列数据的移动平均。

import pandas as pd# 创建时间序列数据
data = {'date': pd.date_range(start='2023-01-01', periods=10, freq='D'),'value': [10, 20, 15, 25, 30, 40, 50, 45, 35, 25]
}
df = pd.DataFrame(data)# 设置日期列为索引
df.set_index('date', inplace=True)# 计算窗口大小为3的移动平均
df['rolling_mean'] = df['value'].rolling(window=3).mean()print(df)

在这个示例中,创建了一个包含日期和数值的时间序列数据,并使用rolling()函数计算了窗口大小为3的移动平均。结果如下:

            value  rolling_mean
date                            
2023-01-01     10           NaN
2023-01-02     20           NaN
2023-01-03     15     15.000000
2023-01-04     25     20.000000
2023-01-05     30     23.333333
2023-01-06     40     31.666667
2023-01-07     50     40.000000
2023-01-08     45     45.000000
2023-01-09     35     43.333333
2023-01-10     25     35.000000

在上面的输出中,可以看到前三行由于窗口内的数据不足,返回了NaN,从第四行开始,计算了每三个连续数据的平均值。

移动标准差是另一个常用的滚动统计量,它可以帮助了解数据在不同时间段内的波动情况。

import pandas as pd# 使用上面的示例数据
df['rolling_std'] = df['value'].rolling(window=3).std()print(df)

在这个示例中,添加了一列rolling_std,用于计算窗口大小为3的移动标准差。结果如下:

            value  rolling_mean  rolling_std
date                                         
2023-01-01     10           NaN          NaN
2023-01-02     20           NaN          NaN
2023-01-03     15     15.000000     5.000000
2023-01-04     25     20.000000     5.000000
2023-01-05     30     23.333333     7.637626
2023-01-06     40     31.666667     7.637626
2023-01-07     50     40.000000    10.000000
2023-01-08     45     45.000000     5.000000
2023-01-09     35     43.333333     7.637626
2023-01-10     25     35.000000    10.000000

可以看到,从第三行开始,rolling_std列显示了每个窗口的标准差,这有助于了解数据波动的程度。

2.2 使用expanding()进行累积统计

除了rolling(),Pandas还提供了expanding()函数,用于计算累积统计量。随着数据量的增加,expanding()函数的窗口也会逐渐扩展,直到包含所有的数据。

import pandas as pd# 使用之前的示例数据
df['expanding_mean'] = df['value'].expanding().mean()print(df)

在这个示例中,使用expanding()计算累积平均值。输出如下:

            value  rolling_mean  rolling_std  expanding_mean
date                                                         
2023-01-01     10           NaN          NaN        10.000000
2023-01-02     20           NaN          NaN        15.000000
2023-01-03     15     15.000000     5.000000        15.000000
2023-01-04     25     20.000000     5.000000        17.500000
2023-01-05     30     23.333333     7.637626        20.000000
2023-01-06     40     31.666667     7.637626        23.333333
2023-01-07     50     40.000000    10.000000        27.142857
2023-01-08     45     45.000000     5.000000        29.375000
2023-01-09     35     43.333333     7.637626        30.000000
2023-01-10     25     35.000000    10.000000        29.500000

可以看到,expanding_mean列展示了从第一行到当前行的所有数据的累积平均值。

2.3 使用ewm()进行指数加权计算

ewm()函数用于计算指数加权移动统计量,它在计算时对较新的数据赋予更高的权重。这种方法在时间序列分析中非常有用,因为它可以更加灵敏地反映数据的近期趋势。

import pandas as pd# 使用之前的示例数据
df['ewm_mean'] = df['value'].ewm(span=3, adjust=False).mean()print(df)

在这个示例中,使用ewm()计算了指数加权移动平均值。结果如下:

            value  rolling_mean  rolling_std  expanding_mean  ewm_mean
date                                                                   
2023-01-01     10           NaN          NaN        10.000000  10.000000
2023-01-02     20           NaN          NaN        15.000000  15.000000
2023-01-03     15     15.000000     5.000000        15.000000  15.000000
2023-01-04     25     20.000000     5.000000        17.500000  20.000000
2023-01-05     30     23.333333     7.637626        20.000000  25.000000
2023-01-06     40     31.666667     7.637626        23.333333  35.000000
2023-01-07     50     40.000000    10.000000        27.142857  45.000000
2023-01-08     45     45.000000     5.000000        29.375000  45.000000
2023-01-09     35     43.333333     7.637626        30.000000  40.000000
2023-01-10     25     35.000000    10.000000        29.500000  32.500000

在这个输出中,ewm_mean列显示了每一行的指数加权移动平均值,较新的数据对结果的影响更大。

3.处理缺失值

在实际数据处理中,常常会遇到缺失值(NaN)。Pandas的窗口函数能够自动处理这些缺失值,但有时需要对缺失值进行一些特殊处理。

import pandas as pd
import numpy as np# 创建包含缺失值的数据
data = {'date': pd.date_range(start='2023-01-01', periods=10, freq='D'),'value': [10, np.nan, 15, np.nan, 30, 40, np.nan, 45, 35, 25]
}
df = pd.DataFrame(data)
df.set_index('date', inplace=True)# 计算跳过缺失值的滚动平均
df['rolling_mean'] = df['value'].rolling(window=3, min_periods=1).mean()print(df)

在这个示例中,数据中包含了缺失值。通过设置min_periods=1,确保在窗口内至少有一个有效数据点时进行计算。

输出如下:

            value  rolling_mean
date                            
2023-01-01   10.0     10.000000
2023-01-02    NaN     10.000000
2023-01-03   15.0     12.500000
2023-01-04    NaN     15.000000
2023-01-05   30.0     22.500000
2023-01-06   40.0     35.000000
2023-01-07    NaN     40.000000
2023-01-08   45.0     42.500000
2023-01-09   35.0     40.000000
2023-01-10   25.0     35.000000

可以看到,滚动平均值在缺失值的情况下依然可以正常计算。

4.滚动窗口的高级用法

除了简单的统计量计算外,Pandas的rolling()函数还支持在滑动窗口内应用自定义函数。

import pandas as pd# 使用之前的示例数据
df['custom_rolling'] = df['value'].rolling(window=3).apply(lambda x: x.max() - x.min())print(df)

在这个示例中,计算了每个窗口内的最大值和最小值的差值。结果如下:

            value  rolling_mean  custom_rolling
date                                          
2023-01-01   10.0           NaN             NaN
2023-01-02    NaN           NaN             NaN
2023-01-03   15.0     12.500000             5.0
2023-01-04    NaN           NaN             NaN
2023-01-05   30.0     22.500000            20.0
2023-01-06   40.0     35.000000            25.0
2023-01-07    NaN           NaN             NaN
2023-01-08   45.0     42.500000            15.0
2023-01-09   35.0     40.000000            10.0
2023-01-10   25.0     35.000000            20.0

自定义滚动窗口函数允许在窗口内执行更复杂的计算,极大地增强了Pandas的灵活性和功能。

综上所述,本文介绍Python Pandas中的窗口函数来实现滚动统计,这是数据分析中特别重要的操作。通过rolling()expanding()ewm()等关键函数,展示如何计算移动平均、移动标准差,以及如何处理时间序列数据中的趋势变化。结合具体的代码示例,自定义滚动窗口函数,以满足更复杂的计算需求。无论是进行时间序列分析还是需要平滑数据波动,Pandas的窗口函数都能提供强大的支持,从而更加高效地处理和分析数据。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 决策树算法上篇
  • 数据结构——树(终极版)
  • 如何通过OceanBase的多级弹性扩缩容能力应对业务洪峰
  • Mac笔记本上查看/user/目录下的文件的几种方法
  • 搭建VUE前端项目流程——Node.js 、Yarn、npm、Vue、Vite、Webpack
  • 一个有趣的“苦无”测试探针笔的设计
  • Go语言开发im-websocket服务和vue3+ts开发类似微信pc即时通讯
  • jenkins入门
  • Java集合(八股)
  • 沉浸式利用自然语言无代码开发工具生成式AI产品应用(上)
  • 嵌入式软件工程师:科技浪潮中的关键角色
  • 使用iperf3测试局域网服务器之间带宽
  • 拖拽排序的实现示例demo
  • 物品识别——基于python语言
  • 人工智能GPT____豆包使用的一些初步探索步骤 体验不一样的工作
  • 345-反转字符串中的元音字母
  • Android交互
  • android图片蒙层
  • Babel配置的不完全指南
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • ES6之路之模块详解
  • Java基本数据类型之Number
  • mongodb--安装和初步使用教程
  • MySQL几个简单SQL的优化
  • Redis中的lru算法实现
  • springMvc学习笔记(2)
  • v-if和v-for连用出现的问题
  • 前端性能优化--懒加载和预加载
  • 日剧·日综资源集合(建议收藏)
  • 微信小程序--------语音识别(前端自己也能玩)
  • 译有关态射的一切
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​iOS安全加固方法及实现
  • #Z2294. 打印树的直径
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (03)光刻——半导体电路的绘制
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (Java入门)学生管理系统
  • (poj1.2.1)1970(筛选法模拟)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (函数)颠倒字符串顺序(C语言)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)setTimeout 和 setInterval 的区别
  • (转)visual stdio 书签功能介绍
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • ..回顾17,展望18
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Framework 3.5安装教程
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 设计一套高性能的弱事件机制
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化