本期我们通过分析某医院半年内的药品销售数据,看看医院那些药物购买者较多,那些天购药者较多等等,希望对小伙伴们有所帮助。
涉及到的库:
Pandas — 数据处理
Pyecharts — 数据可视化
collections — 数据统计
可视化部分:
Line — 折线图
Bar — 柱状图
Calendar— 日历图
stylecloud — 词云图
进入正题~~
import jieba
import stylecloud
import pandas as pd
from PIL import Image
from collections import Counter
from pyecharts.charts import Geo
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts.charts import Pie
from pyecharts.charts import Calendar
from pyecharts.charts import WordCloud
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType,SymbolType,ChartType
df = pd.read_excel("医院药品销售数据.xlsx")
df.shape
(6578, 7)
一共有6578条药品购买数据。
df.info()
df.isnull().sum()
df[df.isnull().T.any()]
因为购药时间在后面的分析中会用到,所以我们将购药时间为空的行删除,社保卡号用"000"填充,社保卡号、商品编码为一串数字,应为str类型,销售数量应为int类型:
df1 = df.copy()
df1 = df1.dropna(subset=['购药时间'])
df1[df1.isnull().T.any()]
df1['社保卡号'].fillna('0000', inplace=True)
df1['社保卡号'] = df1['社保卡号'].astype(str)
df1['商品编码'] = df1['商品编码'].astype(str)
df1['销售数量'] = df1['销售数量'].astype(int)
df1[['销售数量','应收金额','实收金额']].describe()
数据中存在负值,显然不合理,我们将其转换为正值:
df2 = df1.copy()
df2['销售数量'] = df2['销售数量'].abs()
df2['应收金额'] = df2['应收金额'].abs()
df2['实收金额'] = df2['实收金额'].abs()
df3 = df2.copy()
df3[['购药日期', '星期']] = df3['购药时间'].str.split(' ', 2, expand = True)
df3 = df3[['购药日期', '星期','社保卡号','商品编码', '商品名称', '销售数量', '应收金额', '实收金额' ]]
代码:
color_js = """new echarts.graphic.LinearGradient(0, 1, 0, 0,
[{offset: 0, color: '#FFFFFF'}, {offset: 1, color: '#ed1941'}], false)"""
g1 = df3.groupby('星期').sum()
x_data = list(g1.index)
y_data = g1['销售数量'].values.tolist()
b1 = (
Bar()
.add_xaxis(x_data)
.add_yaxis('',y_data ,itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_js)))
.set_global_opts(title_opts=opts.TitleOpts(title='一周各天药品销量',pos_top='2%',pos_left = 'center'),
legend_opts=opts.LegendOpts(is_show=False),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
yaxis_opts=opts.AxisOpts(name="销量",name_location='middle',name_gap=50,name_textstyle_opts=opts.TextStyleOpts(font_size=16)))
)
b1.render_notebook()
每天销量整理相差不大,周五、周六偏于购药高峰。
代码:
color_js = """new echarts.graphic.LinearGradient(0, 1, 0, 0,
[{offset: 0, color: '#FFFFFF'}, {offset: 1, color: '#08519c'}], false)"""
g2 = df3.groupby('商品名称').sum().sort_values(by='销售数量', ascending=False)
x_data = list(g2.index)[:10]
y_data = g2['销售数量'].values.tolist()[:10]
b2 = (
Bar()
.add_xaxis(x_data)
.add_yaxis('',y_data ,itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_js)))
.set_global_opts(title_opts=opts.TitleOpts(title='药品销量前十',pos_top='2%',pos_left = 'center'),
legend_opts=opts.LegendOpts(is_show=False),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
yaxis_opts=opts.AxisOpts(name="销量",name_location='middle',name_gap=50,name_textstyle_opts=opts.TextStyleOpts(font_size=16)))
)
b2.render_notebook()
可以看出:苯磺酸氨氯地平片(安内真)、开博通、酒石酸美托洛尔片(倍他乐克)等治疗高血压、心绞痛药物购买量比较多。。
销售额与销量基本成正比。
从一周各天数据分布来看,每天销量整理相差不大,周五、周六偏于购药高峰。
可以看出:5日、15日、25日是药品销售高峰期,尤其是每月15日。
篇幅原因,部分代码未完全展示,如果需要可在下方获取,也可在线运行(含全部代码+数据文件):
https://www.heywhale.com/mw/project/61b83bd9c63c620017c629bc
以上就是本期为大家整理的全部内容了,赶快练习起来吧,原创不易,喜欢的朋友可以点赞、收藏也可以分享(注明出处)让更多人知道。
Pandas+Pyecharts | 某直聘平台招聘信息数据可视化
爬取《白蛇2:青蛇劫起》20000+影评数据分析可视化
可视化 | Python分析中秋月饼,这几种口味才是yyds!!!
123个Pandas常用基础指令,真香!
爬虫+可视化 | 动态展示2020东京奥运会奖牌世界分布
Pandas+Pyecharts | 北京某平台二手房数据分析+可视化
Pandas+Pyecharts | 2021中国大学综合排名分析+可视化
可视化 | Python绘制高颜值台风地理轨迹图
可视化 | 用Python分析近5000个旅游景点,告诉你假期应该去哪玩
可视化 | Python精美地图动态展示近20年全国各省市GDP
可视化 | Python陪你过520:在你身边,你在身边
爬虫 | Python送你王者荣耀官网全套皮肤
爬虫 | 用python构建自己的IP代理池,再也不担心IP不够用啦!
技巧 | 20个Pycharm最实用最高效的快捷键(动态展示)
技巧 | 5000字超全解析Python三种格式化输出方式【% / format / f-string】
技巧 | python定时发送邮件(自动添加附件)
爬虫 | Python送你王者荣耀官网全套皮肤
爬虫 | 用python构建自己的IP代理池,再也不担心IP不够用啦!
文章首发微信公众号 “Python当打之年” ,每天都有python编程技巧推送,希望大家可以喜欢