python数据分析与挖掘实战(3)【数据预处理】

数据清洗之缺失值处理

小技巧:撤销:ctrl+z,反撤销:ctrl+shift+z
用拉格朗日插值法进行插补
interpolate(插入,篡改)是scipy的一个子库,包含大量的插值函数,如拉格朗日插值,样条插值,高位插值。

import pandas as pd

from scipy.interpolate import lagrange#interpolate=插入
inputfile='E:\pycharm\python数据分析与挖掘实战数据及源码\chapter4\demo\data\catering_sale.xls'
outputfile='E:\pycharm\python数据分析与挖掘实战数据及源码\chapter4\demo\cmp\sale3.xls'

data = pd.read_excel(inputfile) #读入数据
data[u'销量'][(data[u'销量'] < 400) | (data[u'销量'] > 5000)] = None #过滤异常值,将其变为空值

#自定义列向量插值函数
#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
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) #插值并返回插值结果

#逐个元素判断是否需要插值
for i in data.columns:
  if i==u'日期':
        continue   #这部分是后加的,书上没有
  for j in range(len(data)):
    if (data[i].isnull())[j]: #如果为空即插值。
      data[i][j] = ployinterp_column(data[i], j)

data.to_excel(outputfile) #输出结果,写入文件

关于拉格朗日插值法遇到很多困难,希望以后能够解决。

数据变换

  • 规范化
import pandas as pd
import numpy as np

datafile='E:\\pycharm\\python数据分析与挖掘实战数据及源码\\chapter4\\demo\\data\\normalization_data.xls'
data=pd.read_excel(datafile,header=None)

p=(data-data.min())/(data.max()-data.min())#最小—最大规范化
q=(data-data.mean())/data.std()#零均值规范化
r=data/10**np.ceil(np.log10(data.abs().max()))#小数定标规范化
print(p)
print('--------------------------------')
print(q)
print('--------------------------------')
print(r)

python数据分析与挖掘实战(3)【数据预处理】_第1张图片
python数据分析与挖掘实战(3)【数据预处理】_第2张图片
python数据分析与挖掘实战(3)【数据预处理】_第3张图片

  • 连续属性规范化
    pd.cut()函数用法;函数用法:
pd.cut(series, bins, right=True, labels=NULL)

series (类似数组排列,必须是一维的)
bins (表示分段数或分类区间,可以是数字,比如说4,就是分成4段,也可以是列表,表示各段的间隔点)
right=True(表示分组右边闭合,right=False表示分组左边闭合)
labels=[]标签

cut()函数可以将一个数组中的数据切分成几个部分。两种用法:可以设置分类的边界,也可以仅规定分类后的个数。 cut([被分割的数据],[将数据分为几个部分])

规定了分类的边界:
 [(0, 25], (50, 75], (75, 100], (75, 100], (50, 75], (25, 50]]
Categories (4, interval[int64]): [(0, 25] < (25, 50] < (50, 75] < (75, 100]]

规定了分类的个数:
 [(2.903, 27.25], (51.5, 75.75], (75.75, 100.0], (75.75, 100.0], (51.5, 75.75], (27.25, 51.5]]
Categories (4, interval[float64]): [(2.903, 27.25] < (27.25, 51.5] < (51.5, 75.75] < (75.75, 100.0]]

等宽法

import pandas as pd
import numpy as np

datafile='E:\\pycharm\\python数据分析与挖掘实战数据及源码\\chapter4\\demo\\data\\discretization_data.xls'
data=pd.read_excel(datafile)
data=data[u'肝气郁结证型系数'].copy()
k=4

d1=pd.cut(data,k,labels=range(k))#等宽离散化,各个类比依次命名为0,1,2,3,cut()用法之规定了分类的个数
import matplotlib.pyplot as plt
def cluster_plot(d,k):
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.figure()
    for j in range(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()

python数据分析与挖掘实战(3)【数据预处理】_第4张图片

等频法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np

datafile='E:\\pycharm\\python数据分析与挖掘实战数据及源码\\chapter4\\demo\\data\\discretization_data.xls'
data=pd.read_excel(datafile)
data=data[u'肝气郁结证型系数'].copy()
k=4

w=[1.0*i/k for i in range(k+1)]
w=data.describe(percentiles=w)[4:4+k+1]#使用describe函数自动计算分位数,规定了分类的边界
#print(w)结果:0%      0.02600 25%     0.17625 50%     0.23100 75%     0.28175 100%    0.50400
w[0]=w[0]*(1-1e-10)#因为cut(right=True)默认为,表示分组为左开右必,所以要把0分位处包含进去,让他乘以一个略小于1的数
d2=pd.cut(data,w,labels=range(k))

import matplotlib.pyplot as plt
def cluster_plot(d,k):
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.figure()
    for j in range(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(d2,k).show()

python数据分析与挖掘实战(3)【数据预处理】_第5张图片

基于聚类分析的算法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np

datafile='E:\\pycharm\\python数据分析与挖掘实战数据及源码\\chapter4\\demo\\data\\discretization_data.xls'
data=pd.read_excel(datafile)
data=data[u'肝气郁结证型系数'].copy()
k=4

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(by=0)
w=pd.rolling(2).mean().iloc[1:]
w=[0]+list([0])+[data.max()]
d3=pd.cut(data,w,labels=range(k)
          )
import matplotlib.pyplot as plt
def cluster_plot(d,k):
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.figure()
    for j in range(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(d3,k).show()

代码错了运行不出来!!!难受

数据规约

  • 属性规约
    sklearn.decomposition.PCA(n_components=None,copy=True,whiten=False)
    (1) n_components : int, float, None or string
    意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n。
    类型:int或者 string,缺省时默认为None,所有成分被保留。赋值为int,比如 n_components=1,将把原始数据降到一个维度。赋值为 string,比如 n components-mle,将自动选取
    特征个数n,使得满足所要求的方差百分比。
    (2 )copy
    类型:bol,True或者 False,缺省时默认为True。
    意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA
    算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为
    False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
    (3)whiten
    类型:bool,缺省时默认为 False
    意义:白化,使得每个特征具有相同的方差。
import pandas as pd
inputfile='E:\pycharm\python数据分析与挖掘实战数据及源码\chapter4\demo\data\principal_component.xls'
outputfile='E:\pycharm\python数据分析与挖掘实战数据及源码\chapter4\demo\cmp\dimention_reducted.xls'
data=pd.read_excel(inputfile,header=None)
from sklearn.decomposition import PCA
pca=PCA()
pca.fit(data)

print(pca.components_)#返回模型的各个特征向量
print('--------------------------------------------------------------------------')
print(pca.explained_variance_ratio_)#返回各个成分各自的方差百分比
pca=PCA(3)
pca.fit(data)
low_d=pca.transform(data)
pd.DataFrame(low_d).to_excel(outputfile)
pca.inverse_transform(low_d)

python数据分析与挖掘实战(3)【数据预处理】_第6张图片

python数据分析与挖掘实战(3)【数据预处理】_第7张图片

unique()

去除数据的重复元素
即使numpy.unique()的一个函数,又是pandas下Series对象的一个方法

isnull()/notnull()

可以通过D(D.isnull())orD(D.notnull())找出D中的空值或非空值

你可能感兴趣的:(python数据分析与挖掘实战(3)【数据预处理】)