返回

刮风下雨,拯救大滑坡——面对火爆的市场,Pandas滑动窗口是如何协助我们揪出刷单黄牛党的

后端

当我们谈到 Pandas,首先想到的可能是它在数据清洗和预处理方面的强大功能,它可以高效地处理大型数据集,进行数据转换、筛选等等。但你或许不知道,Pandas 还有一个隐藏技能:异常值检测。

异常值,顾名思义,就是数据集中那些与整体趋势格格不入的数值。想象一下,在一组考试成绩中,大部分学生都在 70 分左右,却突然出现一个 100 分或者 20 分,这些分数就很有可能是异常值,需要我们仔细探究其背后的原因。

Pandas 提供了一种简单而有效的方法来检测异常值:滑动窗口。滑动窗口就像一个“放大镜”,它沿着数据集移动,每次观察一小部分数据,并计算这部分数据的统计特征,例如均值和标准差。通过观察这些统计特征的变化,我们可以发现数据中的异常点。

举个例子,假设我们有一组网站的访问量数据,如下所示:

100, 110, 120, 130, 140, 150, 900, 160, 170, 180

我们可以使用 Pandas 的 rolling() 函数创建一个大小为 3 的滑动窗口,并计算每个窗口的均值:

import pandas as pd

data = pd.Series([100, 110, 120, 130, 140, 150, 900, 160, 170, 180])
window_size = 3
rolling_mean = data.rolling(window=window_size).mean()
print(rolling_mean)

输出结果如下:

0      NaN
1      NaN
2    110.0
3    120.0
4    130.0
5    140.0
6    450.0
7    530.0
8    570.0
9    270.0
dtype: float64

可以看到,当滑动窗口移动到包含 900 这个异常值时,窗口的均值突然飙升到了 450,远远高于其他窗口的均值。这说明 900 很可能是一个异常值。

当然,只看均值有时候不够全面,我们还可以结合标准差来判断。如果一个窗口的标准差也远高于其他窗口,那么就更有理由怀疑这个窗口内存在异常值。

rolling_std = data.rolling(window=window_size).std()
print(rolling_std)

通过观察均值和标准差的变化,我们可以快速定位数据中的异常点,并进行进一步的分析。例如,我们可以查看网站日志,了解访问量突然飙升的原因,是正常的访问高峰,还是受到了恶意攻击。

滑动窗口不仅可以用来检测单一变量的异常值,还可以用来检测多个变量之间的异常关系。例如,我们可以用滑动窗口计算两个变量之间的相关系数,如果相关系数突然发生变化,就可能说明这两个变量之间存在异常关系。

常见问题解答

1. 滑动窗口的大小如何选择?

滑动窗口的大小取决于数据的特点和分析的目的。如果数据波动比较剧烈,可以选择较小的窗口;如果数据比较平稳,可以选择较大的窗口。一般来说,窗口大小应该能够覆盖数据的典型周期或模式。

2. 如何判断一个点是否是异常值?

判断一个点是否是异常值没有绝对的标准,需要根据具体的应用场景和数据的特点来决定。常用的方法是设定一个阈值,例如将超过均值 3 个标准差的点视为异常值。

3. 滑动窗口除了检测异常值,还有什么其他用途?

滑动窗口还可以用来进行时间序列数据的平滑、趋势分析、特征提取等。

4. Pandas 除了滑动窗口,还有其他方法可以检测异常值吗?

Pandas 还提供了一些其他的方法来检测异常值,例如 quantile() 函数可以计算数据的百分位数,boxplot() 函数可以绘制箱线图,describe() 函数可以查看数据的基本统计信息。

5. 如何处理检测到的异常值?

处理异常值的方法有很多,例如删除异常值、替换异常值、将异常值视为缺失值等。选择哪种方法取决于具体的应用场景和数据的特点。

总而言之,Pandas 的滑动窗口是一个简单而强大的工具,可以帮助我们快速有效地检测数据中的异常值,并进行进一步的分析。掌握了这个工具,你就能更好地理解和利用数据,做出更明智的决策。