小技巧:撤销: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)
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()
#!/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()
#!/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)
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)
去除数据的重复元素
即使numpy.unique()的一个函数,又是pandas下Series对象的一个方法
可以通过D(D.isnull())orD(D.notnull())找出D中的空值或非空值