如何绘制关于唯一ID的异常值

时间:2018-12-12 11:15:49

标签: pandas plot

我的数据中有item_code列,另一列sales是代表特定商品的销售量。

数据可以多次具有特定的项目ID。还有其他列将这些条目区分开。

我只想为每个项目绘制异常销售额(因为数据具有数千个不同的项目ID,因此很难绘制每个条目)。

由于我对此很陌生,所以什么是正确的方法和工具呢?

1 个答案:

答案 0 :(得分:0)

您可以使用熊猫。您应该选择一种检测异常值的方法,但我为您提供了一个示例:

如果要获取所有销售的异常值(非分组数据),则可以将apply with函数(例如lambda函数)与异常值索引一起使用。

import numpy as np
%matplotlib inline

df = pd.DataFrame({'item_id': [1, 1, 2, 1, 2, 1, 2],
                  'sales': [0, 2, 30, 3, 30, 30, 55]})

df[df.apply(lambda x: np.abs(x.sales - df.sales.mean()) / df.sales.std() > 1, 1)
           ].set_index('item_id').plot(style='.', color='red')

在此示例中,我们生成了数据样本和点的搜索索引,这些均值比均值/ std + 1(您可以尝试其他方法)更多。然后将它们绘制在y是销售数量而x是项目ID的位置。此方法检测到点0和55。如果要在组中搜索离群值,可以在之前对数据进行分组。

df.groupby('item_id').apply(lambda data: data.loc[
    data.apply(lambda x: np.abs(x.sales - data.sales.mean()) / data.sales.std() > 1, 1)
]).set_index('item_id').plot(style='.', color='red')

在此示例中,我们具有点30和55,因为对于item_id = 1的组而言,0并非异常值,而对于30则为30。

这是您想做的吗?我希望它可以帮助您开始。