目录

  • 26个数据分析案例——第三站:基于python的药店销售数据分析
    • 实验环境
    • 数据说明
    • 资料包
    • 实验步骤
      • 第一步:加载数据并查看数据详情
        • 1、导入数据:需要用到Python中的xlrd包,代码如下所示。
        • 2、查看数据类型,代码如下所示。
      • 第二步:数据清洗
        • 1、选择子集:目的是选择需要分析的列,方法为切片法(loc),代码如下所示。
        • 2、列名重命名:把'购药时间'改为'销售时间’,代码如下所示。
        • 3、缺失数据处理,用dropna 法处理缺失值,处理前数据大小,代码如下所示。
        • 4、处理后的数据大小,代码如下所示。
        • 5、数据类型转换:本文数据都是以字符串类型导入的,我们需要将字符串转换为我们需要的数据类型,字符串转换为数值(浮点型),代码如下所示。
        • 6、字符串转换为日期数据类型,定义一个用来分割日期数据的函数splitSaletime(),代码如下所示。
        • 7、调用splitSaletime()来处理销售时间,代码如下所示。
        • 8、修改销售时间,代码如下所示。
        • 9、将销售时间列数据字符串型转换为日期型,代码如下所示。
        • 10、通过转换,销售时间已经由字符串转换为日期,转换过程中不符合日期格式的数值会被转换为空值,需要将其删除,代码如下所示。
        • 11、排序按销售时间的先后顺序进行排序,排序前的数据,代码如下所示。
        • 12、对销售时间按序排序,代码如下所示。
        • 13、将索引值修改为从0到N按顺序,代码如下所示。
        • 14、异常值处理,查看数据看是否存在异常值,代码如下所示。
        • 15、处理异常值,代码如下所示。
        • 16、对异常值进行处理之后,再使用描述指标查询一次,无异常值,代码如下所示。
      • 第三步:构建模型
        • 业务指标1:月均消费次数=总消费次数/月份数。获取总消费次数,代码如下所示。
        • 2、获取时间范围,代码如下所示。
        • 3、获取最小时间值,代码如下所示。
        • 4、获取最大时间值,代码如下所示。
        • 5、计算总天数,代码如下所示。
        • 6、计算月份数,代码如下所示。
        • 7、获取月均消费次数,代码如下所示。
        • 8、获取总消费金额,代码如下所示。
        • 9、业务指标2:月均消费金额=总消费金额/月份数,获取月均消费金额,代码如下所示。
        • 12、分组,代码如下所示。
        • 13、应用函数,计算每个月的消费总额,代码如下所示。
    • 后续案例持续更新

26个数据分析案例——第三站:基于python的药店销售数据分析

实验环境

  • Python: Python 3.x;

  • jupyter

数据说明

当前数据为某医院销售记录,用于记录用户购买药品的相关信息。该数据集包含7个字段,分别是:
• 购药时间。
• 社保卡号。
• 商品编码。
• 商品名称。
• 销售数量。
• 应收金额。
• 实收金额。

资料包

链接:https://pan.baidu.com/s/1KdikbuBaTBGDwgZyPgVv4g
提取码:e46q

实验步骤

第一步:加载数据并查看数据详情

1、导入数据:需要用到Python中的xlrd包,代码如下所示。

#导入数据分析包
import pandas as pd
'''
路径中最好不要有中文,或者特殊符号啥的,不然路径会提示错误找不到。
最后将文件放到一个简单的英文路径下
'''
#读取CSV数据,统一先按照字符串读入,之后转换
salesDf=pd.read_csv('data.csv',dtype={'社保卡号':str,'商品编码':str})
'''
查看数据基本信息
'''
#打印出前5行,以确保数据运行正常
salesDf.head()

结果如图所示。

2、查看数据类型,代码如下所示。

#查看每一列的数据类型
salesDf.dtypes

第二步:数据清洗

1、选择子集:目的是选择需要分析的列,方法为切片法(loc),代码如下所示。

subset=salesDf.loc[0:3,'购药时间':'商品名称']
subset

结果如图所示。

2、列名重命名:把’购药时间’改为’销售时间’,代码如下所示。

#列名和新列名对应关系
colNameDict={'购药时间':'销售时间'}
'''
inplace=False,数据框本身不会变,而会创建一个改动后新的数据框,默认的inplace是False
inplace=True,数据框本身会改动
'''
salesDf.rename(columns =colNameDict,inplace=True)
salesDf.head()

结果如图所示。

3、缺失数据处理,用dropna 法处理缺失值,处理前数据大小,代码如下所示。

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

结果如图所示。

4、处理后的数据大小,代码如下所示。

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

结果如图所示。

5、数据类型转换:本文数据都是以字符串类型导入的,我们需要将字符串转换为我们需要的数据类型,字符串转换为数值(浮点型),代码如下所示。

'''
运行后,会报警告SettingWithCopyWarning一般信息有两列,一类是Warning警告信息,一类是Error错误信息。
警告的信息不用管,我们只关注错误类型的信息
'''
#字符串转换为数值(浮点型)
salesDf['销售数量']=salesDf['销售数量'].astype(float)
salesDf['应收金额']=salesDf['应收金额'].astype(float)
salesDf['实收金额']=salesDf['实收金额'].astype(float)
print('转换后的数据类型:\n',salesDf.dtypes)

结果如图所示。

6、字符串转换为日期数据类型,定义一个用来分割日期数据的函数splitSaletime(),代码如下所示。

'''
定义函数:分割销售日期,获取销售日期
输入:timeColSer 销售时间这一列,是个Series数据类型
输出:分割后的时间,返回也是个Series数据类型
'''
def splitSaletime(timeColSer):timeList=[]for value in timeColSer:#例如2018-01-01星期五,分割后为:2018-01-01dateStr=value.split(' ')[0]timeList.append(dateStr)#将列表转行为一维数据Series类型timeSer=pd.Series(timeList)return timeSer

7、调用splitSaletime()来处理销售时间,代码如下所示。

'''
注意:
如果运行后报错:AttributeError:float object has no attribute'split'
是因为Excel中的空的cell读入pandas中是空值(NaN),这个NaN是个浮点类型,一般当作空值处理。
所以要先去除NaN在进行分隔字符串
'''
#获取"销售时间"这一列
timeSer=salesDf.loc[:,'销售时间']
#对字符串进行分割,获取销售日期
dateSer=splitSaletime(timeSer)
dateSer.head()

运行结果为:

8、修改销售时间,代码如下所示。

#修改销售时间这一列的值
salesDf.loc[:,'销售时间']=dateSer
salesDf.head()

结果如图所示。

9、将销售时间列数据字符串型转换为日期型,代码如下所示。

'''
数据类型转换:字符串转换为日期
'''
#errors='coerce'如果原始数据不符合日期的格式,转换后的值为空值NaT
#format 是你原始数据中日期的格式
salesDf.loc[:,'销售时间']=pd.to_datetime(salesDf.loc[:,'销售时间'],format='%Y-%m-%d',errors='coerce')
salesDf.dtypes

运行结果为:

10、通过转换,销售时间已经由字符串转换为日期,转换过程中不符合日期格式的数值会被转换为空值,需要将其删除,代码如下所示。

#将空值进行删除
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')

11、排序按销售时间的先后顺序进行排序,排序前的数据,代码如下所示。

print('排序前的数据集')
salesDf.head()

结果如图所示。

12、对销售时间按序排序,代码如下所示。

'''
by:按哪几列排序
ascending=True 表示升序排列,ascending=False表示降序排列
'''
#按销售日期进行升序排列
salesDf=salesDf.sort_values(by='销售时间',ascending=True)
print('排序前的数据集')
salesDf.head()

运行结果为:

13、将索引值修改为从0到N按顺序,代码如下所示。

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

结果如图所示。

14、异常值处理,查看数据看是否存在异常值,代码如下所示。

#查看数据
salesDf.describe()

结果如图所示。

15、处理异常值,代码如下所示。

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

结果如图所示。

16、对异常值进行处理之后,再使用描述指标查询一次,无异常值,代码如下所示。

#查看数据
salesDf.describe()

结果如图所示。

第三步:构建模型

业务指标1:月均消费次数=总消费次数/月份数。获取总消费次数,代码如下所示。

'''
总消费次数:同一天内,同一个人发生的所有消费算作一次消费
根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,将重复的数据删除
'''
kpi1_Df=salesDf.drop_duplicates(subset=['销售时间','社保卡号']
)
#总消费次数:有多少行
totall=kpi1_Df.shape[0]
print('总消费次数=',totall)

结果如图所示。

2、获取时间范围,代码如下所示。

'''
计算月份数:时间范围
'''
#按销售时间升序排序
kpil_Df=kpi1_Df.sort_values(by='销售时间',ascending=True)
#重命名行名(index)
kpi1_Df=kpil_Df.reset_index(drop=True)
kpi1_Df.head()

结果如图所示。

3、获取最小时间值,代码如下所示。

#最小时间值
startTime=kpil_Df.loc[0,'销售时间']
startTime

结果如图所示。

4、获取最大时间值,代码如下所示。

#最大时间值
endTime=kpi1_Df.loc[totall-1,'销售时间']
endTime

结果如图所示。

5、计算总天数,代码如下所示。

#天数
daysl=(endTime-startTime).days
daysl

结果如图所示。

6、计算月份数,代码如下所示。

#月份数:运算符“//”表示取整除
#返回商的整数部分,例如9//2输出结果是4
monthsl=daysl//30
print('月份数:',monthsl)

结果如图所示。

7、获取月均消费次数,代码如下所示。

#业务指标1:月均消费次数=总消费次数/月份数
kpil_l=totall//monthsl
print('业务指标1:月均消费次数=',kpil_l)

结果如图所示。

8、获取总消费金额,代码如下所示。

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

结果如图所示。

9、业务指标2:月均消费金额=总消费金额/月份数,获取月均消费金额,代码如下所示。

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

结果如图所示。

10、业务指标3:客单价=总消费金额 / 总消费次数,客单价(per customer transaction)是指商场(超市)每一个顾客平均购买商品的金额,客单价也即是平均交易金额,代码如下所示。

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

结果如图所示。

11、重命名行名(index)为销售时间所在列的值,代码如下所示。

#在进行操作之前,先把数相复制到另外一个教帮框中
#助止对之前清洗后的教指福造成形响
groupDf=salesDf
#重命名行名(index)为销售时间所在列的值
groupDf.index=groupDf['销售时间']
groupDf.head()

结果如图所示。

12、分组,代码如下所示。

#分组
gb=groupDf.groupby(groupDf.index.month)
gb.groups

结果如图所示。

13、应用函数,计算每个月的消费总额,代码如下所示。

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

结果如图所示。

后续案例持续更新

01 基于Python的HBase冠字号查询系统
02基于Hive的民航客户价值分析
03 基于python的药店销售数据分析
04基于Flume与Kafka的web服务器日志数据采集
05 基于Scrapy的架构的数据采集
06 Linux操作系统实时日志采集并处理
07 医疗行业案例-中医病症辩证关联规则分析
08教育行业案例-高校学生生活数据分析
10 娱乐行业案例-广告收益回归预测模型
11网络行业案例-网站访问行为分析
12零售行业案例-店铺热门商品实时统计
13 营业额数据可视化
14金融行业案例-基于上市公司股票信息及其衍生变量的金融数据分析
15银行信用卡风险数据可视化
16 滴滴出行城市运营分析
17 幸福指数可视化
18 员工主动离职预警模型
19 歌手推荐模型
20 2020新冠肺炎疫情数据分析
21 淘宝购物狂欢节数据分析
22 共享单车数据分析
23人脸检测系统
24服装分拣系统
25口罩佩戴识别系统
26 imdb电影数据分析
20 2020新冠肺炎疫情数据分析
21 淘宝购物狂欢节数据分析
22 共享单车数据分析
23人脸检测系统
24服装分拣系统
25口罩佩戴识别系统
26 imdb电影数据分析

26个数据分析案例——第三站:基于python的药店销售数据分析相关推荐

  1. python数据分析案例简单实战项目(一)--供应链销售数据分析

    项目背景 作为供应链行业领航企业,怡亚通推动供应链改变中国,不仅是以先进的供应链思维与管理推动中国主要核心城市的商业快速发展,也是以完善的供应链服务布局.开放的新流通平台助力中国1-6线城市以及乡镇的 ...

  2. python微信好友分析_基于python实现微信好友数据分析(简单)

    一.功能介绍 本文主要介绍利用网页端微信获取数据,实现个人微信好友数据的获取,并进行一些简单的数据分析,功能包括: 1.爬取好友列表,显示好友昵称.性别和地域和签名, 文件保存为 xlsx 格式 2. ...

  3. 基于Python热点新闻关键词数据分析系统

    温馨提示:文末有 CSDN 平台官方提供的博主 Wechat / QQ 名片 :) 1. 项目简介 利用网络爬虫技术从某新闻网站爬取最新的新闻数据,并进行版块分类,对某篇版块下的所有新闻进行中文分词, ...

  4. 基于Python的直播平台数据分析可视化系统

    温馨提示:文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 随着移动互联网和5G的快速发展,视频直播行业呈现出丰富多元的内容形态,覆盖更多的场景和受众,视频成为 ...

  5. 基于python的气象数据分析统计服_基于Python的风向风速数据分析的设计与实现

    基于 Python 的风向风速数据分析的设计与实现 李文倩 ; 刘婕 [期刊名称] < <信息通信> > [年 ( 卷 ), 期] 2019(000)009 [摘要] Pyth ...

  6. 【大数据分析专业毕设之基于python的手机销售大数据分析可视化系统】

    [大数据分析专业毕设之基于python的手机销售大数据分析可视化系统] https://b23.tv/FKuPbsv flask web框架,数据使用requests模块爬取https://www.j ...

  7. python药店销售数据分析_解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时 ...

  8. python药店销售数据分析_解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现...

    Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业 ...

  9. 基于Python的飞机票销售系统的设计和实现

    <基于Python的飞机票销售系统的设计和实现>该项目采用技术Python的django框架.mysql数据库 ,项目含有源码.论文.PPT.配套开发软件.软件安装教程.项目发布教程.核心 ...

  10. 基于Python的药店|药房管理系统的设计和实现

    <基于Python的药店|药房管理系统的设计和实现>该项目采用技术Python的django框架.mysql数据库,项目含有源码.论文.PPT.配套开发软件.软件安装教程.项目发布教程.核 ...

最新文章

  1. 【linux】——ubuntu12.04 下安装wine和wine乱码解决方案
  2. mysql 5.1 innodb trx_mysql 优化innodb_flush_log_at_trx_commit的案例介绍
  3. C语言文件操作 给M个数随机分组
  4. 【配置文件】Log4j
  5. Rainbond 5.0正式发布, 支持对接管理已有Kubernetes集群...
  6. 区块链/比特币基础知识
  7. 动手学习数据分析(二)——数据处理
  8. Android界面绘制流程--------How Android Draws Views
  9. Python---基础-运算符int和range函数
  10. 随笔编号-15 重构--改善既有代码的设计--Day01--学习笔记
  11. 设计模式总结之模式分类
  12. PTA程序设计基础6 7-1 列表排序、逆序 (10 分)C语言解法
  13. PCkit3.5烧写器直接上手使用方法
  14. 2020第一届无线大数据竞赛——华为赛道:无线网络智能定位 第2名方案
  15. 《现代密码学》学习笔记——第七章 密钥管理[一]
  16. 地图学的基础知识_天文坐标系_大地坐标系_地心坐标系及其相关概念
  17. go down to用法
  18. PHP系统常量及判断某常量是否被定义
  19. gogodroid--android 上的IPV6工具
  20. NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突

热门文章

  1. 6个常见校园网认证客户端故障原因及解决方法
  2. c语言使用gotoxy函数清屏,写了个小程序,一直会闪屏,用的gotoxy函数,求大神教...
  3. java拦截器与AOP的区分理解
  4. 【摘抄】SLAM中的位姿
  5. Java快捷键的设置与使用
  6. Python 编程语言
  7. Python线程池简介
  8. 手把手教你彻底卸载MySQL
  9. 工具配置-如何在NextCloud私有云盘安装的olnyOffice插件中添加中文字体支持实践操作...
  10. EGE基础:鼠标消息篇