您的位置:首页 > 财经 > 金融 > Python数据分析实现滚动统计

Python数据分析实现滚动统计

2024/12/23 0:00:28 来源:https://blog.csdn.net/csdn1561168266/article/details/142308332  浏览:    关键词: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的窗口函数都能提供强大的支持,从而更加高效地处理和分析数据。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com