本文对给出的CSV文件做处理,输出数据集的基本信息,比如最大值、最小值、平均值等,以及统计了缺失的变量和样本个数最后画出了箱式图进行了异常点的检测

 

  • 首先要读取文件,如下的代码
import matplotlib.pyplot as plt
import pandas as pd

train_data = pd.read_csv("C:/Users/Administrator/Desktop/catering_sale.csv")

但是会报出这样的错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byte

说明编码有问题所以要在读取的后面加上encodeing=‘gb2312’语句,如下这样读取的编码问题就能解决:

train_data = pd.read_csv("C:/Users/Administrator/Desktop/catering_sale.csv",encoding='gb2312')
  • 接下来我们就找出数据集的基本信息,因为数据集只有日期和销量两列数据所以我们主要对销量这一列进行分析,运用describe()函数,代码如下
print(train_data['销量'].describe())

得到的结果如下,我们就得到了销量的最大值、最小值、平均值以及销量的标准差:

[201 rows x 2 columns] 表示一共201行,2列
count     200.000000 列非空值的数量
mean     2755.214700 平均值
std       751.029772 列的标准差
min        22.000000 最小值
25%      2451.975000 25%分位数,排序之后排在25%位置的数
50%      2655.850000 50%分位数
75%      3026.125000 75%分位数
max      9106.440000 最大值
Name: 销量, dtype: float64
  • 接下来看缺失的变量,首先要将其转换成DataFrame样式,在进行查找缺失值
df=pd.DataFrame(train_data)
print(df[df.isnull().T.any()])
print('缺失个数:',df['销量'].isnull().sum())

得到的结果如下,也就是说样本缺失的只有2015/2/14日期这一天的销量值,其他的都有

           日期  销量
14  2015/2/14 NaN
缺失个数: 1

我们具体看一下这一句  df[df.isnull().T.any()],它可以如下这么分解一下:

lack = df.isnull() #用isnull()获得缺失值位置为True,非缺失值位置为False的DataFrame
lack_col = lack.any() #再调用any()就可以看到哪些列有缺失值
df_lack_only = df[df.isnull().values == True] #只显示存在缺失值的行列
print(df_lack_only)

所以我们缺失的具体行列就是这么一步一步的得到的

  • 再看样本总数:
print('样本个数:',df['销量'].shape[0])

样本个数: 201
  • 画出箱式图

前两句是解决图形汉字的问题,如果不加这两句,图像上的汉字销量就显示不出来

plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 创建图布局
fig, ax = plt.subplots(1, 1, figsize=(8, 5))
# 函数boxplot用于绘制箱型图
df.boxplot(column='销量', ax=ax)
plt.show()

得到的箱式图就如下所示:

 

  •  通过箱式图进行异常检测


异常检测这一部分源自此处:https://blog.csdn.net/zhaoyin214/article/details/90330752?ops_request_misc=

p = train_data.plot.box(return_type='dict')
x = p["fliers"][0].get_xdata() # flier:异常值标签
y = p["fliers"][0].get_ydata()
y.sort()

# annotate添加注释
for i in range(len(x)):
    if i > 0:
        plt.annotate(y[i], xy=(x[i], y[i]),xytext=(x[i] + 0.05 - 0.8 / (y[i] - y[i - 1]), y[i]))
    else:
        plt.annotate(y[i], xy=(x[i], y[i]), xytext=(x[i] + 0.08, y[i]))

plt.show()

得到如下的图:

 

 通过图示可知:在此次样本中,865、4060.3、4065.2可归为正常值;22、51、60、6607.4、9106.44归为异常值。