我有一整年的报告日期,时间间隔和总体积的数据框。我希望能够在每个时间间隔内删除异常值。
这是我能够得到的......
dft.head()
Report Date Time Interval Total Volume
5784 2016-03-01 24 467.0
5785 2016-03-01 25 580.0
5786 2016-03-01 26 716.0
5787 2016-03-01 27 803.0
5788 2016-03-01 28 941.0
所以我计算分位数
low = .05
high = .95
dfq = dft.groupby(['Time Interval']).quantile([low, high])
print(dfq).head()
Total Volume
Time Interval
24 0.05 420.15
0.95 517.00
25 0.05 521.90
0.95 653.55
26 0.05 662.75
然后我希望能够使用它们来删除每个时间间隔内的异常值,使用类似的东西...
dft = dft.apply(lambda x: x[(x>dfq.loc[low,x.name]) & (x < dfq.loc[high,x.name])], axis=0)
任何指针/建议都非常赞赏。
答案 0 :(得分:1)
df[df.groupby("ReportDate").TotalVolume.\
transform(lambda x : (x<x.quantile(0.95))&(x>(x.quantile(0.05)))).eq(1)]
Out[1033]:
ReportDate TimeInterval TotalVolume
5785 2016-03-01 25 580.0
5786 2016-03-01 26 716.0
5787 2016-03-01 27 803.0
答案 1 :(得分:0)
一种方法是按如下方式过滤:
In [11]: res = df.groupby("Date")["Interval"].quantile([0.05, 0.95]).unstack(level=1)
In [12]: res
Out[12]:
0.05 0.95
Date
2016-03-01 489.6 913.4
现在我们可以使用loc
和filter:
In [13]: (res.loc[df.Date, 0.05] < df.Interval.values) & (df.Interval.values < res.loc[df.Date, 0.95])
Out[13]:
Date
2016-03-01 False
2016-03-01 True
2016-03-01 True
2016-03-01 True
2016-03-01 False
dtype: bool
In [14]: df.loc[((res.loc[df.Date, 0.05] < df.Interval.values) & (df.Interval.values < res.loc[df.Date, 0.95])).values]
Out[14]:
Report Date Time Interval Total Volume
1 5785 2016-03-01 25 580.0 NaN
2 5786 2016-03-01 26 716.0 NaN
3 5787 2016-03-01 27 803.0 NaN
注意:按时间间隔分组&#39;会有相同的工作,但在你的例子中没有过滤任何行!