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

雷达卡


京公网安备 11010802022788号







