目的:删除原始数据集中的无关数据、重复数据、平滑噪声数据、筛选掉与挖掘主题无关的数据、处理缺失值、异常值等
缺失值处理方法:删除记录、数据插补和不处理
拉格朗日插值法:对于平面上已知的N个点(无两点在一条直线上)可以找到一个N-1次多项式y=a0+a1x+…+an-1x^n-1,使此多项式曲线过这n个点
代码实现:
import pandas as pd
from scipy.interpolate import lagrange
inputfile = '../data/catering_sale.xls' # 销量数据路径
outputfile = '../tmp/sales.xls' # 输出数据路径
data = pd.read_excel(inputfile) # 读入数据
row_indexs = (data[u'销量'] < 400) | (data[u'销量'] > 5000) #异常值
data.loc[row_indexs, u'销量'] = None # 过滤异常值,将其变为空值 loc为Selection by Label函数,即为按标签取数据 index为row_index 销量列的数据
# 自定义列向量插值函数
# s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s, n, k=5):
y = s.reindex(list(range(n - k, n)) + list(range(n + 1, n + 1 + k))) # reindex使它符合新的索引,如果索引的值不存在就填入空值,取前五和后五个值来进行插值
y = y[y.notnull()] # 剔除空值
return lagrange(y.index, list(y))(n) # scipy.interpolate.lagrange(x, y),最后的括号就是我们要插值的n
# 逐个元素判断是否需要插值
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]: # 如果data中i列的第j个值为null,只有if[True][j]程序才去判断j,False则忽略
data[i, j] = ployinterp_column(data[i], j)
data.to_excel(outputfile) # 输出结果,写入文件
输出:
没有插入空白处,还产生了很多列同样的数据?日期也没正确显示 日后再改
源代码为
data[u’销量’] [(data(u’销量’) < 400) | (data(u’销量’) > 5000)] = None
报错 ‘DataFrame’ object is not callable 改成上面的代码可以正常运行,出现此报错一般是变量名重复。相当于把(data(u’销量’) < 400) 也看作data[u’销量’] ?
处理方法:删除含有异常值的记录、视为缺失值、平均值修正、不处理
目的:将多个数据源合并存放在一个一致的数据存储中的过程
在数据集成时,来自多个数据源的现实世界实体的表达形式是不一样的,有可能不匹配,要考虑实体识别问题和属性冗余问题,从而将源数据在最底层上加以转换、提炼和集成。
实体识别:
任务是统一不同源数据的矛盾之处
冗余属性识别:
目的:对数据进行规范化处理,将数据转换为“适当的”形式,以适用于挖掘任务及算法的需要。
简单函数变换:
常用来将不具有正态分布的数据变换成具有正态分布的数据
规范化:
跳过代码 代入公式即可得到
以上三种离散方法代码实现:
参考
https://blog.csdn.net/YUBANGSHUANGYUER/article/details/103981481?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160310149819725271758589%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160310149819725271758589&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-1-103981481.pc_first_rank_v2_rank_v28&utm_term=python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B8%8E%E6%8C%96%E6%8E%98%E5%AE%9E%E6%88%98+4-3&spm=1018.2118.3001.4187
代码顺利运行:
#-*- coding: utf-8 -*-
#数据规范化
import pandas as pd
datafile = '../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
#等频率离散化
w = [1.0*i/k for i in range(k+1)] #列表解析 将1.0*i/k 放入w列表 即为w=[0.0 0.25 0.5 0.75 1.0]
w = data.describe(percentiles = w)[4:4+k+1] #前面是取几个分位数的值作为不等长列表,[4:4+k+1]没懂代表什么意思
w[0] = w[0]*(1-1e-10) #这个也没懂
#w是区间 可以自己指定 w=[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
#d2=pd.qcut(data,4,labels = range(k)) 如果是分成4个区间,可以使用qcut函数,4表示按照4分位数进行切割
d2 = pd.cut(data, w, labels = range(k)) #将data数组分成w个,名字为range(k)
from sklearn.cluster import KMeans #采用KMeans算法
kmodel = KMeans(n_clusters = k, n_jobs = 4) #建立模型选取4个点为初始点,n_jobs是并行数,一般等于CPU数较好
kmodel.fit(data.values.reshape((len(data), 1))) #训练模型.fit()求得训练集X的均值,方差,最大值,最小值,这些训练集X固有的属性。
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0) #输出聚类中心,并且排序(默认是随机序的)
w = c.rolling(2).mean().iloc[1:] #相邻两项求中点,作为边界点.python中切片不包括偏移值,iloc前闭后开 切片1行的数据
w = [0] + list(w[0]) + [data.max()] #把首末边界点加上 第0行和最大值
d3 = pd.cut(data, w, labels = range(k)) #离散成w区间,名字为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') #x=data[d==j],
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/principal_component.xls'
outputfile = '../tmp/dimention_reducted.xls' #降维后的数据
data = pd.read_excel(inputfile, header = None) #读入数据
from sklearn.decomposition import PCA
pca = PCA()
pca.fit(data)
pca.components_ #返回模型的各个特征向量
#降维
#low_d = pca.transform(data)
pca.explained_variance_ratio_ #返回各个成分各自的方差百分比
主成分分析的函数:
sklearn.decomposition.PCA(n_components = None, copy = True, whiten = False)
n_components:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n,缺省默认为None,所有成分被保留,赋值为Int。
copy:将原始数据复制一份
whiten:白化,使得每个特征具有相同的方差
特征值对应的特征向量就是理想中想取得正确的坐标轴,而特征值就等于数据在旋转之后的坐标上对应维度上的方差。
通常经过特征向量变换下的数据被称为变量的主成分,当前m个主成分累计的方差贡献率达到一个较高的百分数(如85%以上)的话,就保留着这m个主成分的数据。实现了对数据进行降维的目的。
从上面的结果可以得到特征方程有7个特征根
?
数值规约:
目的通过选择替代的、较小的数据来减少数据量,包括有参数方法和无参数方法两类。
有参数方法:使用模型来评估数据,只需存放参数,而不需要存放实际数据
无参数方法:需要存放实际数据