从 DataFrame 中过滤异常值
Filtering outliers from DataFrame
我在过滤数据时遇到了很大的问题。我在这里阅读了很多关于 Whosebug 和离子其他页面和教程的内容,但我无法解决我的具体问题......
我的代码的第一部分,我将数据加载到 python 中,如下所示:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from arch import arch_model
spotmarket = pd.read_excel("./data/external/Spotmarket_dhp.xlsx", index=True)
r = spotmarket['Price'].pct_change().dropna()
returns = 100 * r
df = pd.DataFrame(returns)
excel table 一列有 43.000 个值,包括每小时价格。我使用这些数据来计算每小时的百分比变化,问题是,有时在 1000% 到 40000% 之间会有很大的变化。数据框如下所示:
df
Out[12]:
Price
1 20.608229
2 -2.046870
3 6.147789
4 16.519258
...
43827 -16.079874
43828 -0.438322
43829 -40.314465
43830 -100.105374
43831 700.000000
43832 -62.500000
43833 -40400.000000
43834 1.240695
43835 52.124183
43836 12.996778
43837 -17.157795
43838 -30.349971
43839 6.177924
43840 45.073701
43841 76.470588
43842 2.363636
43843 -2.161042
43844 -6.444781
43845 -14.877102
43846 6.762918
43847 -38.790036
[43847 rows x 1 columns]
我想排除这个异常值。我已经尝试了不同的方法,例如计算 mean
和 std
,并排除了所有与 mean
相差 + 和 - 三倍 std
的值。它适用于一小部分数据,但对于完整数据,均值和标准差都是NaN
。有人知道如何过滤我的数据框吗?
我认为需要按百分位数过滤 quantile
:
r = spotmarket['Price'].pct_change() * 100
Q1 = r.quantile(.25)
Q3 = r.quantile(.75)
q1 = Q1-1.5*(Q3-Q1)
q3 = Q3+1.5*(Q3-Q1)
df = spotmarket[r.between(q1, q3)]
您可能应该首先丢弃所有产生这些波动的值,然后创建数据框。一种方法是使用 filter()
我在过滤数据时遇到了很大的问题。我在这里阅读了很多关于 Whosebug 和离子其他页面和教程的内容,但我无法解决我的具体问题...... 我的代码的第一部分,我将数据加载到 python 中,如下所示:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from arch import arch_model
spotmarket = pd.read_excel("./data/external/Spotmarket_dhp.xlsx", index=True)
r = spotmarket['Price'].pct_change().dropna()
returns = 100 * r
df = pd.DataFrame(returns)
excel table 一列有 43.000 个值,包括每小时价格。我使用这些数据来计算每小时的百分比变化,问题是,有时在 1000% 到 40000% 之间会有很大的变化。数据框如下所示:
df
Out[12]:
Price
1 20.608229
2 -2.046870
3 6.147789
4 16.519258
...
43827 -16.079874
43828 -0.438322
43829 -40.314465
43830 -100.105374
43831 700.000000
43832 -62.500000
43833 -40400.000000
43834 1.240695
43835 52.124183
43836 12.996778
43837 -17.157795
43838 -30.349971
43839 6.177924
43840 45.073701
43841 76.470588
43842 2.363636
43843 -2.161042
43844 -6.444781
43845 -14.877102
43846 6.762918
43847 -38.790036
[43847 rows x 1 columns]
我想排除这个异常值。我已经尝试了不同的方法,例如计算 mean
和 std
,并排除了所有与 mean
相差 + 和 - 三倍 std
的值。它适用于一小部分数据,但对于完整数据,均值和标准差都是NaN
。有人知道如何过滤我的数据框吗?
我认为需要按百分位数过滤 quantile
:
r = spotmarket['Price'].pct_change() * 100
Q1 = r.quantile(.25)
Q3 = r.quantile(.75)
q1 = Q1-1.5*(Q3-Q1)
q3 = Q3+1.5*(Q3-Q1)
df = spotmarket[r.between(q1, q3)]
您可能应该首先丢弃所有产生这些波动的值,然后创建数据框。一种方法是使用 filter()