一、一维数据分析

在NumPy中一维数据叫做Array(一维数组),Pandas中叫做Series。

1、NumPy

2、Pandas

二、二维数据分析

在NumPy中二维数据叫做Array(二维数组),Pandas中叫做数据框(DataFrame)。

1、NumPy

2、Pandas

三、医院销售数据数据分析

步骤或流程:数据导入→提出问题→理解数据→数据清洗→构建模型→数据可视化。

1、数据导入

import pandas as pd

import xlrd

fileNameStr='C:\Python-lcz\朝阳医院2018年销售数据.xlsx'

'''

使用pandas的read_excel函数读取Ecxcel数据

参数sheet_name:数据在Excel里的哪个sheet下面,这块就写该sheet在excel里的名称

参数dtype=str 统一先按照字符串读入,之后再转换

'''

salesDf = pd.read_excel(fileNameStr,sheet_name='Sheet1',dtype=str)

2、提出问题

采用多维度拆解分析法对以下指标分析:月均消费次数、月均消费金额、客单价、消费趋势。

3、理解数据

4、数据清洗

4.1 选择子集

本次数据分析各个字段均有分析价值,不需要选择子集。若需要,可采用下面的代码完成。

subSalesDf=salesDf.loc[0:4,'购药时间':'销售数量']

4.2 列名重命名

4.3 缺失数据处理

4.4 数据类型转换将销售数量、应收金额、实收金额转换成数值型数据

'''

定义函数:分割销售日期,获取销售日期

输入:timeColSer 销售时间这一列,是个Series数据类型

输出:分割后的时间,返回也是个Series数据类型

'''

def splitSaletime(timeColSer):

timeList=[]

for value in timeColSer:

#例如2018-01-01 星期五,分割后为:2018-01-01

dateStr=value.split(' ')[0]

timeList.append(dateStr)

#将列表转行为一维数据Series类型

timeSer=pd.Series(timeList)

return timeSer

#获取“销售时间”这一列

timeSer=salesDf.loc[:,'销售时间']

#对字符串进行分割,获取销售日期

'''

注意:

如果运行后报错:AttributeError: 'float' object has no attribute 'split'

是因为Excel中的空的cell读入pandas中是空值(NaN),这个NaN是个浮点类型,一般当作空值处理。

所以要先去除NaN在进行分隔字符串

'''

dateSer=splitSaletime(timeSer)

dateSer[0:3]

0 2018-01-01

1 2018-01-02

2 2018-01-06

dtype: object

#None和NaN的区别

print('None的数据类型',type(None))

from numpy import NaN

print('NaN的数据类型',type(NaN))

None的数据类型

NaN的数据类型

#修改销售时间这一列的值

salesDf.loc[:,'销售时间']=dateSer

salesDf.head()将销售时间转换成日期型数据

将销售数量、应收金额、实收金额转换成数值型数据

4.5 数据排序及行号重命名

'''

by:按哪几列排序

ascending=True 表示升序排列,

ascending=True表示降序排列

na_position=True表示排序的时候,把空值放到前列,看到哪些地方有空值

'''

#按销售日期进行升序排列

salesDf=salesDf.sort_values(by='销售时间',

ascending=True,

na_position='first')

salesDf.head(3)

4.6 异常值处理

5、构建模型、进行数据分析

5.1 业务指标1:月均消费次数

'''

总消费次数:同一天内,同一个人发生的所有消费算作一次消费

#根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,将重复的数据删除

'''

kpi1_Df=salesDf.drop_duplicates(

subset=['销售时间', '社保卡号']

)

#总消费次数:有多少行

totalI=kpi1_Df.shape[0]

print('总消费次数=',totalI)

总消费次数= 5346

#计算月份数:时间范围

#第1步:按销售时间升序排序

kpi1_Df=kpi1_Df.sort_values(by='销售时间',

ascending=True)

#重命名行名(index)

kpi1_Df=kpi1_Df.reset_index(drop=True)

kpi1_Df.head()

#第2步:获取时间范围

#最小时间值

startTime=kpi1_Df.loc[0,'销售时间']

#最大时间值

endTime=kpi1_Df.loc[totalI-1,'销售时间']

#第3步:计算月份数

#天数

daysI=(endTime-startTime).days

#月份数: 运算符“//”表示取整除

#返回商的整数部分,例如9//2 输出结果是4

monthsI=daysI//30

print('月份数:',monthsI)

月份数: 6

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

kpi1_I=totalI // monthsI

print('业务指标1:月均消费次数=',kpi1_I)

业务指标1:月均消费次数= 891

5.2 业务指标2:月均消费金额

#总消费金额

totalMoneyF=salesDf.loc[:,'实收金额'].sum()

#月均消费金额

monthMoneyF=totalMoneyF / monthsI

print('业务指标2:月均消费金额=',monthMoneyF)

业务指标2:月均消费金额= 50674.13833333296

5.3 指标3:客单价

'''

totalMoneyF:总消费金额

totalI:总消费次数

'''

pct=totalMoneyF / totalI

print('客单价:',pct)

客单价: 56.87333146277548