与 1e-1 相乘后 pandas DataFrame 的 Rolling Std returns 0

Rolling Std returns 0 for pandas DataFrame after multiplying with 1e-1

有谁知道为什么在 float64 pandas 数据框列达到 1e-8 因子后滚动 std returns 0?

这是一个代码示例:

import pandas as pd
import numpy as np

N = 250
pd.set_option('display.precision', 200)
df = pd.DataFrame()

df["C"] = [np.random.normal() for i in range(10000)]

print("N(0, 1)")
print(df["C"].mean())
print(df["C"].std())

# 1e0
df["std"] = df["C"].rolling(N).std()
print("Std is not 0.")
print(df["std"])

# 1e-6
df["C"] = df["C"] * 1e-6
df["std"] = df["C"].rolling(N).std()
print("Std is still not 0.")
print(df["std"])

# 1e-7
df["C"] = df["C"] * 1e-1
df["std"] = df["C"].rolling(N).std()
print("Std is sometimes (?) 0 now.")
print(df["std"])

# 1e-8
df["C"] = df["C"] * 1e-1
df["std"] = df["C"].rolling(N).std()
print("Std is always 0 now.")
print(df["std"])

1e-8 应该不是问题,因为我们在这里使用 float64,而没有滚动的 std 可以处理更小的数字。直接乘1e-8也会出现同样的问题

np.std还有一种选择:

import numpy as np
df = df["C"].rolling(N).apply(np.std)