DW数据清洗及特征处理


数据清洗及特征处理可以让数据看起来规律性更强,为后面操作做铺垫。

我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的亚子。

1 缺失值观察与处理

我们拿到的数据经常会有很多缺失值,比如我们可以看到Cabin列存在NaN,那其他列还有没有缺失值,这些缺失值要怎么处理呢

1.1 任务一:缺失值观察
(1) 请查看每个特征缺失值个数
(2) 请查看Age, Cabin, Embarked列的数据
以上方式都有多种方式,所以大家多多益善

#方法一
df.info()
#方法二
df.isnull().sum()  #缺失值(为空)的个数
df.isna().sum() #缺失值的个数

输出一样

PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

1.2 任务二:对缺失值进行处理
(1)处理缺失值一般有几种思路

(2) 请尝试对Age列的数据的缺失值进行处理

(3) 请尝试使用不同的方法直接对整张表的缺失值进行处理

#处理缺失值的一般思路:
#提醒:可使用的函数有--->dropna函数与fillna函数
#将空值怎么变成了NaN
df[df['Age'] == np.nan] = 0
df.loc[5:7,'Age']
#df[df['Age']==None]=0
df.loc[5:7,'Age']
5     NaN
6    54.0
7     2.0
Name: Age, dtype: float64
#age 是有空值,不是NaN,所以用isnull
df[df['Age'].isnull()] = 0 # 这是将一整行变成了0 是不对的
df.loc[5:7]
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
5000000.00000.000000
6701McCarthy, Mr. Timothy Jmale54.0001746351.8625E46S
7803Palsson, Master. Gosta Leonardmale2.03134990921.0750NaNS

检索空缺值用np.nan要比用None好,数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到,比较的时候最好用np.nan

#正解
"""
·dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
axis=0按行删除,1按列
how:'any','all'
thresh要求保留的非NA值个数 eg.thresh=2 仅保留至少具有2个非NA值的行/列
subset=['列名1', '列名2']定义要在哪些列中查找缺失值
inplace=True/False 为True时对原数据进行永久性修改
例子:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html
"""
df.dropna(axis=0,how='any').head(3) #默认按行axis=0,方式any
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
6701McCarthy, Mr. Timothy Jmale54.0001746351.8625E46S
"""
·fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
value缺失数据填充的值
method:ffill/bfill 将上一个有效观测向前传播到下一个缺失值里,也就是将缺失值前面的数填到缺失的地方(感觉是按列) 
limit=n:替换每一列的前n个NaN元素 
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
"""
df.fillna(0).head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.25000S
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.92500S
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.05000S

2 重复值观察与处理

由于这样那样的原因,数据中会不会存在重复值呢,如果存在要怎样处理呢

df.duplicated() #查看是否有重复的行(两行所有列完全一样算重复)
#也可以对特定的列进行重复项判断
df.duplicated(['Age'])
#删除重复行
"""有一个keep参数
当keep=False时,就是去掉所有的重复行 
当keep=‘first’时,就是保留第一次出现的重复行 
当keep=’last’时就是保留最后一次出现的重复行。
"""
df.drop_duplicates().head(3)

3 特征观察与处理

我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征

数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。
文本型特征往往需要转换成数值型特征才能用于建模分析。

3.1 任务一:对连续型特征(年龄)进行分箱(离散化)处理

#分箱操作是什么:
#将连续型变量分到不同箱子里成为离散型变量
#平均分箱成5个年龄段
#【参考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.cut.html
df['AgeBand'] = pd.cut(df['Age'], 5,labels = ['1','2','3','4','5'])
df.head(3)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedAgeBand
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS2
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C3
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS2
#划分为(0,5](5,15] (15,30] (30,50] (50,80]五个年龄段
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = ['1','2','3','4','5'])
df.head(3)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedAgeBand
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS3
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C4
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS3
#按10% 30% 50 70% 90%五个年龄段分箱
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = ['1','2','3','4','5'])  
#存疑
#【参考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.qcut.html
df.head(3)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedAgeBand
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS2
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C5
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS3

3.2 任务二:对文本型特征转换成数值型特征的方法

#(1) 查看类别文本变量名及种类
print(df['Sex'].value_counts())  #返回每个元素的值有多少 
print(df['Sex'].unique())   #返回所有唯一值
print(df['Sex'].nunique())  #返回唯一值的个数
male      577
female    314
Name: Sex, dtype: int64
['male' 'female']
2
#(2)将文本变量Sex, Cabin ,Embarked用数值变量12345表示 
#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head(3)

#方法二: map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2}) #map一个映射,没有映射的自变量会变成NaN
df.head(3)
#方法三: 使用sklearn.preprocessing的LabelEncoder
#存疑????????????????????
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()  
    
    label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
    df[feat + "_labelEncode"] = df[feat].map(label_dict)
#     df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))

df.head(3)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedAgeBandSex_numCabin_labelEncodeTicket_labelEncode
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS210.00
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C521.01
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS320.02
# (3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示

#  OneHotEncoder
for feat in ["Age", "Embarked"]:
#     x = pd.get_dummies(df["Age"] // 6)
#     x = pd.get_dummies(pd.cut(df['Age'],5))
    x = pd.get_dummies(df[feat], prefix=feat)
    df = pd.concat([df, x], axis=1)
    #df[feat] = pd.get_dummies(df[feat], prefix=feat)
    
df.head(3)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFare...Age_65.0Age_66.0Age_70.0Age_70.5Age_71.0Age_74.0Age_80.0Embarked_CEmbarked_QEmbarked_S
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500...0000000001
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833...0000000100
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250...0000000001

3 rows × 107 columns

3.3 任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)

df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False) 
#.(点号)-匹配除'\ n'的任意字符
"""
expand=True不加的话,df1中将只有一列,其实就是一个series。
当然,可以直接将这列加到df中:df[['新列名']]直接将新的两列加入原先dataframe中"""
df.head(3)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFare...Age_66.0Age_70.0Age_70.5Age_71.0Age_74.0Age_80.0Embarked_CEmbarked_QEmbarked_STitle
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500...000000001Mr
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833...000000100Mrs
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250...000000001Miss

3 rows × 108 columns

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
传统数据仓库分析 大数据分析 传统分析对已知的数据范围中好理解的数据进行分析。大多数数据仓库都有一个精致的提取、转换和加载(ETL)的流程和数据库限制,这意味着加载进数据仓库的数据是容易理解的,洗清过的,并符合业务的元数据。 大数据最大的优点是针对传统手段捕捉到的数据之外的非结构化数据。这意味着不能保证输入的数据是完整的,清洗过的和没有任何的错误。这使它更有挑战性,但同时它提供了在数据中获得更多的洞察力的范围。 传统分析是建立在关系数据模型之上的,主题之间的关系在系统内就已经被创立,而分析也在此基础上进行。 在典型的世界里,很难在所有的信息间以一种正式的方式建立关系,因此非结构化以图片、视频、移动产生的信息、无线射频识别(RFID)等的形式存在,被考虑进大数据分析。绝大多数的大数据分析数据库基于纵列数据库之外。 传统分析与大数据分析的对比全文共3页,当前为第1页。传统分析是定向的批处理,而且我们在获得所需的洞察力之前需要每晚等待提取、转换和加载(ETL)以及转换工作的完成。 传统分析与大数据分析的对比全文共3页,当前为第1页。 大数据分析是利用对数据有意义的软件的支持针对于数据的实时分析。 在一个传统的分析系统中,平行是通过昂贵的硬件,如大规模并行处理(MPP)系统和/或对称多处理(SMP)系统来实现的。 当在市场上有大数据分析的应用系统时,它同样可以通过通用的硬件和新一代的分析软件,像Hadoop或其他分析数据库来实现。 主要的IT公司对分析软件和应用系统供应商的购买已经成为一种日常现象。我们已经看到"大数据分析"这个词汇被使用在许多企业的解决方案中。 "大数据"是用来表示大量的没有按照传统的相关格式存储在企业数据库中的非结构化数据的总术语。以下是大数据的一般特点。 数据存储量相对于当前企业TB(TERA BYTES)字节的存储限制,定义在PB(PETA BYTES)字节,EXA字节以及更高的容量顺序。 通常它被认为是非结构化数据,并不适合企业已经习惯使用的关系型数据库之下 数据的生成使用的是数据输入非传统的手段,像无线射频识别(RFID),传感器网络等。 数据对时间敏感,且由数据的收集与相关的时区组成。 在过去,专业术语"分析"应用于商业智能(BI)世界来提供工具和智能,通过对各种各样可能的信息视角的快速的、一致的、交互式访问获得洞察力。 与分析的概念非常接近,数据挖掘已经应用于企业以保持关键监测和海量信息的分析。最大的挑战就是如何通过大量的数据挖掘出所有的隐藏信息。 传统数据仓库(DW)分析相对于大数据分析 企业数据的分析朝着在一段时间内在那种内容中的信息的有意义的洞察,是大数据分析区别于传统数据仓库分析的原因所在。下表总结了一些它们之间的差别。 传统分析与大数据分析的对比全文共3页,当前为第2页。 大数据分析用例 基于用例,企业可以理解大数据分析的价值和在大数据分析的帮助下如何解决传统的问题。以下是一些用法。 客户满意度和保证分析:也许这是基于产品的企业所担心的最大的一个领域。在当今时代,没有一个清晰的方式来衡量产品的问题和与客户满意度相关的问题,除非他们以一个正式的方式出现在一个电子表格中。 信息质量方面,它是通过各种外部渠道收集的,而且大多数时候的数据没有清洗 因为数据是非结构化数据,无法关联相关的问题,所以长期的解决方案提供给客户 分类和分组的问题陈述都缺失了,导致企业不能对问题进行分组 从上面的讨论中,对客户满意度和保证分析使用大数据分析将帮助企业在急需的客户注意力设置中获得洞察力,并有效地解决他们的问题以及在他们的新产品线上避免这些问题。 竞争对手的市场渗透率分析:在今天高度竞争的经济环境下,我们需要通过一种实时分析对竞争者强大的区域和他们的痛点进行衡量。这种信息是可适用于各种各样的网站、社交媒体网站和其他公共领域。对这种数据的大数据分析可以向企业提供关于他们产品线的优势、劣势、机遇、威胁等非常需要的信息。 医疗保健/流行病的研究和控制:流行病和像流感这样的季节性疾病在人群中以一定的模式开始,如果没有及早发现和控制,它们就会传播到更大的区域。这对发展中以及发达的国家都是一个最大的挑战。当前绝大部分时间的问题是人们之间的症状各异,而且不同的医护人员治疗他们的方法也不同。人群中也没有一种常见的症状分类。在这种典型的非结构化数据上采用大数据分析将有助于地方ZF有效地应对疫情的情况。 产品功能和用法分析:大多数产品企业,尤其是消费品,不断在他们的产品线上增加许多功能,但有可能一些功能不会真正地被顾客所使用,而有些功能则更多地被使用,对这种通过各种移动设备和其它基于无线射频识别(RFID)输入捕捉到的数据的有效分析,可以为产品企业提供有价值的洞察力。 未来方向的分析:研究小组分析在各种业务中的趋势,而这种信息通过行业
⼤数据什么是 ⼤数据什么是ETL ETL 概念 概念 ETL 这个术语来源于数据仓库,ETL 指的是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程。ETL 的⽬的是将企业中的 分散、零乱、标准不统⼀的数据整合到⼀起,为企业的决策提供分析依据。 ETL是 BI 项⽬重要的⼀个环节。 通常情况下,在 BI 项⽬中 ETL 会花掉整个项⽬⾄少 1/3 的时间,ETL 设计的好坏直接关接到 BI 项⽬的成 败。 BI 即商务智能,它是⼀套完整的解决⽅案,⽤来将企业中现有的数据进⾏有效的整合,快速准确地提供报表并提出决策依据,帮助企业 做出明智的业务经营决策。 ETL 的设计分三部分:数据抽取(extract)、数据的清洗转换(transform)、数据的加载(load)。 在设计 ETL 的时候我们也是从这三部分出发。 数据的抽取是从各个不同的数据源抽取到 ODS(Operational Data Store,操作型数据存储,即⼀种常被⽤作数据仓库临时区域的数据库) 中,这个过程也可以做⼀些简单的数据的清洗和转换。在抽取的过程中需要挑选不同的抽取⽅法,尽可能的提⾼ ETL 的运⾏效率。 ETL 三个部分中,花费时间最长的是 "T"(Transform,清洗、转换) 的部分,⼀般情况下这部分⼯作量是整个 ETL 的2/3。 数据的加载⼀般在数据清洗完了之后直接写⼊ DW(Data Warehousing,数据仓库) 中去。 ETL 的实现有多种⽅法,常⽤的有三种。 借助 ETL ⼯具(如 Oracle的 OWB、SQL Server 2000 的 DTS、SQL Server2005 的 SSIS 服务、Informatic 等) 实现 使⽤ SQL ⽅式实现 ETL ⼯具和 SQL 相结合 前两种⽅法各有各的优缺点,借助⼯具可以快速的建⽴起 ETL ⼯程,屏蔽了复杂的编码任务,提⾼了速度,降低了难度,但是缺少灵活 性。SQL 的⽅法优点是灵活,提⾼ ETL 运⾏效率,但是编码复杂,对技术要求⽐较⾼。第三种是综合了前⾯⼆种的优点,会极⼤地提⾼ ETL 的开发速度和效率。 数据的抽取( 数据的抽取(Extract) ) 这⼀部分需要在调研阶段做⼤量的⼯作,⾸先要搞清楚数据是从⼏个业务系统中来,各个业务系统的数据库服务器运⾏什么 DBMS,是否存在 ⼿⼯数据,⼿⼯数据量有多⼤,是否存在⾮结构化的数据等等,当收集完这些信息之后才可以进⾏数据抽取的设计。 1、对于与存放 、对于与存放 DW 的数据库系统相同的数据源处理⽅法 的数据库系统相同的数据源处理⽅法 这⼀类数据源在设计上⽐较容易。⼀般情况下,DBMS(SQLServer、Oracle)都会提供数据库链接功能,在 DW 数据库服务器和原业务系统 之间建⽴直接的链接关系就可以写 Select 语句直接访问。 2、对于与 、对于与 DW 数据库系统不同的数据源的处理⽅法 数据库系统不同的数据源的处理⽅法 对于这⼀类数据源,⼀般情况下也可以通过 ODBC 的⽅式建⽴数据库链接——如 SQL Server 和 Oracle 之间。如果不能建⽴数据库链接, 可以有两种⽅式完成,⼀种是通过⼯具将源数据导出成 .txt 或者是 .xls ⽂件,然后再将这些源系统⽂件导⼊到 ODS 中。另外⼀种⽅法是通 过程序接⼝来完成。 3、对于⽂件类型数据源 、对于⽂件类型数据源(.txt,.xls),可以培训业务⼈员利⽤数据库⼯具将这些数据导⼊到指定的数据库,然后从指定的数据库中抽取。或者还可以借助⼯具实 ,可以培训业务⼈员利⽤数据库⼯具将这些数据导⼊到指定的数据库,然后从指定的数据库中抽取。或者还可以借助⼯具实 现。 现。 4、增量更新的问题 、增量更新的问题 对于数据量⼤的系统,必须考虑增量抽取。⼀般情况下,业务系统会记录业务发⽣的时间,我们可以⽤来做增量的标志,每次抽取之前⾸先判 断 ODS 中记录最⼤的时间,然后根据这个时间去业务系统取⼤于这个时间所有的记录。利⽤业务系统的时间戳,⼀般情况下,业务系统没 有或者部分有时间戳。 数据的清洗转换( 数据的清洗转换(Cleaning、 、Transform) ) ⼀般情况下,数据仓库分为 ODS、DW 两部分。通常的做法是从业务系统到 ODS 做清洗,将脏数据和不完整数据过滤掉,在从 ODS 到 DW 的过程中转换,进⾏⼀些业务规则的计算和聚合。 1、 、 数据清洗 数据清洗 数据清洗的任务是过滤那些不符合要求的数据,将过滤的结果交给业务主管部门,确认是否过滤掉还是由业务单位修正之后再进⾏抽取。 不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三⼤类。 不完整的数据:这⼀类数据主要是⼀些应该有的信息缺失,如供应商的名称、分公司的名称、客户的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值