前言
这篇文章是通过一个简单的数据认识pandas在数据预处理上的一个运用,这个也是写给自己以后当作参考手册用的,部分步骤缺少Python代码,后面会加上,本文可能较为简单,不适合大神;本文的数据是书名《机器学习系统设计》第一章的数据,数据处理上不参考书里
环境背景:
python环境:2.7
工具:Pycharm
1、读入数据
导入我们想要的包,自带习惯导入一些我经常用的包;
# -*- coding: UTF-8 -*-
import numpy as np
import matplotlib as plt
import pandas as pd
import sys as sys
设置一下我们的中文环境,如果不设置,部分人存放路径存在中文,这样在读入路径的无法识别
reload(sys)
sys.setdefaultencoding("utf-8")
先将我们的要读取的文件或者数据存到一个变量中,指定编码格式,因为路径存在中文
path=r'E:\夏尔康个人学习数据\1400OS_Code\1400OS_01_Codes\data/web_traffic.tsv'.encode('gbk')
然后通过read_csv()函数读入数据,并不是说只能读CSV格式的,可以通过SEP参数指定分隔符读取其他格式的,因为我们这个数据是不存在列名行,所以使用我们这个学习数据就是tsv格式的,分隔符是\t,然后通过head(),函数查看前几行
dataSet=pd.read_csv(path,sep='\t',header=None)
print dataSet.head()
数据已经成功导入,需要修改一下列名,先通过dtypes打印一下各个列名
print dataSet.dtypes
dataSet.rename(columns={0:'x',1:'y'},inplace=True)
print dataSet.dtypes
从上结果上看,我们已经修改成功了;
当然我们还可以使用read_csv函数里面的names参数,在读入的时候进行指定。
columns_name=["x","y"]
dataSet=pd.read_csv(path,sep='\t',header=None,names=columns_name)
print dataSet.dtypes
当然我们还可以这样进行读入数据,这个不靠pandas包里的read_csv()函数
#定义两个变量
x=[]
y=[]
path=r'E:\夏尔康个人学习数据\1400OS_Code\1400OS_01_Codes\data/web_traffic.tsv'.encode("gbk")
content=open(path,'r')
for line in content:
dataSet_x,dataSet_y=line.split("\t")
x.append(float(dataSet_x))
y.append(float(dataSet_y))
# 合成数据框
dataSet = pd.DataFrame()
dataSet["x"] = x
dataSet["y"] = y
print dataSet
这个结果上看和上诉的操作结果相同
2、处理缺失值
缺失值是我们数据分析中要面临的,如何处理缺失值的话有多个方法,大致说下常见的缺失值处理方法
2-1删除缺失值
这个删除又分行删除和列删除,这个删除操作慎用
2-2最大似然估计:
就是根据各个属性出现的概率组合找出概率最大的值,这个使用的前提是各个属性是相互独立的
2-3填补缺失值
K近邻填补法:过距其最近的k个邻居来估计缺失值,各个邻居对应的权重基于该邻居到具有缺失值样本的距离加权得到
中位数插补:使用非缺失值的中位数插补
变量相关性插补:找出相关性较强的属性,然后建立回归模型,得到预测结果
这里简单起见我就使用了均值插补法,不过在插补前我们先确定一下各个属性的缺失值分布,接下来我们看看这个数据框的大体分布,使用pandas包里的describe()函数,
print dataSet.describe()
从这个结果上看,这个数据集总共有743条记录,在Y列上存在空值,因为X和Y的count出来的结果不一致,假如数据框存在很多个列,我们想要知道空值在各个列上的情况呢?我们使用apply函数计算一下,isnull会判断是否为空生成一个布尔变量,True=1或者Flase=0,通过sum()求和就可知空值有几个
def null_count(dataset):
return sum(dataset.isnull())
print dataSet.apply(null_count,axis=0)#axis=0指定列,1为行
从打印结果上来看,X列不存在空值,但是Y列上存在8个值,一个个看实在是有点费力,我这里将结果写入到一个DataFrame里面去,代码逻辑简单可以在这基础上加复杂西额,不解释太多了
def ColumnNull(data):
columnList=data.columns
df=pd.DataFrame(columns=['columnName','count','null_count','nullPer'])
for column in columnList:
columnName=column
null_count=len(dataSet[dataSet[column].isnull().values==True])
count=len(dataSet)
nullPer=float(null_count)/count
df.loc[len(df)]=[columnName, count, null_count, nullPer]
print df
ColumnNull(dataSet)
在Y列的缺失值占到了0.01,其实可以直接删除掉即可 ,不过这里我选用这个列的均值代替缺失值
mean=dataSet.mean()['y']
dataSet["y"].fillna(mean,inplace=True)
ColumnNull(dataSet)
从上面的结果上看缺失值已经被替换
3、数据映射与哑变量处理
因为有时候我们需要对Y列各个值进行一个等级判断,所以我们要新增一个列LEVEL,操作顺序是设置切割点,和标签,将新生成的列加入到原有的数据框
point=[0,2000,3000,4000,5906]#切割的范围要包括全部点
point_labels=[1,2,3,4]
dataSet["flux_level"]=pd.cut(dataSet["y"],point,labels=point_labels)
接下来我们先看看在各个LEVEL下的Y均值均值和记录数,这里我们使用groupby函数
grouped_mean=dataSet["y"].groupby(dataSet["flux_level"])
grouped_count=dataSet["flux_level"].groupby(dataSet["flux_level"])
#打印结果
print "the flux_level mean is :",grouped_mean.mean()
print "the flux_level count is :",grouped_count.count()
3.1生成哑变量
因为有时候我们需要对离散变量进行生成哑变量,这是为了能将变量转换为模型能够使用,这里pandas的get_dummies()函能够很好的支持,生成的哑变量名使用prefix参数,意思是属性名前缀,然后将生成的哑变量数据库和原数据框通过join进行根据索引进行连接
dataSet_dum=pd.get_dummies(dataSet["flux_level"],prefix='level')
dataSet=dataSet.join(dataSet_dum)
print dataSet.head()
数据预处理还包括:
异常值的处理
数据集成
数据归约
数据变换等步骤
先给自己挖个坑