宝马娱乐在线城-宝马娱乐在线

来自 世界互联 2019-12-17 08:27 的文章
当前位置: 宝马娱乐在线城 > 世界互联 > 正文

数据科学入门的5个技巧

原标题:数据科学入门的5个技巧

此教程适合有pandas基础的童鞋来看,很多知识点会一笔带过,不做详细解释

很多人问我数据科学和数据分析的最大区别是什么。有的人认为两者没有区别,有的人则认为两者千差万别。我认为,尽管两者确实存在很多不同之处,但最大的不同在于数据科学严格遵循结构化、一步一步的操作过程,保证了分析结果的可靠性。

Pandas数据格式

和其他科学研究一样,这些过程必须被严格执行,否则分析结果将不可靠。再直白一点,对于外行的数据科学家,严格遵循这些过程将能够快速获得准确结果。反之,如果没有清晰的路线图,则分析结果很难得到保证。

  • Series
  • DataFrame:每个column就是一个Series

    基础属性shape,index,columns,values,dtypes,describe(),head(),tail()
    统计属性Series: count(),value_counts(),前者是统计总数,后者统计各自value的总数

宝马娱乐在线城 1


虽然这些步骤更多是写给业余分析师的指引,但它们同样是数据科学家,甚至更严格的商业分析和学术分析的基础。每一位数据科学家都理解这些步骤的重要意义,会在实践过程中严格遵守它们。

df.isnull() df的空值为True
df.notnull() df的非空值为True

5个步骤概览

  • 修改列名

数据科学的5个必备步骤分别是:

(1)提出有意思的问题;

df.rename(columns = {'key':'key2'},inplace=True)

(2)获取数据;

  • 更改数据格式astype()

(3)探索数据;

(4)数据建模;

isin                 #计算一个“Series各值是否包含传入的值序列中”的布尔数组
unique               #返回唯一值的数组
value_counts         #返回一个Series,其索引为唯一值,值为频率,按计数降序排列

(5)可视化和分享结果。


首先,我们从宏观上了解以上5个步骤。

数据清洗

  • 丢弃值drop()
df.drop(labels, axis=1)# 按列(axis=1),丢弃指定label的列,默认按行。。。
  • 丢弃缺失值dropna()
# 默认axi=0(行);1(列),how=‘any’
df.dropna()#每行只要有空值,就将这行删除
df.dropna(axis=1)#每列只要有空值,整列丢弃
df.dropna(how='all')# 一行中全部为NaN的,才丢弃该行
df.dropna(thresh=3)# 每行至少3个非空值才保留
  • 缺失值填充fillna()
df.fillna(0)
df.fillna({1:0,2:0.5}) #对第一列nan值赋0,第二列赋值0.5
df.fillna(method='ffill') #在列方向上以前一个值作为值赋给NaN
  • 值替换replace()
# 将df的A列中 -999 全部替换成空值
df['A'].replace(-999, np.nan)
#-999和1000 均替换成空值
obj.replace([-999,1000],  np.nan)
# -999替换成空值,1000替换成0
obj.replace([-999,1000],  [np.nan, 0])
# 同上,写法不同,更清晰
obj.replace({-999:np.nan, 1000:0})
  • 重复值处理duplicated(),unique(),drop_duplictad()
df.duplicated()#两行每列完全一样才算重复,后面重复的为True,第一个和不重复的为false,返回true
               #和false组成的Series类型
df.duplicated('key')#两行key这一列一样就算重复

df['A'].unique()# 返回唯一值的数组(类型为array)

df.drop_duplicates(['k1'])# 保留k1列中的唯一值的行,默认保留第一行
df.drop_duplicates(['k1','k2'], take_last=True)# 保留 k1和k2 组合的唯一值的行,take_last=True 保留最后一行

1.1.1 提出有意思的问题

排序

  • 索引排序
# 默认axis=0,按行索引对行进行排序;ascending=True,升序排序
df.sort_index()
# 按列名对列进行排序,ascending=False 降序
df.sort_index(axis=1, ascending=False) 
  • 值排序
# 按值对Series进行排序,使用order(),默认空值会置于尾部
s = pd.Series([4, 6, np.nan, 2, np.nan])
s.order()

df.sort_values(by=['a','b'])#按列进行排序
  • 排名
a=Series([7,-5,7,4,2,0,4])
a.rank()#默认method='average',升序排名(ascending=True),按行(axis=0)
#average 值相等时,取排名的平均值
#min 值相等时,取排名最小值
#max 值相等时,取排名最大值
#first值相等时,按原始数据出现顺序排名

这是我最喜欢的一步。作为一个创业者,我经常问自己(和他人)很多有意思的问题。我像对待头脑风暴会议一样对待这一步。现在开始写下问题,不要关心回答这些问题所需的数据是否存在。这样做的原因有两个。

索引设置

  • reindex()
    更新index或者columns,
    默认:更新index,返回一个新的DataFrame
# 返回一个新的DataFrame,更新index,原来的index会被替代消失
# 如果dataframe中某个索引值不存在,会自动补上NaN
df2 = df1.reindex(['a','b','c','d','e'])

# fill_valuse为原先不存在的索引补上默认值,不在是NaN
df2 = df1.reindex(['a','b','c','d','e'],  fill_value=0)

# inplace=Ture,在DataFrame上修改数据,而不是返回一个新的DataFrame
df1.reindex(['a','b','c','d','e'],  inplace=Ture)

# reindex不仅可以修改 索引(行),也可以修改列
states = ["Texas","Utah","California"]
df2 = df1.reindex( columns=states )
  • set_index()
    将DataFrame中的列columns设置成索引index
    打造层次化索引的方法
# 将columns中的其中两列:race和sex的值设置索引,race为一级,sex为二级
# inplace=True 在原数据集上修改的
adult.set_index(['race','sex'], inplace = True) 

# 默认情况下,设置成索引的列会从DataFrame中移除
# drop=False将其保留下来
adult.set_index(['race','sex'], inplace = True) 
  • reset_index()
    将使用set_index()打造的层次化逆向操作
    既是取消层次化索引,将索引变回列,并补上最常规的数字索引
df.reset_index()

第一,你不会希望在没有找到数据之前,就被自己的偏见影响。第二,获取数据可能涉及公开渠道和私有渠道,因此不会轻松和显而易见。

数据选取

  • []
    只能对行进 行(row/index) 切片,前闭后开df[0:3],df[:4],df[4:]

  • where 布尔查找

 df[df["A"]>7]
  • isin
# 返回布尔值
s.isin([1,2,3])
df['A'].isin([1,2,3])
df.loc[df['A'].isin([5.8,5.1])]选取列A中值为5.8,5.1的所有行组成dataframe
  • query
    多个where整合切片,&:于,|:或 
 df.query(" A>5.0 & (B>3.5 | C<1.0) ") 
  • loc :根据名称Label切片
# df.loc[A,B] A是行范围,B是列范围
df.loc[1:4,['petal_length','petal_width']]

# 需求1:创建一个新的变量 test
# 如果sepal_length > 3 test = 1 否则 test = 0
df.loc[df['sepal_length'] > 6, 'test'] = 1
df.loc[df['sepal_length'] <=6, 'test'] = 0

# 需求2:创建一个新变量test2 
# 1.petal_length>2 and petal_width>0.3 = 1 
# 2.sepeal_length>6 and sepal_width>3 = 2 3.其他 = 0
df['test2'] = 0
df.loc[(df['petal_length']>2)&(df['petal_width']>0.3), 'test2'] = 1
df.loc[(df['sepal_length']>6)&(df['sepal_width']>3), 'test2'] = 2
  • iloc:切位置
df.iloc[1:4,:]
  • ix:混切
    名称和位置混切,但效率低,少用
df1.ix[0:3,['sepal_length','petal_width']]
  • map与lambda
alist = [1,2,3,4]
map(lambda s : s+1, alist)#map就是将自定义函数应用于Series每个元素

df['sepal_length'].map(lambda s:s*2+1)[0:3]
  • apply和applymap
    apply和applymap是对dataframe的操作,前者操作一行或者一列,后者操作每个元素
These are techniques to apply function to element, column or dataframe.

Map: It iterates over each element of a series. 
df[‘column1’].map(lambda x: 10+x), this will add 10 to each element of column1.
df[‘column2’].map(lambda x: ‘AV’+x), this will concatenate “AV“ at the beginning of each element of column2 (column format is string).

Apply: As the name suggests, applies a function along any axis of the DataFrame.
df[[‘column1’,’column2’]].apply(sum), it will returns the sum of all the values of column1 and column2.
df0[['data1']].apply(lambda s:s+1)

ApplyMap: 对dataframe的每一个元素施加一个函数
func = lambda x: x+2
df.applymap(func), dataframe每个元素加2 (所有列必须数字类型)
  • contains
# 使用DataFrame模糊筛选数据(类似SQL中的LIKE)
# 使用正则表达式进行模糊匹配,*匹配0或无限次,?匹配0或1次
df_obj[df_obj['套餐'].str.contains(r'.*?语音CDMA.*')] 

# 下面两句效果一致
df[df['商品名称'].str.contains("四件套")]
df[df['商品名称'].str.contains(r".*四件套.*")]

你可能想到一个问题,然后自言自语说:“我打赌没有这样的数据可以帮到我们!”然后就将它从问题列表中删除。千万不要这样做,把它留在你的问题列表中!

1.1.2 获取数据

一旦你确定了需要关注的问题,接下来就需要全力收集回答上述问题所需要的数据。正如之前所说,数据可能来自多个数据源,所以这一步非常具有挑战性。

1.1.3 探索数据

一旦得到数据,我们将使用第2章学习的知识,将数据归类到不同的数据类型。这是数据科学5个步骤中最关键的一步。当这一步骤完成时,分析师通常已经花费了数小时学习相关的领域知识,利用代码或其他工具处理和探索数据,对数据蕴含的价值有了更好的认识。

1.1.4 数据建模

这一步涉及统计学和机器学习模型的应用。我们不仅仅选择模型,还通过在模型中植入数学指标,对模型效果进行评价。

1.1.5 可视化和分享结果

毫无疑问,可视化和分享结果是最重要的一步。分析结果也许看起来非常明显和简单,但将其总结为他人易于理解的形式比看起来困难得多。我们将通过一些案例,演示糟糕的分享和改善后的效果。

本文将重点关注第(3)、(4)、(5)步。

为什么本书跳过了第(1)、(2)步?

虽然前两步对数据科学整个过程是非常必要的,但它们通常先于统计模型和程序处理。本书的后面章节将介绍不同的数据收集方法,在此之前,我们更加关注数据科学过程中“科学”的部分。所以,我们先从探索数据开始。

探索数据

数据探索的过程并不简单。它涉及识别数据类型、转换数据类型、使用代码系统性提高数据质量为模型做准备的能力。为了更好地演示和讲解数据探索的艺术,我将使用Python的Pandas包,对几个不同的数据集进行探索。在此过程中,我们将看到多种数据处理技巧。

当我们接触新数据集时,有5个基本问题需要回答。请牢记,这些问题并不是数据科学的起点和终点,它们是我们面对新数据集时需要遵循的基本原则。

1.2.1 数据探索的基本问题

每当接触新数据集时,不论你是否熟悉它,在初次进行分析前回答以下问题都非常有必要。

● 数据是有组织格式的,还是无组织格式的?

我们需要确认数据是否是行列结构。大部分情况下,我们处理的数据都是结构化数据。本书中,超过90%的例子都是结构化数据。尽管如此,在我们进行更深入的数据分析之前,还是要弄清楚这个最基本的问题。

宝马娱乐在线城,根据经验,如果数据是无组织格式的,我们需要将其转换为有组织的行列结构。在本书前面的例子中,我们通过对文本中词语计数的方式将其转换为行列结构。

● 每一行代表什么?

一旦我们弄清楚了数据的组织形式,得到了行列结构的数据集,接下来就需要弄清楚每一行代表的意思。这一步通常不需要花费多少时间,却大有裨益。

● 每一列代表什么?

我们需要识别每一列的数据层次、定性/定量属性等。分类结果可能随着分析的不断深入而改变,但越早开始这一步越好。

● 是否有缺失值?

数据并不完美。很多时候,人工或机械的错误将导致数据缺失。当这种错误发生时,作为数据科学家,我们需要决定如何处理这些错误。

● 是否需要对某些列进行数据转换?

我们可能需要对某些列进行数据转换,当然,这取决于该列的数据层次和定性/定量属性。比如,为了使用统计模型和机器学习模型,数据集中的每一列都需要是数值型的。我们可以使用Python对数据集进行转换。

自始至终,我们的核心问题是:我们能从前期的推理统计中得到哪些信息?我们希望对数据的理解比初次接触时更深。

好了,我们已经介绍了很多内容,下面看一些具体的例子。

1.2.2 数据集1:Yelp点评数据

我们使用的第1个数据集来自点评网站Yelp的公开数据,数据集中所有的身份识别信息已经被删除。首先读取数据,如下所示。

import pandas as pd

yelp_raw_data = pd.read_csv("yelp.csv")

yelp_raw_data.head()

上述代码的作用是:

● 导入Pandas包,并缩写为pd。

● 读取文件yelp.csv,并命名为yelp_raw_data。

● 查看数据的表头(仅前几行),如图3.1所示。​

宝马娱乐在线城 2

​图3.1 数据的表头

问题1:数据是有组织格式的,还是无组织格式的?

● 数据源是非常好的行列结构,我们可以认为它是有组织格式的。

问题2:每一行代表什么?

● 很明显,每一行代表一条用户的评价。我们还会查看每一行和每一列的数据类型。我们使用DataFrame的shape方法查看数据集的大小,如下所示。

yelp_raw_data.shape

# (10000, 10)

● 结果显示,数据集有10 000行和10列。换言之,数据集有10 000个观测值和10个观测特征。

问题3:每一列代表什么?

请注意,数据集有10列。

● business_id:本列看起来是每条评价对应的交易的唯一识别码。本列是定类尺度,因为识别码没有天然的顺序。

● date:本列是每条评价的提交日期。请注意,它只精确到了年、月和日。虽然时间通常被认为是连续数据,但本列应该被视为离散数据。本列属于定序尺度,因为日期有天然的顺序。

● review_id: 本列看起来是每条评价的唯一识别码。本列同样属于定类尺度,因为识别码没有天然的顺序。

● stars:本列看起来(别担心,我们随后会对它进行深入的分析)是评价者给每一个餐馆的最终评分。本列是有次序的定性数据,因此属于定序尺度。

● text:本列看起来是用户撰写的评价。对于大部分文本数据,我们将其归为定类尺度。

● type:本列前5行均为“review”,我们猜测它是标记每行是否为“review”的列,也就是说很可能存在不是“review”的行。我们随后将进行更深入的分析。本列属于定类尺度。

● user_id:本列是每个提交评价的用户的唯一识别码。和其他唯一识别码一样,本列也属于定类尺度。

问题4:是否有缺失值?

● 使用isnull方法判断是否有缺失值。比如,对于名为awesome_dataframe的DataFrame数据集,使用Python代码awesome_dataframe.isnull().sum()可显示每一列的缺失值总数。

问题5:是否需要对某些列进行数据转换?

● 我们想知道是否需要改变定量数据的数值范围,或者是否需要为定性数据创建哑变量?由于本数据集只有定性数据,所以我们将焦点放在定序和定类范围。

在进行数据探索之前,我们先对Python数据分析包Pandas的术语做一个简单了解。

DataFrame

当我们读取数据集时,Pandas将创建一个名为DataFrame类型的对象。你可以将它想象成Python版本的电子表格(但是更好用)。

在本例中,变量yelp_raw_data就是一个DataFrame。

我们使用以下代码验证以上说法。

type(yelp_raw_data)

# pandas.core.frame.Dataframe

DataFrame本质上是一种二维结构,它和电子表格一样以行列结构存储数据。但是相对于电子表格,DataFrame最重要的优点是它可以处理的数据量远超大多数电子表格。

如果你熟悉R语言,可能认识DataFrame这个词,因为Python中的DataFrame正是从R语言借过来的!

由于我们处理的大部分数据都是有组织数据,所以DataFrame是Pandas中使用频率仅次于Series的对象。

Series

Series是简化版的DataFrame,它只有一个维度。Series本质上是由数据点组成的列表。DataFrame的每一列都可以被看作一个Series对象。下面用代码进行验证。我们首先从DataFrame中抽取单独一列(通常用中括号),代码如下:

yelp_raw_data['business_id']# grab a single column of the Dataframe

我们列出其中几行。

本文由宝马娱乐在线城发布于世界互联,转载请注明出处:数据科学入门的5个技巧

关键词: