楼主: 1414726412
590 0

[其他] 【Pandas】pandas Rolling window std [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-11-23
最后登录
2018-11-23

楼主
1414726412 发表于 2025-11-20 07:45:52 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

Pandas 2.2 窗口函数

滚动窗口函数

方法 描述
Rolling.count([numeric_only]) 用于计算滚动窗口内非空值数量的方法。
Rolling.sum([numeric_only, engine, …]) 用于计算滚动窗口内元素总和的方法。
Rolling.mean([numeric_only, engine, …]) 用于计算滚动窗口内元素平均值的方法。
Rolling.median([numeric_only, engine, …]) 用于计算滚动窗口内元素中位数的方法。
Rolling.var([ddof, numeric_only, engine, …]) 用于计算滚动窗口内元素方差的方法。
Rolling.std([ddof, numeric_only, engine, …]) 用于计算滚动窗口内元素标准差的方法。

pandas.Rolling.std() 方法描述

此方法在 pandas 中用于计算滚动窗口内元素的标准差。它返回一个与原数据形状相同的对象,其中每个元素表示对应窗口内所有非空值的标准差。

标准差是方差的平方根,也是衡量数据离散程度的一个重要统计量,其计算公式为:

\(\text{Std}(X) = \sqrt{\text{Var}(X)} = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \bar{x})^2}{n - \text{ddof}}}\)

Rolling.std()

参数说明

  • ddof: int,默认为1。
    Delta Degrees of Freedom,自由度调整参数。默认为1,表示计算样本标准差(除以 \(n-1\))。若设置为0,则计算总体标准差(除以 \(n\))。
  • numeric_only: bool,默认为False。
    如果为 True,则只对数值类型的列进行标准差计算。如果为 False(默认),则对所有列进行标准差计算(非数值列会产生错误)。
  • engine: str,默认为None。
    计算引擎,可选 'cython' 或 'numba'。None 表示使用默认引擎。
  • engine_kwargs: dict,默认为None。
    传递给计算引擎的额外参数。
ddof
numeric_only
engine_kwargs

返回值

返回与原始对象相同维度的对象,其中每个值表示当前窗口内所有非空元素的标准差。

使用示例

import pandas as pd
import numpy as np

# 示例1: Series基本用法
print("=== 示例1: Series基本用法 ===")
data = pd.Series([1, 2, 3, 4, 5, 6, 7])
print("原始数据:")
print(data)
print()
rolling_std = data.rolling(window=3).std()
print("窗口大小为3的滚动标准差 (ddof=1):")
print(rolling_std)
print()
rolling_std_ddof0 = data.rolling(window=3).std(ddof=0)
print("窗口大小为3的滚动标准差 (ddof=0):")
print(rolling_std_ddof0)
print()

# 示例2: 包含NaN值的情况
print("=== 示例2: 包含NaN值的情况 ===")
data_with_nan = pd.Series([1, 2, np.nan, 4, 5, 6, 7])
print("包含NaN的原始数据:")
print(data_with_nan)
print()
rolling_std_nan = data_with_nan.rolling(window=3).std()
print("窗口大小为3的滚动标准差:")
print(rolling_std_nan)
print()

# 示例3: DataFrame中的应用
print("=== 示例3: DataFrame中的应用 ===")
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': [100, 200, 300, 400, 500]
})
print("原始DataFrame:")
print(df)
print()
rolling_std_df = df.rolling(window=3).std()
print("所有列的滚动标准差(窗口大小为3):")
print(rolling_std_df)
print()

# 示例4: 使用numeric_only参数处理混合类型数据

=== 示例4: 使用numeric_only参数处理混合类型数据 ===

创建一个包含数值和非数值列的DataFrame:

df_mixed = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': ['a', 'b', 'c', 'd', 'e']
})
print("包含数值和非数值列的DataFrame:")
print(df_mixed)

尝试对整个DataFrame进行滚动标准差计算,这将导致错误,因为存在非数值列:

try:
    rolling_std_error = df_mixed.rolling(window=3).std()
    print(rolling_std_error)
except Exception as e:
    print(f"错误信息: {e}")

正确的做法是使用numeric_only=True来确保只有数值列被处理:

rolling_std_numeric = df_mixed.rolling(window=3).std(numeric_only=True)
print("仅对数值列进行滚动标准差计算:")
print(rolling_std_numeric)

=== 示例5: 不同ddof值的影响 ===

定义一个简单的数据系列,并展示其原始数据:

simple_data = pd.Series([10, 20, 30, 40, 50])
print("原始数据:")
print(simple_data)

使用不同的ddof值计算窗口大小为3的滚动标准差:

print("窗口大小为3的滚动标准差 (ddof=0):")
print(simple_data.rolling(window=3).std(ddof=0))

print("窗口大小为3的滚动标准差 (ddof=1):")
print(simple_data.rolling(window=3).std(ddof=1))

print("窗口大小为3的滚动标准差 (ddof=2):")
print(simple_data.rolling(window=3).std(ddof=2))

=== 示例6: 时间序列数据中的应用 ===

创建一个时间序列数据集,并计算3天时间窗口内的标准差:

dates = pd.date_range('2023-01-01', periods=7, freq='D')
ts_data = pd.Series([100, 200, np.nan, 400, 500, 600, 700], index=dates)
print("时间序列数据:")
print(ts_data)

rolling_ts = ts_data.rolling(window='3D').std()
print("3天时间窗口内的标准差:")
print(rolling_ts)

=== 示例7: 股票收益率波动率计算示例 ===

定义股票价格序列,计算收益率,并进一步计算5日波动率(标准差)及年化波动率:

stock_prices = pd.Series([100, 102, 98, 105, 110, 108, 112, 115, 113, 118])
returns = stock_prices.pct_change().dropna()  # 计算收益率
print("股票收益率数据:")
print(returns.round(4))

# 计算5日波动率(标准差)
volatility_5 = returns.rolling(window=5).std()
print("5日收益率标准差(波动率):")
print(volatility_5.round(6))

# 计算年化波动率
annualized_volatility = volatility_5 * np.sqrt(252)  # 假设252个交易日
print("年化波动率:")
print(annualized_volatility.round(4))

=== 示例8: std与var的关系验证 ===

创建测试数据,计算滚动方差和标准差,验证两者之间的关系:

test_data = pd.Series([1, 2, 3, 4, 5, 6, 7])
var_result = test_data.rolling(window=3).var()
std_result = test_data.rolling(window=3).std()
print("方差结果:")
print(var_result)

print("标准差结果:")
print(std_result)

print("标准差的平方是否等于方差:")

关键要点

std()

此方法计算的是每个滚动窗口内所有非空值的标准差,也就是方差的平方根。

=== 示例1: Series基本用法 ===
原始数据:
0    1
1    2
2    3
3    4
4    5
5    6
6    7
dtype: int64

窗口大小为3的滚动标准差 (ddof=1):
0    NaN
1    NaN
2    1.0
3    1.0
4    1.0
5    1.0
6    1.0
dtype: float64

窗口大小为3的滚动标准差 (ddof=0):
0    NaN
1    NaN
2    0.816497
3    0.816497
4    0.816497
5    0.816497
6    0.816497
dtype: float64

=== 示例2: 包含NaN值的情况 ===
包含NaN的原始数据:
0    1.0
1    2.0
2    NaN
3    4.0
4    5.0
5    6.0
6    7.0
dtype: float64

窗口大小为3的滚动标准差:
0    NaN
1    NaN
2    0.707107
3    1.414214
4    0.707107
5    1.000000
6    1.000000
dtype: float64

=== 示例3: DataFrame中的应用 ===
原始DataFrame:
   A   B    C
0  1  10  100
1  2  20  200
2  3  30  300
3  4  40  400
4  5  50  500

所有列的滚动标准差(窗口大小为3):
          A          B             C
0       NaN        NaN           NaN
1       NaN        NaN           NaN
2  1.000000  10.000000    100.000000
3  1.000000  10.000000    100.000000
4  1.000000  10.000000    100.000000

=== 示例4: 使用numeric_only参数处理混合类型数据 ===
包含数值和非数值列的DataFrame:
   A   B  C
0  1  10  a
1  2  20  b
2  3  30  c
3  4  40  d
4  5  50  e

错误信息: unsupported operand type(s) for +: 'int' and 'str'

仅对数值列进行滚动标准差计算:
          A          B
0       NaN        NaN
1       NaN        NaN
2  1.000000  10.000000
3  1.000000  10.000000
4  1.000000  10.000000

=== 示例5: 不同ddof值的影响 ===
原始数据:
0    10
1    20
2    30
3    40
4    50
dtype: int64

窗口大小为3的滚动标准差 (ddof=0):
0     NaN
1     NaN
2    8.164966
3    8.164966
4    8.164966
dtype: float64

窗口大小为3的滚动标准差 (ddof=1):
0    NaN
1    NaN
2  10.0
3  10.0
4  10.0
dtype: float64

窗口大小为3的滚动标准差 (ddof=2):
0   NaN
1   NaN
2   inf
3   inf
4   inf
dtype: float64

=== 示例6: 时间序列数据中的应用 ===
时间序列数据:
2023-01-01    100.0
2023-01-02    200.0
2023-01-03      NaN
2023-01-04    400.0
2023-01-05    500.0
2023-01-06    600.0
2023-01-07    700.0
Freq: D, dtype: float64

3天时间窗口内的标准差:
2023-01-01          NaN
2023-01-02    70.710678
2023-01-03    70.710678
2023-01-04   141.421356
2023-01-05   141.421356
2023-01-06    70.710678
2023-01-07    70.710678
Freq: D, dtype: float64

=== 示例7: 股票收益率波动率计算示例 ===
股票收益率数据:
1     0.0200
2    -0.0196
3     0.0714
4     0.0476
5    -0.0182
6     0.0370
7     0.0268
8    -0.0174
9     0.0442
dtype: float64

5日收益率标准差(波动率):
1         NaN
2         NaN
3         NaN
4         NaN
5    0.035855
6    0.033317
7    0.026907
8    0.026131
9    0.025111
dtype: float64

年化波动率:
1       NaN
2       NaN
3       NaN
4       NaN
5    0.5691
6    0.5288
7    0.4271
8    0.4148
9    0.3986
dtype: float64

=== 示例8: std与var的关系验证 ===
方差结果:
0    NaN
1    NaN
2    1.0
3    1.0
4    1.0
5    1.0
6    1.0
dtype: float64

标准差结果:
0    NaN
1    NaN
2    1.0
3    1.0
4    1.0
5    1.0
6    1.0
dtype: float64

标准差的平方是否等于方差:
0     True
1     True
2     True
3     True
4     True
5     True
6     True
dtype: bool

当窗口开始时,由于元素数量不足,前几个值将会是 NaN,直到窗口被完全填充。

ddof

通过参数可以控制标准差计算中的自由度,默认设置为1,代表样本标准差。此外,NaN 值会被自动忽略,不会影响其他值的标准差计算过程。

对于包含非数值列的数据集,调整参数显得尤为重要。特别是处理时间序列数据时,可以利用时间窗口(例如 '3D' 代表3天)来替代固定的观测值数量。

numeric_only

标准差在金融领域中常用来衡量资产的风险程度(即波动性),是风险管理和评估的关键指标。标准差与方差之间的数学关系为:
std = √var

最终计算的结果保持了原始数据的结构,这有助于后续的数据分析和可视化工作。

代码示例:

print(np.isclose(std_result**2, var_result))

执行结果

=== 示例1: Series基本用法 ===
原始数据:
0    1
1    2
2    3
3    4
4    5
5    6
6    7
dtype: int64

窗口大小为3的滚动标准差 (ddof=1):
0    NaN
1    NaN
2    1.0
3    1.0
4    1.0
5    1.0
6    1.0
dtype: float64

窗口大小为3的滚动标准差 (ddof=0):
0    NaN
1    NaN
2    0.816497
3    0.816497
4    0.816497
5    0.816497
6    0.816497
dtype: float64

=== 示例2: 包含NaN值的情况 ===
包含NaN的原始数据:
0    1.0
1    2.0
2    NaN
3    4.0
4    5.0
5    6.0
6    7.0
dtype: float64

窗口大小为3的滚动标准差:
0    NaN
1    NaN
2    0.707107
3    1.414214
4    0.707107
5    1.000000
6    1.000000
dtype: float64

=== 示例3: DataFrame中的应用 ===
原始DataFrame:
   A   B    C
0  1  10  100
1  2  20  200
2  3  30  300
3  4  40  400
4  5  50  500

所有列的滚动标准差(窗口大小为3):
          A          B             C
0       NaN        NaN           NaN
1       NaN        NaN           NaN
2  1.000000  10.000000    100.000000
3  1.000000  10.000000    100.000000
4  1.000000  10.000000    100.000000

=== 示例4: 使用numeric_only参数处理混合类型数据 ===
包含数值和非数值列的DataFrame:
   A   B  C
0  1  10  a
1  2  20  b
2  3  30  c
3  4  40  d
4  5  50  e

错误信息: unsupported operand type(s) for +: 'int' and 'str'

仅对数值列进行滚动标准差计算:
          A          B
0       NaN        NaN
1       NaN        NaN
2  1.000000  10.000000
3  1.000000  10.000000
4  1.000000  10.000000

=== 示例5: 不同ddof值的影响 ===
原始数据:
0    10
1    20
2    30
3    40
4    50
dtype: int64

窗口大小为3的滚动标准差 (ddof=0):
0     NaN
1     NaN
2    8.164966
3    8.164966
4    8.164966
dtype: float64

窗口大小为3的滚动标准差 (ddof=1):
0    NaN
1    NaN
2  10.0
3  10.0
4  10.0
dtype: float64

窗口大小为3的滚动标准差 (ddof=2):
0   NaN
1   NaN
2   inf
3   inf
4   inf
dtype: float64

=== 示例6: 时间序列数据中的应用 ===
时间序列数据:
2023-01-01    100.0
2023-01-02    200.0
2023-01-03      NaN
2023-01-04    400.0
2023-01-05    500.0
2023-01-06    600.0
2023-01-07    700.0
Freq: D, dtype: float64

3天时间窗口内的标准差:
2023-01-01          NaN
2023-01-02    70.710678
2023-01-03    70.710678
2023-01-04   141.421356
2023-01-05   141.421356
2023-01-06    70.710678
2023-01-07    70.710678
Freq: D, dtype: float64

=== 示例7: 股票收益率波动率计算示例 ===
股票收益率数据:
1     0.0200
2    -0.0196
3     0.0714
4     0.0476
5    -0.0182
6     0.0370
7     0.0268
8    -0.0174
9     0.0442
dtype: float64

5日收益率标准差(波动率):
1         NaN
2         NaN
3         NaN
4         NaN
5    0.035855
6    0.033317
7    0.026907
8    0.026131
9    0.025111
dtype: float64

年化波动率:
1       NaN
2       NaN
3       NaN
4       NaN
5    0.5691
6    0.5288
7    0.4271
8    0.4148
9    0.3986
dtype: float64

=== 示例8: std与var的关系验证 ===
方差结果:
0    NaN
1    NaN
2    1.0
3    1.0
4    1.0
5    1.0
6    1.0
dtype: float64

标准差结果:
0    NaN
1    NaN
2    1.0
3    1.0
4    1.0
5    1.0
6    1.0
dtype: float64

标准差的平方是否等于方差:
0     True
1     True
2     True
3     True
4     True
5     True
6     True
dtype: bool
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:rolling pandas Window panda wind

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-4-19 11:51