离群值检测

时间:2019-03-03 03:54:47

标签: python machine-learning outliers anomaly-detection

我有一个包含产品名称和销售金额(CSV格式)的每日数据集 此数据是最近1年的数据。 我需要找到每种产品的销售额的中位数,并创建一个具有产品名称和销售额中值的模型

现在,当我提供带有产品名称和销售金额的今天的数据时,模型应该为我提供销售金额介于+ /-之间的产品名称 模型中值的10%。

样本数据

ProductName,Date,Amount
P1,01-01-2019,1000
p2,01-01-2019,1000
p3,01-01-2019,1000
P1,02-01-2019,1878
p2,02-01-2019,1540
p3,02-01-2019,1482
P1,04-01-2019,2010
p2,04-01-2019,2540
p3,04-01-2019,2365
P1,06-01-2019,995
p2,06-01-2019,860
p3,06-01-2019,1000

2 个答案:

答案 0 :(得分:0)

您似乎无法提供所做工作的任何代码,并且此站点未为您提供代码。 但是仍然看到您是新来的:

尝试一下:

import pandas as pd
import numpy as np

ProductName = [
    'P1', 'p2', 'p3', 'P1', 'p2', 'p3', 'P1', 'p2', 'p3', 'P1', 'p2', 'p3'
]
Date = [
    '01-01-2019', '01-01-2019', '01-01-2019', '02-01-2019', '02-01-2019',
    '02-01-2019', '04-01-2019', '04-01-2019', '04-01-2019', '06-01-2019',
    '06-01-2019', '06-01-2019'
]
Amount = [1000, 1000, 1000, 1878, 1540, 1482, 2010, 2540, 2365, 995, 860, 1000]

df = pd.DataFrame({'Product Name': ProductName, 'Date': Date, 'Amount': Amount})
df_Product = df.groupby('Product Name').median()

data = {'ProductName':'P1','Date':'03-04-2019','Amount':1525}
for index,row in df_Product.iterrows():
    if data['Amount'] >= row['Amount'] - 0.1*row['Amount'] and data['Amount'] <= row['Amount'] + 0.1*row['Amount']:
        print(index)

答案 1 :(得分:0)

有许多检测异常值的方法。它们是基于Z_score的模式,基于统计的检测或基于机器学习的异常值检测。

最近,我正在对多维数据集使用基于统计的OD检测模式。此模式将需要statsmodels lib。

这是示例代码:     将熊猫作为pd导入     导入statsmodels.api作为sm     导入matplotlib.pyplot作为plt     从scipy.stats导入zscore

df=pd.DataFrame(Your_sample_data)
y_col = "amount"
X_cols = ["ProductName","Date"]
X=df[X_cols]
y=df[OD_y_col]

lm = sm.OLS(y,X).fit()
OD_result =lm.outlier_test()

print(lm.summary())
print(OD_result[OD_result.unadj_p<=confidence_level])

希望以上伪代码可以帮助您。