jupyter NoteBook
导入包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
plt.style.use('ggplot')
from sklearn.base import BaseEstimator, TransformerMixin, RegressorMixin, clone
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import RobustScaler, StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.pipeline import Pipeline, make_pipeline
from scipy.stats import skew
from sklearn.decomposition import PCA, KernelPCA
from sklearn.preprocessing import Imputer
from sklearn.model_selection import cross_val_score, GridSearchCV, KFold
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, ExtraTreesRegressor
from sklearn.svm import SVR, LinearSVR
from sklearn.linear_model import ElasticNet, SGDRegressor, BayesianRidge
from sklearn.kernel_ridge import KernelRidge
from xgboost import XGBRegressor
第1步 读取数据
train = pd.read_csv('./data/train.csv')
test = pd.read_csv('./data/test.csv')
解决行和列显示不全的问题
#显示所有列
pd.set_option('display.max_columns', None)
#显示所有行
pd.set_option('display.max_rows', None)
#设置value的显示长度为100,默认为50
pd.set_option('max_colwidth',100)
第2步 探索性可视化 Exploratory Visualization
2-1
plt.figure(figsize=(15,8))
sns.boxplot(train.YearBuilt,train.SalePrice)
笔记 01: plt.figure画布设置
def figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=Figure, clear=False, **kwargs)
plt.figure常用参数:
num :如果此参数没有提供,则一个新的figure对象将被创建,同时增加figure的计数数值,此数值被保存在figure对象的一个数字属性当中。如果有此参数,且存在对应id的figure对象,则激活对于id的figure对象。如果对应id的figur对象不存在,则创建它并返回它。如果num的值是字符串,则将窗口标题设置为此字符串。
figsize:以英寸为单位的宽高,缺省值为 rc figure.figsize (1英寸等于2.54厘米)
plt.xlim,plt.ylim限制横坐标和纵坐标的显示范围
dpi:图形分辨率,缺省值为rc figure.dpi
facecolor:背景色
edgecolor:边框颜色
frameon:默认值True为绘制边框,如果为False则不绘制边框
FigureClass:matplotlib.figure.Figure派生类,从派生类创建figure实例
clear:重建figure实例
2-2
plt.figure(figsize=(12,6))
plt.scatter(x=train.GrLivArea,y=train.SalePrice)
plt.xlabel("GrLiveArea",fontsize = 13)
plt.ylabel("SalePrice",fontsize = 13)
plt.ylim(0,800000)
笔记 02 plt.scatter
绘制散点图
参数详解:
参数名称 | 描述 | 取值 |
---|---|---|
x,y | 长度相等的数组 | 输入数据 |
s | 标量或者数组,可选,默认为20 | size in points^2 |
c | 颜色序列 | rgb或rgba的二维数组 |
marker | 散点图点的形状 | 默认为‘o’,点.{".":点,”,“:像素,”v“:倒三角} |
cmap | Colormap对象,默认为:None | Colormap |
norm | Normalize | 数据亮度0-1,float数据 |
vmin,vmax | 亮度 | 若norm已使用,该参数无效 |
alpha | 透明度 | 0-1 |
linewidth | 标量或者数组,线的宽度 | ** |
根据可视化的结果可以做出合理的数据预处理
比如:
train.drop(train[(train['GrLivArea']>4000)&(train["SalePrice"]<300000)].index,inplace=True) #删除观察到的噪声点
第3步 数据清洗
3-1
full=pd.concat([train,test], ignore_index=True)#将训练集合测试集合并在一起处理
full.drop(['Id'],axis=1, inplace=True)#删除Id列,参数inplace为True时,替换原来的数据
full.shape
关于concat的使用详见pd.concat
3-2 统计为空的数据个数
aa = full.isnull().sum() #统计为空的数据个数
aa[aa>0].sort_values(ascending = Flase) ##个数按从大到小的顺序排列
3-3 填充数据为空列
cols1 = ["PoolQC" , "MiscFeature", "Alley", "Fence", "FireplaceQu", "GarageQual", "GarageCond", "GarageFinish", "GarageYrBlt", "GarageType", "BsmtExposure", "BsmtCond", "BsmtQual", "BsmtFinType2", "BsmtFinType1", "MasVnrType"]
for col in cols1:
full[col].fillna("None", inplace=True) ##为空的数据填充为字符串”None“,并替换原来的数据
full.groupby(['Neighborhood'])[['LotFrontage']].agg(['mean','median','count'])
**笔记03 groupby() **
一、groupby()分组
A. 分组操作
groupby()进行分组,GroupBy对象没有进行实际运算,只是包含分组的中间数据
按列名分组:obj.groupby(‘label’)
B. 分组运算
对GroupBy对象进行分组运算/多重分组运算,如mean()
非数值数据不进行分组运算
size() 返回每个分组的元素个数
C. 按照自定义的key分组
# 按自定义key分组,列表
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
print(df_obj.groupby(self_def_key).size())
# 按自定义key分组,多层列表
print(df_obj.groupby([df_obj['key1'], df_obj['key2']]).size())
# 按多个列多层分组
grouped2 = df_obj.groupby(['key1', 'key2'])
print(grouped2.size())
# 多层分组按key的顺序进行
grouped3 = df_obj.groupby(['key2', 'key1'])
print(grouped3.mean())
# unstack可以将多层索引的结果转换成单层的dataframe
print(grouped3.mean().unstack())
二、Groupby对象支持迭代操作
每次迭代返回一个元组 (group_name, group_data)
可用于分组数据的具体运算
for group_name, group_data in grouped1:
print(group_name)
print(group_data)
三、GroupBy对象可以转换成列表或字典
GroupBy对象转换list
print(list(grouped1))
GroupBy对象转换dict
print(dict(list(grouped1)))
四、进阶分组方法
· 按 (列 & 数据类型) 分组
```
print(df_obj.groupby(df_obj.dtypes, axis=1).size())
print(df_obj.groupby(df_obj.dtypes, axis=1).sum())
```
· loc和iloc分组
对于一个DataFrame A,A.loc[k]是读取A中index为k的那一行。A.iloc[k]是读取A中的第k行。
· 通过字典分组
mapping_dict = {'a':'Python', 'b':'Python', 'c':'Java', 'd':'C', 'e':'Java'}
print(df_obj2.groupby(mapping_dict, axis=1).size())
print(df_obj2.groupby(mapping_dict, axis=1).count()) # 非NaN的个数
print(df_obj2.groupby(mapping_dict, axis=1).sum())
· 通过索引级别分组
# 通过索引级别分组
columns = pd.MultiIndex.from_arrays([['Python', 'Java', 'Python', 'Java', 'Python'],
['A', 'A', 'B', 'C', 'B']], names=['language', 'index'])
df_obj4 = pd.DataFrame(np.random.randint(1, 10, (5, 5)), columns=columns)
print(df_obj4)
# 根据language进行分组
print(df_obj4.groupby(level='language', axis=1).sum())
# 根据index进行分组
print(df_obj4.groupby(level='index', axis=1).sum())
笔记04 agg()聚合
数据产生标量的过程,如mean(),count()等,常用于对分组后的数据进行计算
一、内置的聚合函数
sum(),mean(),max(),min(),count(),size(),describe()
函数名 | 说明 |
---|---|
count | 分组中非NA值的数量 |
sum | 非NA值的和 |
mean | 非NA值的平均值 |
median | 非NA值的算术中位数 |
std,var | 无偏(分母为n-1)标准差和方差 |
min,max | 非NA值的最小值和最大值 |
prod | 非NA值的积 |
first,last | 第一个和最后一个非NA值 |
print(df_obj5.groupby('key1').sum())
print(df_obj5.groupby('key1').max())
print(df_obj5.groupby('key1').min())
print(df_obj5.groupby('key1').mean())
print(df_obj5.groupby('key1').size())
print(df_obj5.groupby('key1').count())
print(df_obj5.groupby('key1').describe())
二、可自定义函数,传入agg方法中
grouped.agg(func)
func的参数为groupby索引对应的记录
def peak_range(df):
"""
返回数值范围
"""
#print type(df) #参数为索引所对应的记录
return df.max() - df.min()
print(df_obj5.groupby('key1').agg(peak_range))
print(df_obj.groupby('key1').agg(lambda df : df.max() - df.min()))
三、应用多个聚合函数
print(df_obj.groupby('key1').agg(['mean', 'std', 'count', peak_range])) # 默认列名为函数名
print(df_obj.groupby('key1').agg(['mean', 'std', 'count', ('range', peak_range)])) # 通过元组提供新的列名
四、对不同的列分别作用不同的聚合函数,使用dict
# 每列作用不同的聚合函数
dict_mapping = {'data1':'mean',
'data2':'sum'}
print(df_obj.groupby('key1').agg(dict_mapping))
dict_mapping = {'data1':['mean','max'],
'data2':'sum'}
print(df_obj.groupby('key1').agg(dict_mapping))
五、分组后修改列名称
dict_obj = {'key1' : ['a', 'b', 'a', 'b',
'a', 'b', 'a', 'a'],
'key2' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'data1': np.random.randint(1, 10, 8),
'data2': np.random.randint(1, 10, 8)}
df_obj = pd.DataFrame(dict_obj)
print(df_obj)
# 按key1分组后,计算data1,data2的统计信息并附加到原始表格中,并添加表头前缀
k1_sum = df_obj.groupby('key1').sum().add_prefix('sum_')
print(k1_sum)
笔记05 补充
一、transform
transform的计算结果和原始数据的形状保持一致,
如:grouped.transform(np.sum).
# 方法2,使用transform
k1_sum_tf = df_obj.groupby('key1').transform(np.sum).add_prefix('sum_')
df_obj[k1_sum_tf.columns] = k1_sum_tf
print(df_obj)
二、merge(持续更新)
k1_sum_merge = pd.merge(df_obj, k1_sum, left_on='key1', right_index=True)
print(k1_sum_merge)
三、apply(待补充)