python数据分析案列——药店销售数据分析

import pandas as pd

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

print(salesDf.head())
print(salesDf.shape)

#字典:旧列名和新列名对应关系
colNameDict = {'购药时间':'销售时间'}

'''
inplace=False,数据框本身不会变,而会创建一个改动后新的数据框,
默认的inplace是False
inplace=True,数据框本身会改动
'''
salesDf.rename(columns = colNameDict,inplace=True)
print(salesDf.head())

print('\n删除缺失值前大小',salesDf.shape)

#删除列(销售时间,社保卡号)中为空的行
#how='any' 在给定的任何一列中有缺失值就删除
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')
print('\n删除缺失后大小',salesDf.shape)

#字符串转换为数值(浮点型)
salesDf['销售数量'] = salesDf['销售数量'].astype('float')
salesDf['应收金额'] = salesDf['应收金额'].astype('float')
salesDf['实收金额'] = salesDf['实收金额'].astype('float')
print('\n转换后的数据类型:\n',salesDf.dtypes)

'''
定义函数:分割销售日期,获取销售日期
输入: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['销售时间']
#对字符串进行分割,获取销售日期
dateSer=splitSaletime(timeSer)

salesDf['销售时间'] = dateSer
 
salesDf['销售时间'] = pd.to_datetime(salesDf['销售时间'],format='%Y-%m-%d', 
                                    errors='coerce')

print('\n转换后的数据类型:\n',salesDf.dtypes)

print('\n删除缺失值前大小',salesDf.shape)


#删除列(销售时间,社保卡号)中为空的行
#how='any' 在给定的任何一列中有缺失值就删除
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')
print('\n删除缺失后大小',salesDf.shape)

'''
by:按哪几列排序
ascending=True 表示升序排列,
ascending=True表示降序排列
na_position=True表示排序的时候,把空值放到前列,这样可以比较清晰的看到哪些地方有空值
'''
#按销售日期进行升序排列
salesDf=salesDf.sort_values(by='销售时间',
                    ascending=True,
                    na_position='first')

#重命名行名(index):排序后的列索引值是之前的行号,需要修改成从0到N按顺序的索引值
salesDf=salesDf.reset_index(drop=True)

#删除异常值:通过条件判断筛选出数据
#查询条件
querySer=salesDf.loc[:,'销售数量']>0
#应用查询条件
print('删除异常值前:',salesDf.shape)
salesDf=salesDf.loc[querySer,:]
print('删除异常值后:',salesDf.shape)

'''
总消费次数:同一天内,同一个人发生的所有消费算作一次消费
#根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,将重复的数据删除
'''

kpi1_Df=salesDf.drop_duplicates(
    subset=['销售时间', '社保卡号']
)

#总消费次数:有多少行
totalI=kpi1_Df.shape[0]

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

kpi1_Df=kpi1_Df.reset_index(drop=True)
#第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)

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

#总消费金额
totalMoneyF=salesDf.loc[:,'实收金额'].sum()
#月均消费金额
monthMoneyF=totalMoneyF / monthsI
print('业务指标2:月均消费金额=',monthMoneyF)

'''
totalMoneyF:总消费金额
totalI:总消费次数
'''
pct=totalMoneyF / totalI
print('客单价:',pct)

import matplotlib.pyplot as plt
#plt.plot([,kpi1_Df['实收金额'])

#在进行操作之前,先把数据复制到另一个数据框中,防止对之前清洗后的数据框造成影响
groupDf=salesDf
#第1步:重命名行名(index)为销售时间所在列的值
groupDf.index=groupDf['销售时间']
groupDf.head()

#第2步:分组
gb=groupDf.groupby(groupDf.index.month)

#第3步:应用函数,计算每个月的消费总额
mounthDf=gb.sum()

print(mounthDf)

plt.plot(mounthDf.index,mounthDf['实收金额'])
plt.plot(mounthDf.index,mounthDf['应收金额'])
   购药时间           社保卡号    商品编码     商品名称 销售数量  应收金额   实收金额
0  2018-01-01 星期五      001616528  236701  强力VC银翘片    6  82.8     69
1  2018-01-02 星期六      001616528  236701  清热解毒口服液    1    28  24.64
2  2018-01-06 星期三     0012602828  236701       感康    2  16.8     15
3  2018-01-11 星期一  0010070343428  236701    三九感冒灵    1    28     28
4  2018-01-15 星期五    00101554328  236701    三九感冒灵    8   224    208
(6578, 7)
             销售时间           社保卡号    商品编码     商品名称 销售数量  应收金额   实收金额
0  2018-01-01 星期五      001616528  236701  强力VC银翘片    6  82.8     69
1  2018-01-02 星期六      001616528  236701  清热解毒口服液    1    28  24.64
2  2018-01-06 星期三     0012602828  236701       感康    2  16.8     15
3  2018-01-11 星期一  0010070343428  236701    三九感冒灵    1    28     28
4  2018-01-15 星期五    00101554328  236701    三九感冒灵    8   224    208

删除缺失值前大小 (6578, 7)

删除缺失后大小 (6575, 7)

转换后的数据类型:
 销售时间     object
社保卡号     object
商品编码     object
商品名称     object
销售数量    float64
应收金额    float64
实收金额    float64
dtype: object

转换后的数据类型:
 销售时间    datetime64[ns]
社保卡号            object
商品编码            object
商品名称            object
销售数量           float64
应收金额           float64
实收金额           float64
dtype: object

删除缺失值前大小 (6575, 7)

删除缺失后大小 (6549, 7)
删除异常值前: (6549, 7)
删除异常值后: (6506, 7)
总消费次数= 5342
月份数: 6
业务指标1:月均消费次数= 890
业务指标2:月均消费金额= 50668.3516667
客单价: 56.909417821
        销售数量     应收金额      实收金额
销售时间                           
1     2527.0  53561.6  49461.19
2     1858.0  42028.8  38790.38
3     2225.0  45318.0  41597.51
4     3005.0  54296.3  48787.84
5     2225.0  51263.4  46925.27
6     2328.0  52300.8  48327.70
7     1483.0  32568.0  30120.22

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值