Python数据分析与挖掘实战中的错误总结与分析(持续更新)1.前言2.错误分析2.3第五章挖掘建模部分
博主研究生第一年已经成为过去式了,上了课,修了学分。接下来两年就是要搞搞学术了,方向为:大数据分析与数据挖掘。从此篇开始,就将学习过程中一些问题和想法与友交流之。这里是博主在学习中看的一本书《python数据分析与挖掘实战》中基础篇的一些代码规范以及参考方法,供大家学习。
2.错误分析
由于第一章和第二章较为简单,这里就不在赘述,涉及到官方文档,大家一定多看看。
2.1第三章数据探索部分
-
代码3-1餐饮营销数据异常值检测代码
这个代码主要是利用箱型图来将异常值进行显示,按照书上敲完代码执行后,会抛出一个TypeError:'AxesSubplot' object is not subscriptable。如下面图所示:
错误提示呢,是由于在使用DataFrame方法画箱型图的时候,没有指定P的类型,导致不能正常的获取其下标。也就是上一句中:
p=data.boxplot()
[/code]
```code
p=data.boxplot()
[/code]
修改这一句为:
```code
p=data.boxplot(return_type='dict')
[/code]
```code
p=data.boxplot(return_type='dict')
[/code]
便会得到正确的结果,其余部分的代码都很好理解。
另外要提示的是下面这两句是在以后的代码中不可或缺的,一个是为了让中文标签正常显示,另一个是为了正常显示负号。根据代码的需求,要添加时候便添加。
```code
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['font.family']='sans-serif'
[/code]
* 代码3-2餐饮销量数据统计量分析代码
这个代码主要是对数据的统计量分析,很好理解,里面没有问题。要提醒的是开头的这行
代码:
```code
from __future__ import print_function
[/code]
```code
from __future__ import print_function
[/code]
这个代码是将未来版本的一些特性导入到现在使用的版本中,如果你的python版本较高,那么可以不使用这个方法。
* 代码3-3菜品盈利帕累托图代码
贡献图分析又称帕累托分析,原理就是帕累托法则,对于一个公司来说,80%的利润常常来自于20%最畅销的产品,而其他80%的产品只产生了20%的利润,从而又称20/80定律。
根据提供的数据和代码,很容易就能得到菜品盈利的帕累托图,这里要强调的是下面这一点,在对数据排序的时候使用到下面的方法,ascending=False表示的按照倒序来排列,但是会抛出一个AttributeError:
'Series' object has no attribute 'sor
t'。
```code
data.sort(ascending=False)
[/code]
```code
data.sort(ascending=False)
[/code]
这是由于data在这里的类型是<class
'pandas.core.series.Series'>,可惜的是Series并没有sort这个方法,所以要采用sort_values()方法,sort_values是归于pandas的,具体是DataFrame.sort_values,但是Series也具有这样的方法。修改为如下的
代码:
```code
data.sort_values(ascending=False)
[/code]
```code
data.sort_values(ascending=False)
[/code]
具体调用是这样的:DataFrame.sort_values(by, axis=0, ascending=True, inplace=False,
kind='quicksort',
na_position='last'),by要求传入一个字符或一个字符列表指定axis的排序,axis=0表示列,axis=1表示行,ascending
True or
False就是升序和降序了。kind是排序的类型,有quicksort快速排序、mergesort插入排序、heasort堆排序等。na_position是缺失值的位置,一般是放在后面,当然也可以放在前面,其余参数一般不会用到。
* 代码3-4餐饮销量数据相关性分析
这个代码很简单,利用好corr()方法就行,没有什么要强调的。
## 2.2第四章数据预处理部分
* 代码4-1用拉格朗日法进行插补
这里直接将代码粘在这里,代码中没有错误,也是很容易理解,需要注意的直接作为注释放在代码中:
```code
# -*- coding:utf-8 -*-
import pandas as pd
from scipy.interpolate import lagrange
inputfile='/Users/yangjiayuan/PycharmProjects/day/cp4dataresolve/data/catering_sale.xls'
outputfile='/Users/yangjiayuan/PycharmProjects/day/cp4data-resolve/temp/sales.xls'
data=pd.read_excel(inputfile)
data[u'销量'][(data[u'销量']<400) | (data[u'销量']>5000)]=None#销量小于400或大于5000是异常,直接抹去。
#自定义的列向量插值函数
def ployinterp_column(s,n,k=5):
y=s[list(range(n-k,n))+list(range(n+1,n+1+k))]#取缺失值的前五个和后五个数据参与建模
y=y[y.notnull()]
return lagrange(y.index,list(y))(n)#n是被插值的位置
#逐个元素判断是否需要插值
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]:
data[i][j]=ployinterp_column(data[i],j)
data.to_excel(outputfile)#输出结果,写入文件。具体是在outputfile的路径中,需要提前建好temp文件夹
[/code]
* 代码4-2数据规范化代码
数学基础好的同学对这个代码几乎没有什么疑问,很简单的数学操作,读取到数据后,分别进行最小-
最大规范化、零-均值规范化、小数定标规范化这三部操作,最后的数据都可以通过shell来打印出来看到。
```code
# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np
datafile='/Users/yangjiayuan/PycharmProjects/day/cp4data-resolve/data/normalization_data.xls'
data=pd.read_excel(datafile,header=None)
print(data)
print((data-data.min())/(data.max()-data.min()))#最小-最大规范
print((data-data.mean())/data.std())#零-均值规范
print(data/10**np.ceil(np.log10(data.abs().max())))#小数定标规范
[/code]
要注意的是
read_excel()方法中,header=None,表示数据中是否存在列名,如果在第0行就写0,开始读数据时候跳过相应的行数,不存在的可以写None。
另外是np的ceil方法,返回输入值的上限,对于输入x,返回最小整数i,使得i>=x。
* 代码4-3数据离散化代码
数据离散化中采用了三种方法来进行操作:等宽法、等频法、基于聚类分析的方法,代码中都有涉及到,运行过程中发现有如下的问题, 下面的代码已经修改过。
```code
# -*- coding:utf-8 -*-
import pandas as pd
datafile='/Users/yangjiayuan/PycharmProjects/day/cp4data-resolve/data/discretization_data.xls'
data=pd.read_excel(datafile)
data=data[u'肝气郁结证型系数'].copy()
k=4
d1=pd.cut(data,k,labels=range(k))#等宽离散化
#等频率离散化
w=[1.0*i/k for i in range(k+1)]
w=data.describe(percentiles=w)[4:4+k+1]#自动计算分位数
w[0]=w[0]*(1-1e-10)
d2=pd.cut(data,w,labels=range(k))
#聚类分析方法
from sklearn.cluster import KMeans
kmodel=KMeans(n_clusters=k,n_jobs=4)
kmodel.fit(data.values.reshape((len(data),1)))
c=pd.DataFrame(kmodel.cluster_centers_).sort_values(0)
w=c.rolling(2).mean().iloc[1:]
w=[0]+list(w[0])+[data.max()]
d3=pd.cut(data,w,labels=range(k))
def cluster_plot(d,k):
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(8,3))
for j in range(0,k):
plt.plot(data[d==j],[j for i in d[d==j]],'o')
plt.ylim(-0.5,k-0.5)
return plt
cluster_plot(d1,k).show()
cluster_plot(d2,k).show()
cluster_plot(d3,k).show()
[/code]
1. 在模型训练时:kmodel.fit(data.reshape((len(data),1))),会抛出一个AttributeError: 'Series' object has no attribute 'reshape'。这是由于Series类型并没有reshape的方法,修改方法利用values方法将Series类型转化为numpy的ndarray类型,再使用reshape函数便可。
2. 同样的问题发生在输出聚类中心,并排序的操作中:c=pd.DataFrame(kmodel.cluster_centers_).sort(0),会抛出异常:AttributeError: 'DataFrame' object has no attribute 'sort',修改方法为改为使用sort_values()的排序方法。sort已经被pandas遗弃了,虽然它是属于DataFrame的。
3. 最后一个问题出现在相邻两项求中点的操作中,w=pd.rolling_mean(c,2).iloc[1:],会抛出异常:AttributeError: 'Pandas' object has no attribute 'rolling_mean',这里你要明白这个操作是对c的相邻两项求平均,从而修改为:w=c.rolling(2).mean().iloc[1:]。
其余部分没有发现错误,学习代码过程中着重看d1、d2、d3的部分就可以。关于等频率部分的内容,博主到现在仍有一些疑惑,希望理解的了朋友可以讲解讲解,不胜感激。
* 代码4-4和4-5线损率属性构造
代码过于简单,略过。
* 代码4-6主成成分分析降维代码
```code
# -*-coding:utf-8-*-
import pandas as pd
inputfile='/Users/yangjiayuan/PycharmProjects/day/cp4data-resolve/data/principal_component.xls'
outputfile='/Users/yangjiayuan/PycharmProjects/day/cp4data-resolve/temp/dimention_reduced.xls'
data=pd.read_excel(inputfile,header=None)
from sklearn.decomposition import PCA
pca=PCA()
pca.fit(data)