与 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)
有谁知道为什么在 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)