1.特征工程

1.探索性数据分析(EDA,Exploratory Data Analysis)
1.1 CSV格式数据

import pandas as pd 
df = pd.read_csv('iris.csv') df=df.ix[:,:4]

1.2 一次性写入

import pandas as pd
data=pd.DataFrame(数据源)
data.to_csv('文件名.csv',index = False,encoding = 'utf-8,mode='a'')  index= False的意思是不把index保存进文件中,mode='a'是表示以追加的方式加入文件中

1.3 追加,按行写入文件中

f=open(path,'a+',newline='')#newline设定可以让写出的csv中不包含空行
writer=csv.writer(f)
for row in range(b.shape[0]):
    writer.writerow(b.iloc[row])#按行将数据写入文件中
f.close()

1.4 json文件读取

data_list=[]
with open(r'data.json','r') as f:
    for line in f.readlines():
        dic = json.loads(line)
        data_list.append(dic)

1.5 数据替换
将df数据中的?替换为标准缺失值表示:df.replace(to_replace="?",value=np.nan)

1.6 查看数据
查看数据前5行:dataframe.head()
查看数据的信息,包括每个字段的名称、非空数量、字段的数据类型:data.info()
查看数据的统计概要(count/mean/std/min/25%/50%/75%max):data.describe()
查看dataframe的大小:dataframe.shape
按某列排序:正序(倒序)df.groupby(['列名']).cumcount()
对该列或该行进行值排序:sort_values(by="列名/行名")
数据相加:a.sum(axis=1) :a为数组,sum(axis=1)表示每行的数相加,平时不加axis则默认为0,为0表示每列的数相加

2.缺失值分析

2.1 查看缺失情况
dataframe.isnull() : 元素级别的判断,把对应的所有元素的位置都列出来,元素为空或者NA就显示True,否则就是False
dataframe.isnull().any() : 列级别的判断,只要该列有为空或者NA的元素,就为True,否则False
missing = dataframe.columns[ dataframe.isnull().any() ].tolist() :将为空或者NA的列找出来

2.2 解决方案
解决方案
直接删除含有缺失值的行/列:new_drop = dataframe.dropna ( axis=0,subset=["Age","Sex"] ) 【在子集中有缺失值,按行删除】
new_drop = dataframe.dropna ( axis=1) 【将dataframe中含有缺失值的所有列删除】

2.3 计算缺失值的个数,如果超过一定数,再删除

#去掉缺失值大的行
def miss_row(data):
    miss_row = data.isnull().sum(axis=1).reset_index()
    miss_row.columns = ['row','miss_count']
    miss_row_value = miss_row[miss_row.miss_count>500].row.values
    data.drop(miss_row_value,axis=0,inplace=True)
    return data

#去掉缺失值大的列
def miss_col(data):
    miss_col= data.isnull().sum(axis=0).reset_index()
    miss_col.columns = ['col','miss_count']
    miss_col_value = miss_col[miss_col.miss_count>200].col.values
    data.drop(miss_col_value,axis=1,inplace=True)
    return data

2.4 插补
对缺失值的插补大体可分为两种:替换缺失值,拟合缺失值,虚拟变量。替换是通过数据中非缺失数据的相似性来填补,其核心思想是发现相同群体的共同特征,拟合是通过其他特征建模来填补,虚拟变量是衍生的新变量代替缺失值
2.4.1 插补法(适用于缺失值少):
固定值插补:dataframe.loc [ dataframe [ column ] .isnull(),column ] = value # 将某一列column中缺失元素的值,用value值进行填充
均值插补:data.Age.fillna(data.Age.mean(),inplace=True) # 将age列缺失值填充均值。(偏正态分布,用均值填充,可以保持数据的均值)
中值插补:df['price'].fillna(df['price'].median()) # 偏长尾分布,使用中值填充,避免受异常值的影响
最近数据插补:
dataframe ['age'].fillna(method='pad') # 使用前一个数值替代空值或者NA,就是NA前面最近的非空数值替换
dataframe ['age'].fillna(method='bfill',limit=1) # 使用后一个数值替代空值或者NA,limit=1就是限制如果几个连续的空值,只能最近的一个空值可以被填充

2.4.2 拟合(适用于缺失值多)
回归预测:缺失值是连续的,即定量的类型,才可以使用回归来预测。
极大似然估计(Maximum likelyhood):在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂,且仅限于线性模型
多重插补(Mutiple imputation):多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值
随机森林:将缺失值作为目标变量

2.5 衍生(适用于缺失值多)
虚拟变量:通过判断特征值是否有缺失值来定义一个新的二分类变量。比如,特征为A含有缺失值,我们衍生出一个新的特征B,如果A中特征值有缺失,那么相应的B中的值为1,如果A中特征值没有缺失,那么相应的B中的值为0。

2.6 时间序列 python interpolate插值 重要

import numpy as np
#从scipy库中导入插值需要的方法 interpolate
from scipy import interpolate
#数据可视化,绘制散点图
import matplotlib.pyplot as plt
#定义函数  x:横坐标列表 y:纵坐标列表 kind:插值方式
f = interpolate.interp1d(x, y, kind='cubic')

插值方式:
nearest:最邻近插值法
zero:阶梯插值
slinear、linear:线性插值
quadratic、cubic:2、3阶B样条曲线插值

#定义新的横坐标列表
x_new=list(np.arange(0, 15, 0.5))
y_new=list(f(x_new))
plt.plot(x,y,'r',label='original values')
plt.plot(x_new,y_new,'b',label='interpolated values')
plt.show()
plt.close()

3.异常值分析

3.1 画数据的散点图。观察偏差过大的数据,是否为异常值;
plt.scatter(x1,x2)

3.2 画箱型图,箱型图识别异常值比较客观,因为它是根据3σ原则,如果数据服从正态分布,若超过平均值的3倍标准差的值被视为异常值
什么叫3σ准则:
在正态分布中σ代表标准差,μ代表均值。x=μ即为图像的对称轴
3σ原则为
数值分布在(μ-σ,μ+σ)中的概率为0.6826
数值分布在(μ-2σ,μ+2σ)中的概率为0.9544
数值分布在(μ-3σ,μ+3σ)中的概率为0.9974
可以认为,Y 的取值几乎全部集中在(μ-3σ,μ+3σ)]区间
内,超出这个范围的可能性仅占不到0.3%.

Percentile = np.percentile(df['length'],[0,25,50,75,100])
IQR = Percentile[3] - Percentile[1]
UpLimit = Percentile[3]+ageIQR*1.5
DownLimit = Percentile[1]-ageIQR*1.5
Ql为下四分位数:表示全部观察值中有四分之一的数据取值比它小; 
Qu为上四分位数:表示全部观察值中有四分之一的数据取值比它大; 
IQR称为四分位数间距:是上四分位数Qu和下四分卫数Ql之差,之间包含了全部观察值的一半。 
seaborn画boxplot
f,ax=plt.subplots(figsize=(10,8)) sns.boxplot(y='length',data=df,ax=ax) plt.show()

总结:异常值处理方式
视为缺失值:修补(平均数、中位数等)
直接删除:是否要删除异常值可根据实际情况考虑。因为一些模型对异常值不很敏感,即使有异常值也不影响模型效果,但是一些模型比如逻辑回归LR对异常值很敏感,如果不进行处理,可能会出现过拟合等非常差的效果。
不处理:直接在具有异常值的数据集上进行数据挖掘
平均值修正:可用前后两个观测值的平均值修正该异常值

4.特征分析
定量数据分布分析:绘制频率直方分布图
定性数据分布分析:根据变量的分类类型分组,绘制饼图和条形图来描述分布
样本分布是否偏斜:计算偏度和峰度

偏度
左偏,偏度<0;右偏,偏度>0,偏度的绝对值数值越大表示其分布形态的偏斜程度越大。
偏度公式
峰度

# 方法1:在series上计算偏度、峰度
import pandas as pd
x = [53, 61, 49, 66, 78, 47]
s = pd.Series(x)
print(s.skew())#偏度
print(s.kurt())#峰度

# 结果如下:
0.7826325504212567
-0.2631655441038463

# 方法2:直接在dataframe上计算偏度
data_frame2= pd.DataFrame({'A':[1,2,3,4],'b':[1,0,3,1]})
data_frame2.skew(axis = 0)

# 结果如下:
A    0.000000
b    1.129338
dtype: float64

绝对数对比
相对数对比(如结构相对数、比例相对数)
集中趋势度量:均值、中位数、众数
离中趋势度量:极差、标准差、变异系数(标准差/均值)、四分位数间距
帕累托法则(即为二八法则)
相关性:
绘制散点图、绘制散点图矩阵
计算相关系数(皮尔森相关系数、斯皮尔曼秩相关系数、判定系数)
//计算其他列与pearson列相关度
df.corr(method='pearson'),默认是pearson,还支持kendall/spearman

参考文献

posted @ 2019-12-02 10:40  yizuoming  阅读(321)  评论(0)    收藏  举报