我正在使用此代码来删除异常值。
import pandas as pd
import numpy as np
from scipy import stats
df = pd.DataFrame(np.random.randn(100, 3))
df[np.abs(stats.zscore(df[0])) < 1.5]
这有效。我们可以看到数据框的行数减少了。但是,我需要删除类似数据帧的百分比变化值中的异常值。
df = df.pct_change()
df.plot.line(subplots=True)
df[np.abs(stats.zscore(df[0])) < 1.5]
这会产生一个空数据框。我究竟做错了什么?值 1.5 是否应该调整? 我尝试了几个值。没有任何效果。
这是因为数据帧的第一个值是空的。所以使用
fillna
来删除 nan 值。
import pandas as pd
import numpy as np
np.random.seed(2024)
df = pd.DataFrame(np.random.randn(100, 3))
df = df.pct_change()
out = df[np.abs(stats.zscore(df[0].fillna(0))) < 1.5]
输出:
>>> out
0 1 2
0 NaN NaN NaN
1 2.066210 0.693520 -1.361496
2 0.036889 -4.277487 1.005127
3 -0.656436 -1.603853 -0.007976
4 -0.554036 3.128630 2.703688
.. ... ... ...
95 -2.230812 -0.877377 -0.724188
96 -1.143944 3.102508 -1.353759
97 -2.754503 -0.053533 -5.082226
98 -1.724168 0.175689 0.058848
99 -0.139254 -2.173114 -0.300101
[92 rows x 3 columns] # <- 8 rows was removed