python数据预处理

数据清洗
缺失值处理,规范

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)#复原数据
上一篇:CentOS7.3下载,CentOS7.3 iso下载


下一篇:数学建模之主成分分析(PCA)