数据清洗
缺失值处理,规范
import pandas as pd from scipy.interpolate import lagrange inputfile='E:/LearningSoftware/AboutPython/24064925aueh/01-数据和代码/chapter4/demo/data/catering_sale.xls' outputfile='E:/LearningSoftware/AboutPython/24064925aueh/01-数据和代码/chapter4/demo/data/sales.xls' data=pd.read_excel(inputfile) data.loc[14] data['销量'][(data['销量']<400)|(data['销量']>5000)]=None#过滤异常值,将其变成空值 #自定义列向量插值函数 #s为列向量,n为被插值的地方,k为取前后的数据个数,默认为5 def ployinterp_column(s, n, k=5): if(n<=k and n+k<len(s)): y=s[list(range(1,n))+list(range(n+1,n+1+k))] elif(n<=k and n+k>len(s)): y=s[list(range(1,n))+list(range(n+1,len(n)))] elif(n>k and n+k>len(s)): y=s[list(range(n-k,n))+list(range(n+1,len(n)))] else: 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) #插值并返回插值结果 #逐个元素判断是否需要插值 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) #输出结果,写入文件 #数据规范 #-*- coding: utf-8 -*- datafile='E:/LearningSoftware/AboutPython/24064925aueh/01-数据和代码/chapter4/demo/data/normalization_data.xls' data=pd.read_excel(datafile,header=None) (data-data.min())/(data.max()-data.min()) (data-data.mean())/data.std() data/10**np.ceil(np.log10(data.abs().max))#小数定标规范化
连续数据离散化
atafile='E:/LearningSoftware/AboutPython/24064925aueh/01-数据和代码/chapter4/demo/data/discretization_data.xls' data=pd.read_excel(datafile) data=data['肝气郁结证型系数'].copy() k=4 d1=pd.cut(data, k,labels=range(k))#等宽离散化,各个类依次命名为0,1,2,3 #等频率离散化 w=[1.0*i/k for i in range(k+1)] w=data.describe(percentiles=w)[4:4+k+1] w 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)#n_jobs是并行数,一般等于CPU个数 kmodel.fit(data.values.reshape((len(data),1))) c=pd.DataFrame(kmodel.cluster_centers_).sort_values#输出聚类中心,并且排序 c w=pd.rolling_mean(c,2).iloc[1:]#相邻两项求中点,作为边界点 d3=pd.cut(data,w,labels=range(k)) def cluster_plot(d,k):#自定义作图函数来显示聚类结果 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() #线损率属性构造 import pandas as pd #参数初始化 inputfile= '../data/electricity_data.xls' #供入供出电量数据 outputfile = '../tmp/electricity_data.xls' #属性构造后数据文件 data = pd.read_excel(inputfile) #读入数据 data[u'线损率'] = (data[u'供入电量'] - data[u'供出电量'])/data[u'供入电量'] data.to_excel(outputfile, index = False) #保存结果
数据规约
属性规约 使用PCA
from sklearn.decomposition import PCA pca=PCA() pca.fit(data) pca.components_ pca.explained_variance_ratio_ pca=PCA(3) pca.fit() low_d=pca.transform(data)#对原数据降维 pd.DataFrame(low_d).to_excel(outputfile) pca.inverse_transform(low_d)#复原数据