数据分析应用最多的包是NumPy+Pandas和matplotlib。

NumPy用于数学计算,如线性代数的矩阵计算;

Pandas基于NumPy的数据分析工具,解决数据分析任务创建,提供一套名为数据框的数据结构,方便对表结构进行分析。

matplotlib图形绘制库,用于数据分析的可视化。

# 一维数据分析

NumPy与Pandas均有一维数据的特殊数据结构。

NumPy中一维数据结构:Array(数组)

Pandas中一维数据结构:Series

Pandas的Series功能更多,建立在NumPy数组的基础上。

>>> NumPy一维数组定义及基本操作

#导入numpy包
import numpy as np
#导入pandas包
import pandas as pd
a = np.array([2,3,4,5])

1查询元素(同Pandas列表访问操作)

a[0]

2

2切片访问(指定范围,使用冒号:)

a[1:3]

array([3, 4])

切片操作,不包含结尾部位。

3循环访问

for i in a:
 print(i)

2
3
4
5

4dtype查看数组的数据类型

a.dtype

dtype(‘int32’)

>>>NumPy一维数组与Pandas的列表之间的区别

1.统计功能,平均值mean(),标准差std()。

a.mean()

3.5

a.std()

1.118033988749895

2.向量化计算,可以进行线性代数的一些基本运算。

#向量相加
a=np.array([1,2,3])
b=np.array([4,5,6])
c=a+b
c

array([5, 7, 9])

#向量化运行:乘以标量
b=np.array([1,2,3])
c=b*4
c

array([ 4, 8, 12])

3.NumPy数组中所有元素必须是同一种数据类型,列表可以是不同数据类型。

>>>Pandas一维数据结构定义及基本操作

#定义:Pandas一维数据结构:Series
#存放6家公司某一天的股价(单位是美元)。其中腾讯427.4港元兑换成美元是54.74
stockS=pd.Series([54.74,190.9,173.14,1050.3,181.86,1139.49],
                index=['腾讯',
                       '阿里巴巴',
                       '苹果',
                       '谷歌',
                       'Facebook',
                       '亚马逊'])

1.获取描述统计信息

stockS.describe()

count 6.000000
mean 465.071667
std 491.183757
min 54.740000
25% 175.320000
50% 186.380000
75% 835.450000
max 1139.490000
dtype: float64

2.获取元素。iloc根据位置获取值,loc根据索引获取值。

stockS.iloc[0]

54.74

stockS.loc['亚马逊']

1139.49

3.向量化运算:向量相加

#向量化运算:向量相加
s1=pd.Series([1,2,3,4],index=['a','b','c','d'])
s2=pd.Series([10,20,30,40],index=['a','b','e','f'])
s3=s1+s2
s3

a 11.0
b 22.0
c NaN
d NaN
e NaN
f NaN
dtype: float64

向量加相加,按索引值相同进行相加。故上述例子出现了空值。

处理空值方法1

#方法1:删除缺失值
s3.dropna()

a 11.0
b 22.0
dtype: float64

方法2:使用fill_value使用指定值进行填充。

#方法2:将缺失值进行填充
s3=s1.add(s2,fill_value=0)
s3

a 11.0
b 22.0
c 3.0
d 4.0
e 30.0
f 40.0
dtype: float64

# 二维数据分析

二维数据结构有行有列,类似于excel的二维表格。

NumPy中使用array创建二维数组;

Pandas使用数据框DataFrame的数据结构创建二维数组。

>>> NumPy二维数组定义及基本操作

NumPy也是使用array进行定义二维数据,每一行都是一个列表,各个列表直接用逗号进行分割,也用逗号进行分隔开代表每一行。

import numpy as np
import pandas as pd
a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])

1.查询元素:a[0,2] (逗号之前是行号,之后列号)

a[0,2]

3

2.获取第1行:a[0,:] (使用冒号切片功能,逗号之后为冒号,即现实逗号之前该行所有元素)

a[0,:]

array([1, 2, 3, 4])

3.获取第1列:a[:,0](使用冒号切片功能,逗号之前为冒号,即现实逗号之后该列所有元素)

a[:,0]

array([1, 5, 9])

4.使用a.mean计算平均值。未指定行列,即计算整个数组的平均值。

a.mean()

6.5

>>>NumPy数轴参数axis

#axis=1计算每一行
a.mean(axis=1)

array([ 2.5, 6.5, 10.5])

#axis=0计算每一列
a.mean(axis=0)

array([5., 6., 7., 8.])

>>>Pandas数据框DataFrame的定义和基本操作

相较于NumPy二维数据的两个优点。

1.数据框每一列可以分不同类型,方便表示excel中的数据内容。

2.有类似于Series一样的索引值功能。

容易存储表格数据。

需定义一个字典,并进行有序排列,再定义数据框。

#第1步:定义一个字典,映射列名与对应列的值
salesDict={
    '购药时间':['2018-01-01 星期五','2018-01-02 星期六','2018-01-06 星期三'],
    '社保卡号':['001616528','001616528','0012602828'],
    '商品编码':[236701,236701,236701],
    '商品名称':['强力VC银翘片','清热解毒口服液','感康'],
    '销售数量':[6,1,2],
    '应收金额':[82.8,28,16.8],
    '实收金额':[69,24.64,15]
}
#导入有序字典
from collections import OrderedDict
#定义一个有序字典
salesOrderDict=OrderedDict(salesDict)
#定义数据框:传入字典,列名
salesDf=pd.DataFrame(salesOrderDict)

打印查看

salesDf

如图可见,列名称在顶部,行索引值是从0开始。

1.求平均值

salesDf.mean()

商品编码 236701.000000
销售数量 3.000000
应收金额 42.533333
实收金额 36.213333
dtype: float64

Pandas数据框使用mean函数是每列进行平均。

2.查询元素。使用iloc[0,1] (同NumPy,逗号前为行,逗号后为列)

salesDf.iloc[0,1]

‘001616528’

3.获取第1行iloc[0,:]

salesDf.iloc[0,:]

购药时间 2018-01-01 星期五
社保卡号 001616528
商品编码 236701
商品名称 强力VC银翘片
销售数量 6
应收金额 82.8
实收金额 69
Name: 0, dtype: object

4.获取第1列iloc[:,0]

salesDf.iloc[:,0]

0 2018-01-01 星期五
1 2018-01-02 星期六
2 2018-01-06 星期三
Name: 购药时间, dtype: object

5.loc属性用于根据索引查询值。(主要使用该方法,牢记)

5.1 salesDf.loc[0,’商品编码’]查询列名为商品编码,第一行。

salesDf.loc[0,'商品编码']

236701

5.2 获取第1行salesDf.loc[0,:]

购药时间 2018-01-01 星期五
社保卡号 001616528
商品编码 236701
商品名称 强力VC银翘片
销售数量 6
应收金额 82.8
实收金额 69
Name: 0, dtype: object

5.3 获取某一列 salesDf[‘购药时间’]

 salesDf['购药时间']

0 2018-01-01 星期五
1 2018-01-02 星期六
2 2018-01-06 星期三
Name: 购药时间, dtype: object

5.4查询某几列

salesDf[['商品名称','销售数量']]

5.5切片功能:指定范围。

salesDf.loc[:,'商品编码':'应收金额']

5.6通过条件判断筛选

5.6.1建立一个查询条件

querySer=salesDf.loc[:,'销售数量']>1
type(querySer)

pandas.core.series.Series

返回是布尔数值类型

querySer

0 True
1 False
2 True
Name: 销售数量, dtype: bool

显示True的即是符合查询条件:销售数量>1。

5.6.2应用查询条件

使用刚才定义的查询条件,查询除符合条件的行。

salesDf.loc[querySer,:]

6.数据框其他作用

查看描述统计信息。

fileNameStr='./朝阳医院2018年销售数据.xlsx'
xls = pd.ExcelFile(fileNameStr)
salesDf = xls.parse('Sheet1')
salesDf.head(3)

6.1使用file将样例数据读入数据框。强调变量名尽量易读。

使用head打印前3行。

6.2使用dtype查看某一列数据类型。

salesDf.loc[:,'销售数量'].dtype

dtype(‘float64’)

6.3使用shape查看多少行多少列

salesDf.shape

(6578, 7)

6.4使用describe每一列进行统计

salesDf.describe()

实战演练

数据分析步骤

1.提出问题(用于生活工作中的问题)

2.理解数据(针对性采集数据,导入数据,查看数据的统计信息)

3.数据清洗(预处理)

4.构建模型

5.数据可视化

(老师YY一阵子)

1.提出问题。

从销售数据中分析出下列业务指标

1)月均消费次数2)月均消费金额3)客单价4)消费趋势

2.理解数据

按字符串类型导入数据,并打印前面几列,查看是否导入有误。

查看行数和列数,并查看列的数据类型。

并查看统计信息。

梳理数据列名称与业务指标之间的联系。统计信息可以看出有多少位患者,销售药品种类的数量等等。

3.数据清洗

重头戏。数据清洗步骤。

3.1选择子集

使用loc切片功能,即可隐掉不需要的无关数据。

3.2列表重命名

将名称改为方便辨识的新名称。

引入inplace。inplace=False,数据框本身不会变,而会创建一个改动后新的数据框,默认的inplace是False,inplace=True,数据框本身会改动。故使用inplace=True

3.3缺失数据处理

python缺失值有3种:

1)Python内置的None值

2)在pandas中,将缺失值表示为NA,表示不可用not available。

3)对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。

后面出来数据,如果遇到错误:说什么foloat错误,那就是有缺失值,需要处理掉

所以,缺失值有3种:None,NA,NaN

此案例若无销售时间或社保卡号有缺失值,该行数据即为无效数据。本案例引入dropna删除方式。

how=’any’为给定列任何一列有缺失值即删除。

3.4数据类型转换

3.4.1使用astype将部分原字符串转换为浮点型数值

3.4.2测试字符串分割split处理日期

定义分割日期函数

将销售时间数据整列进行字符串分割,获取销售日期,测试后并对销售时间重新赋值,打印前几列查看处理结果。

将销售时间原为字符串转化为日期

并再次进行空值删除。

3.5数据排序

by:按哪几列排序。ascending=True 表示升序排列,ascending=False表示降序排列。此处按销售时间最早开始升序排列,并打印排序后前3行数据。

为方便从数据框中查询数据,使用reset_index进行重新从0到N,按顺序排列。

3.6异常值处理

3.6.1查看每一列的描述统计信息,判断是否存在异常值。

3.6.2通过条件判断筛选出数据,应用后删除异常值。

4.构建模型

业务指标1:月均消费次数=总消费次数/月份数

>计算总消费次数

同一个人同一天发生的所有消费算作一次消费。(已经考虑了一天跑几次过来买,比如我就喜欢干这事)

首先,使用drop_duplicates删除重复的数据,subset列表中所对应的值都相同,仅保留一条。

shape返回为列表的数据列项,访问0,即是行数,也即总的消费次数。

>计算月份数

月份数处理思路,最早消费记录与最晚消费记录,按天数折算月。

进而获得业务指标1:月均消费次数

业务指标2:月均消费金额 = 总消费金额 / 月份数

获得总消费金额,累计实收金额。

业务指标3:客单价=总消费金额 / 总消费次数

业务指标4:消费趋势

涉及到数据可视化,需下次课程。

——————————————

结尾福利总结:

1.全球最大的搜索引擎

UOL Busca​busca.uol.com.br图标

2.如何使用Stack Overflow

如何优雅地使用 Stack Overflow?​www.zhihu.com图标

本关学习感受是,加强数据思维逻辑关系的理解,绕着绕着就会绕晕,多复习查看之前练习。