数据挖掘 实验二
一、 实验目的
1、熟悉 pandas
2、了解数据预处理的主要内容
3、掌握插值的方法
二、 实验要求
利用箱线图方法查找出数据表中异常值,并利用拉格朗日插值法和牛顿
插值法补充空值,并比较两种方法插入值的大小,评价其优缺点。
三、 实验步骤
本次实验首先需要将 csv 文件中的数据提取成 Dataframe 类型,再将其清
洗,清洗时只需要设定合理的数据范围,将不符合范围的数据置空。最后将数
据转换成合适的类型,带入插值函数中。其中最需要注意的地方是最后一步,
虽然书中有相关代码,但是实验中使用时并不能使用,必须重新编写。
详细代码如下,代码语句作用已经备注其中。
1. importpandasaspd
2. importnumpyasnp
3. importmatplotlib.pyplotasplt
4. fromscipy.interpolateimportlagrange#导入拉格朗日插值函数ˆˆ
5.
6. plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标
签ˆˆ
7. plt.rcParams['axes.unicode_minus']=False#用来正常显示负号ˆˆ
8. pd.set_option('display.max_rows',None)#显示完整数据(避免省略)
9.
10. inputfile='城市空气小时数据-1.csv'#销量数据路径ˆˆ
11. outputfile1='tmp/异常值置空后数据.csv'#输出数据路径ˆˆ
12. outputfile2='tmp/拉格朗日插值后数据.csv'#输出数据路径ˆˆ
13. outputfile3='tmp/牛顿插值后数据.csv'#输出数据路径ˆˆ
14.
15. #encoding='gbk'需要加上,否则中文会乱码ˆˆ
16. data_all=pd.read_csv(inputfile,index_col=u'ID',encoding
='gbk')#读取数据,指定“ID”列为索引列ˆˆ
17. data=data_all.loc[:,['NO2 指数','PM10 指数']]#选取需要处理的数据ˆˆ
18.
19.
20. '''''异常值置空处理'''
21. data_set_empty=data.copy(deep=True)#这里是引用,直接赋值的话,
data_set_empty 和 data 则是同一个变量ˆˆ
22. #处理异常数据,边界值的选定需要合理调整ˆˆ
23. data_set_empty.loc[(data_set_empty[u'NO2 指数']<10)|(data_s
et_empty[u'NO2 指数']>100),'NO2 指数']=None#过滤异常值,将其
变为空值ˆˆ
24. data_set_empty.loc[(data_set_empty[u'PM10 指数']<20)|(data_
set_empty[u'PM10 指数']>200),'PM10 指数']=None
25.
26. #print(data_set_empty)
27.
28. '''''拉格朗日插值法处理'''
29. data_lagrange=data_set_empty.copy(deep=True)
30. #自定义列向量插值函数ˆˆ
31. #s 为列向量,n 为被插值的位置,k 为取前后的数据个数,默认为 4,太大会失真ˆˆ
32. defployinterp_column(s,n,k=2):
33. s.index=range(len(s))#重定义索引,(0,len(s))ˆˆ
34. y=s.iloc[n-k:n].append(s.iloc[n+1:n+1+k])#取数(前后各
n 个数据)ˆˆ
35. y=y[y.notnull()]#剔除空值ˆˆ
36. returnlagrange(y.index,list(y))(n)#插值并返回插值结果ˆˆ
37.
38.
39. #逐个元素判断是否需要插值ˆˆ
40. foriinrange(len(data_lagrange)):#行遍历ˆˆ
41. forjinrange(len(data_lagrange.columns)):#列遍历ˆˆ
42. ifpd.isnull(data_lagrange.iat[i,j]):#如果为空即插
值。ˆˆ
43. data_lagrange.iat[i,j]=int(ployinterp_column(da
ta_lagrange.iloc[:,j],i))
44.
45. #irow 方法和 icol 方法已经被淘汰,可以使用 iloc[:,i]选取列,使用
iloc[i,:]选取行ˆˆ
46.
47. '''''牛顿插值法处理'''
48. data_newton=data_set_empty.copy(deep=True)
49. #X:横坐标ˆY:纵坐标ˆˆx:需要插入位置的横坐标值ˆˆ
50. defnewton_interpolation(X,Y,x):
51. #计算 x 点的插值ˆˆ
52. sum=Y[0]
53. temp=np.zeros((len(X),len(X)))
54. #将第一行赋值ˆˆ
55. foriinrange(0,len(X)):
56. temp[i,0]=Y[i]
57. temp_sum=1.0
58. foriinrange(1,len(X)):
59. #x 的多项式ˆˆ
60. temp_sum=temp_sum*(x-X[i-1])
61. #计算均差ˆˆ
62. forjinrange(i,len(X)):
63. temp[j,i]=(temp[j,i-1]-temp[j-1,i-1])/(X[j]-X[j-
i])
64. sum+=temp_sum*temp[i,i]
65. returnsum
66.
67. #自定义列向量插值函数ˆˆ
68. #s 为列向量,n 为被插值的位置,k 为取前后的数据个数,默认为 4,太大失真ˆˆ
69. defnewton_ployinterp(s,n,k=4):
70. s.index=range(len(s))#重新设置索引ˆˆ
71. y=s.iloc[n-k:n].append(s.iloc[n+1:n+1+k])#取数ˆˆ
72. y=y[y.notnull()]#剔除空值ˆˆ
73. returnnewton_interpolation(y.index,list(y),n)#插值并返
回插值结果ˆˆ
74.
75. #逐个元素判断是否需要插值ˆˆ
76. foriinrange(len(data_newton)):
77. forjinrange(len(data_newton.columns)):
78. ifpd.isnull(data_newton.iat[i,j]):#如果为空即插值。ˆˆ
79. data_newton.iat[i,j]=int(newton_ployinterp(data
_newton.iloc[:,j],i))
80.
81.
82. '''''绘图'''
83. #创建窗口 fig1,大小(18,9),两行两列ˆˆ
84. fig1,axes=plt.subplots(2,2,figsize=(18,9))
85.
86. data.boxplot(return_type='dict',ax=axes[0,0])#画箱线图,直接
使用 DataFrame 的方法ˆˆ
87. axes[0,0].set_title('原数据箱线图')
88.
89. #异常值置空处理后的箱线图ˆˆ
90. data_set_empty.boxplot(return_type='dict',ax=axes[0,1])
91. axes[0,1].set_title('异常值置空处理后的箱线图')
92.
93. #拉格朗日插值法处理后的箱线图ˆˆ
94. data_lagrange.boxplot(return_type='dict',ax=axes[1,0])
95. axes[1,0].set_title('拉格朗日插值法处理后的箱线图')
96.
97. #牛顿插值法处理后的箱线图ˆˆ
98. data_newton.boxplot(return_type='dict',ax=axes[1,1])
99. axes[1,1].set_title('牛顿插值法处理后的箱线图')
100.
101. plt.get_current_fig_manager().window.showMaximized()#
全屏显示ˆˆ
102. fig1.savefig("pic/插值前后箱线图.png")
103.
104.
105. #拉格朗日插值前后对比ˆˆ
106. data_temp1=pd.merge(data,data_lagrange,on='ID')
107. data_temp1.columns=['NO2 指数(原)','PM10 指数(原)','NO2 指
数(处理后)','PM10 指数(处理后)']#合并 Dataframe
108. data_temp1.index=range(len(data))#重定义索引,原索引不连续,
做出的图不简洁ˆˆ
109.
110. #创建窗口 fig2,大小(18,9),两行两列ˆˆ
111. fig2,axes=plt.subplots(2,2,figsize=(18,9))
112.
113. #NO2 指数拉格朗日插值前后对比折线图ˆˆ
114. data_temp1.loc[:,['NO2 指数(原)','NO2 指数(处理
后)']].plot(ax=axes[0,0])#画折线图,直接使用 DataFrame 的方法ˆˆ
115. axes[0,0].set_title('NO2 指数拉格朗日插值前后对比折线图')
116.
117. #PM10 指数拉格朗日插值前后对比折线图ˆˆ
118. data_temp1.loc[:,['PM10 指数(原)','PM10 指数(处理
后)']].plot(ax=axes[0,1])
119. axes[0,1].set_title('PM10 指数拉格朗日插值前后对比折线图')
120.
121. #牛顿插值前后对比ˆˆ
122. data_temp2=pd.merge(data,data_newton,on='ID')
123. data_temp2.columns=['NO2 指数(原)','PM10 指数(原)','NO2 指
数(处理后)','PM10 指数(处理后)']#合并 Dataframe
124. data_temp2.index=range(len(data))#重定义索引ˆˆ
125.
126. #NO2 指数牛顿插值前后对比折线图ˆˆ
127. data_temp2.loc[:,['NO2 指数(原)','NO2 指数(处理
后)']].plot(ax=axes[1,0])
128. axes[1,0].set_title('NO2 指数牛顿插值前后对比折线图')
129.
130. #PM10 指数牛顿插值前后对比折线图ˆˆ
131. data_temp2.loc[:,['PM10 指数(原)','PM10 指数(处理
后)']].plot(ax=axes[1,1])
132. axes[1,1].set_title('PM10 指数牛顿插值前后对比折线图')
133.
134. plt.get_current_fig_manager().window.showMaximized()#
全屏显示ˆˆ
135. fig2.savefig("pic/插值前后对比折线图.png")
136.
137. #相关文件,写入文件ˆencoding='gbk'需要加上,否则中文会乱码ˆˆ
138. data_set_empty.to_csv(outputfile1,encoding='gbk')#保存
异常值置空后数据ˆˆˆ
139. data_lagrange.to_csv(outputfile2,encoding='gbk')#保存
拉格朗日插值后数据ˆˆ
140. data_newton.to_csv(outputfile3,encoding='gbk')#保存牛顿
插值后数据ˆˆ
四、 实验结果及分析
1、运行结果截图
1)插值前后箱线图
- 1
- 2
- 3
- 4
- 5
前往页