使用pandas构建简单直观的数据科学分析流程
原文博客
本文目的:
我们将展示如何使用一个名为pdpipe的小库使用Pandas构建直观而有用的分析流程(管道)。
简介
Pandas是Python中用于数据分析和机器学习的库。它在Excel/CSV文件和Scikit学习或TensorFlow形成了完美的桥梁。
数据科学分析流程通常是一系列步骤:数据集必须经过清理、缩放和验证,然后才能准备好被强大的机器学习算法使用。当然,这些任务可以通过Pandas等包提供的许多函数/方法来完成,但更优雅的方法是使用管道。在几乎所有情况下,流水线通过自动化重复的任务减少了出错的机会并节省了时间。在数据科学领域,具有管道特性的包的例子是R语言中的dplyr和Python中的Scikit learn。
A data science flow is most often a sequence ofsteps — datasets must be cleaned,scaled, and validated before they can be ready to be used
数据
我们将使用美国房价数据集。我们可以在Pandas中加载数据集,并将其摘要统计信息显示如下:
最简单的管道——一个操作,我们从最简单的管道开始,由一个操作组成(不要担心,我们很快就会增加复杂性)。假设机器学习团队和领域专家说,他们认为我们可以安全地忽略用于建模的平均面积房屋年龄数据。因此,我们将从数据集中删除此列。对于此任务,我们使用pdpipe中的ColDrop方法创建一个管道对象drop-age,并将数据帧传递到此管道。
仅仅通过添加管道来实现管道的链式阶段只有当我们能够进行多个阶段时才是有用和实用的。有多种方法可以在pdpipe中执行此操作。然而,最简单和最直观的方法是使用+运算符。这就像手工连接管道!比方说,除了删除age列之外,我们还希望对House_size列进行一次热编码,以便可以在数据集上轻松运行分类或回归算法。
读取数据
# -*- coding: utf-8 -*-
"""
Created on Wed Dec 4 20:51:39 2019
@author: czh
"""
%reset -f
%clear
# In[*]
import os
import pandas as pd
os.chdir('C:\\Users\\czh\\Desktop')
# In[*]
dta = pd.read_csv('USA_Housing.csv', sep=',', header=0)
dta.columns
Index(['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms',
'Avg. Area Number of Bedrooms', 'Area Population', 'Price', 'Address'],
dtype='object')
根据观测值转换列属性
# In[*]
def size(n):
if n<= 4:
return 'small'
elif 4< n<=6:
return 'medium'
else:
return 'big'
dta['House_size'] = dta['Avg. Area Number of Rooms'].apply(size)
从下图中可以看出新生成的House_size列,当原文的数据(Avg. Area Number of Rooms列)的值<= 4时,为small,当值4< n<=6为medium,当值>6时为big。
删除某一列
# In[*]
import pdpipe as pdp
drop_age = pdp.ColDrop('Avg. Area House Age')
df2 = drop_age(dta)
对某一列进行热编码
# In[*]
pipeline = pdp.ColDrop('Avg. Area House Age')
pipeline+= pdp.OneHotEncode('House_size')
df3 = pipeline(dta)
df3.columns
整合示例:
如下述代码所示:
1.删除'Avg. Area House Age'列
2.'House_size'列热编码
3.对Price列进行price_tag函数转换,然后删除Price列
4.挑选'Price_tag'列值为'drop'的观察值
# In[*]
def price_tag(x):
if x>250000:
return 'keep'
else:
return 'drop'
# In[*]
#删除'Avg. Area House Age'列
pipeline = pdp.ColDrop('Avg. Area House Age')
#'House_size'列热编码
pipeline+= pdp.OneHotEncode('House_size')
#对Price列进行price_tag函数转换,然后删除Price列
pipeline+=pdp.ApplyByCols('Price',price_tag,'Price_tag',drop=False)
#挑选'Price_tag'列值为'drop'的观察值
pipeline+=pdp.ValDrop(['drop'],'Price_tag')
df5 = pipeline(dta)
df5.columns
在这里,我们应用Scikit学习包中的StandardScaler将数据标准化,转换后可以用于聚类或神经网络拟合。我们可以有选择地排除不需要缩放的列,比如说这里排除House_size_Medium和House_size_Small列。
# In[*]
pipeline_scale = pdp.Scale('StandardScaler',
exclude_columns= ['House_size_medium','House_size_small'])
df6 = pipeline_scale(df5)