一、一维数据分析
在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