我的数据中有item_code
列,另一列sales
是代表特定商品的销售量。
数据可以多次具有特定的项目ID。还有其他列将这些条目区分开。
我只想为每个项目绘制异常销售额(因为数据具有数千个不同的项目ID,因此很难绘制每个条目)。
由于我对此很陌生,所以什么是正确的方法和工具呢?
答案 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。
这是您想做的吗?我希望它可以帮助您开始。