当前位置:   article > 正文

Pandas+Pyecharts | 医院药品销售数据可视化_pandas 医疗

pandas 医疗

目录

前言

  1. 导入模块

2.Pandas数据处理

2.1 读取数据¶

 2.2 数据大小

2.3 查看索引、数据类型和内存信息

2.4 统计空值数据¶

2.5 输出包含空值的行

 2.6 社保卡号用"000"填充

2.7 社保卡号、商品编码为一串数字,应为str类型,销售数量应为int类型

2.8 销售数量、应收金额、实收金额分布情况

 2.9 负值转正值

2.10 列拆分(购药时间列拆分为两列)

2.11 数据时间范围

3. Pyecharts数据可视化

3.1 一周各天药品销量柱状图

3.2 药品销量前十柱状图

3.3 药品销售额前十柱状图

3.4 一周每天订单量

3.5 自然月每天订单数量

3.6 五月每日订单量

4.总结


前言

本期我们通过分析某些医院半年内的药品销售数据,看看医院那些药物购买者较多,那些天购药者较多等等.

涉及到的库:
Pandas — 数据处理
Pyecharts — 数据可视化
collections — 数据统计

可视化部分:
折线图 — Line
柱状图 — Bar
日历图 — Calendar

第一我们要安装pandas库:安装pandas库的方法是通过pip命令安装:打开cmd,写入pip install pandas

第二我们要安装pyecharts:安装pyecharts的方法是通过windows中搜索anaconda prompt打开,运行下述代码:pip install pyecharts或使用清华镜像下载(建议使用这个):pip install pyecharts -i https://pypi.tuna.tsinghua.edu.cn/simple

  1. 导入模块

  1. import pandas as pd
  2. from PIL import Image
  3. from collections import Counter
  4. from pyecharts.charts import Bar
  5. from pyecharts.charts import Line
  6. from pyecharts.charts import Calendar
  7. from pyecharts import options as opts
  8. from pyecharts.commons.utils import JsCode
  9. from pyecharts.globals import SymbolType

2.Pandas数据处理

2.1 读取数据

  1. df = pd.read_excel('E:\Python博客作业/医院药品销售数据.xlsx')
  2. df.head(10)

运行结果

 2.2 数据大小

df.shape

 运行结果:

一共6578条药品购买数据。

2.3 查看索引、数据类型和内存信息

df.info()

 运行结果

 

 部分列存在数据缺失

2.4 统计空值数据

df.isnull().sum()

运行结果: 

2.5 输出包含空值的行

df[df.isnull().T.any()]

 运行结果:

因为购药时间在后面的分析中会用到,所以我们将购药时间为空的行删除.

  1. df1 = df.copy()
  2. df1 = df1.dropna(subset=['购药时间'])
  3. df1[df1.isnull().T.any()]

 2.6 社保卡号用"000"填充

  1. df1['社保卡号'].fillna('0000', inplace=True)
  2. df1.isnull().sum()

 可以看到没有空值了

2.7 社保卡号、商品编码为一串数字,应为str类型,销售数量应为int类型

  1. df1['社保卡号'] = df1['社保卡号'].astype(str)
  2. df1['商品编码'] = df1['商品编码'].astype(str)
  3. df1['销售数量'] = df1['销售数量'].astype(int)
  4. df1.info()
  5. df1.head()

 运行结果:

 

虽然这里我们强制转换社保卡号、商品编码为str类型,但是在读取表格的时候是以float读取的,所以存在小数点,这里我们可以在读取表格文件时指定相应列的数据类型(需要注意如果数据存在空值,那么转换数值型时会失效):

  1. df_tmp = pd.read_excel('E:\Python博客作业/医院药品销售数据.xlsx', converters={'社保卡号':str, '商品编码':str, '销售数量':int})
  2. df_tmp.head()

 

2.8 销售数量、应收金额、实收金额分布情况

  1. df2 = df_tmp.copy()
  2. df2 = df2.dropna(subset=['购药时间'])
  3. df2['社保卡号'].fillna('0000', inplace=True)
  4. df2['销售数量'] = df2['销售数量'].astype(int)
  5. df2[['销售数量','应收金额','实收金额']].describe()

数据中存在负值,显然不合理,我们看一下负值所在的行:

df2.loc[(df2['销售数量'] < 0)]

 2.9 负值转正值

  1. df2['销售数量'] = df2['销售数量'].abs()
  2. df2['应收金额'] = df2['应收金额'].abs()
  3. df2['实收金额'] = df2['实收金额'].abs()
  4. df2.loc[(df2['销售数量'] < 0) | (df2['应收金额'] < 0) | (df2['实收金额'] < 0)].sum()

2.10 列拆分(购药时间列拆分为两列)

  1. df3 = df2.copy()
  2. df3[['购药日期', '星期']] = df3['购药时间'].str.split(' ', 2, expand = True)
  3. df3 = df3[['购药日期', '星期','社保卡号','商品编码', '商品名称', '销售数量', '应收金额', '实收金额' ]]
  4. df3.head()

2.11 数据时间范围

  1. len(df3['购药日期'].unique())
  2. df3.groupby('购药日期').sum()

 

 一共201个购买日期,时间范围2016-01-01至2016-07-19

3. Pyecharts数据可视化

3.1 一周各天药品销量柱状图

  1. color_js = """new echarts.graphic.LinearGradient(0, 1, 0, 0,
  2. [{offset: 0, color: 'green'}, {offset: 1, color: 'pink'}], false)"""
  3. g1 = df3.groupby('星期').sum()
  4. x_data = list(g1.index)
  5. y_data = g1['销售数量'].values.tolist()
  6. b1 = (
  7. Bar()
  8. .add_xaxis(x_data)
  9. .add_yaxis('',y_data ,itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_js)))
  10. .set_global_opts(title_opts=opts.TitleOpts(title='一周各天药品销量',pos_top='2%',pos_left = 'center'),
  11. legend_opts=opts.LegendOpts(is_show=False),
  12. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
  13. yaxis_opts=opts.AxisOpts(name="销量",name_location='middle',name_gap=50,name_textstyle_opts=opts.TextStyleOpts(font_size=16)))
  14. )
  15. b1.render_notebook()

每天销量整体相差不大,周五、周六偏于购药高峰

3.2 药品销量前十柱状图

  1. color_js = """new echarts.graphic.LinearGradient(0, 1, 0, 0,
  2. [{offset: 0, color: '#FFFFFF'}, {offset: 1, color: 'red'}], false)"""
  3. g2 = df3.groupby('商品名称').sum().sort_values(by='销售数量', ascending=False)
  4. x_data = list(g2.index)[:10]
  5. y_data = g2['销售数量'].values.tolist()[:10]
  6. b2 = (
  7. Bar()
  8. .add_xaxis(x_data)
  9. .add_yaxis('',y_data ,itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_js)))
  10. .set_global_opts(title_opts=opts.TitleOpts(title='药品销量前十',pos_top='2%',pos_left = 'center'),
  11. legend_opts=opts.LegendOpts(is_show=False),
  12. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
  13. yaxis_opts=opts.AxisOpts(name="销量",name_location='middle',name_gap=50,name_textstyle_opts=opts.TextStyleOpts(font_size=16)))
  14. )
  15. b2.render_notebook()

 可以看出:苯磺酸氨氯地平片(安内真)、开博通、酒石酸美托洛尔片(倍他乐克)等治疗高血压、心绞痛药物购买量比较多。

3.3 药品销售额前十柱状图

  1. color_js = """new echarts.graphic.LinearGradient(0, 1, 0, 0,
  2. [{offset: 0, color: '#FFFFFF'}, {offset: 1, color: 'yellow'}], false)"""
  3. g3 = df3.groupby('商品名称').sum().sort_values(by='实收金额', ascending=False)
  4. g3 = g3.round(2)
  5. x_data1 = list(g3.index)[:10]
  6. y_data1 = g3['实收金额'].values.tolist()[:10]
  7. b3 = (
  8. Bar()
  9. .add_xaxis(x_data1)
  10. .add_yaxis('',y_data1 ,itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_js)))
  11. .set_global_opts(title_opts=opts.TitleOpts(title='药品销售额前十',pos_top='2%',pos_left = 'center'),
  12. legend_opts=opts.LegendOpts(is_show=False),
  13. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
  14. yaxis_opts=opts.AxisOpts(name="销售额",name_location='middle',name_gap=50,name_textstyle_opts=opts.TextStyleOpts(font_size=16)))
  15. )
  16. b3.render_notebook()

3.4 一周每天订单量

  1. color_js = """new echarts.graphic.LinearGradient(0, 1, 0, 0,
  2. [{offset: 0, color: '#25BEAD'}, {offset: 1, color: '#ed1941'}], false)"""
  3. area_color_js = (
  4. "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
  5. "[{offset: 0, color: '#25BEAD'}, {offset: 1, color: '#3fbbff0d'}], false)"
  6. )

 

  1. df_week = df3.groupby(['星期'])['实收金额'].count()
  2. week_x_data = df_week.index
  3. week_y_data = df_week.values.tolist()
  4. line1 = (
  5. Line(init_opts=opts.InitOpts(bg_color=JsCode(color_js)))
  6. .add_xaxis(xaxis_data=week_x_data)
  7. .add_yaxis(
  8. series_name="",
  9. y_axis=week_y_data,
  10. is_smooth=True,
  11. is_symbol_show=True,
  12. symbol="circle",
  13. symbol_size=6,
  14. linestyle_opts=opts.LineStyleOpts(color="azure"),
  15. label_opts=opts.LabelOpts(is_show=True, position="top", color="white"),
  16. itemstyle_opts=opts.ItemStyleOpts(
  17. color="pink", border_color="#fff", border_width=3
  18. ),
  19. tooltip_opts=opts.TooltipOpts(is_show=False),
  20. areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1),
  21. )
  22. .set_global_opts(
  23. title_opts=opts.TitleOpts(
  24. title="一周每天订单量",
  25. pos_top="2%",
  26. pos_left="center",
  27. title_textstyle_opts=opts.TextStyleOpts(color="#fff", font_size=16),
  28. ),
  29. xaxis_opts=opts.AxisOpts(
  30. type_="category",
  31. boundary_gap=True,
  32. axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63",font_weight =900),
  33. axisline_opts=opts.AxisLineOpts(is_show=False),
  34. axistick_opts=opts.AxisTickOpts(
  35. is_show=True,
  36. length=25,
  37. linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
  38. ),
  39. splitline_opts=opts.SplitLineOpts(
  40. is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
  41. ),
  42. ),
  43. yaxis_opts=opts.AxisOpts(
  44. type_="value",
  45. position="left",
  46. axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63"),
  47. axisline_opts=opts.AxisLineOpts(
  48. linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")
  49. ),
  50. axistick_opts=opts.AxisTickOpts(
  51. is_show=True,
  52. length=15,
  53. linestyle_opts=opts.LineStyleOpts(color="Rose"),
  54. ),
  55. splitline_opts=opts.SplitLineOpts(
  56. is_show=True, linestyle_opts=opts.LineStyleOpts(color="azure")
  57. ),
  58. ),
  59. legend_opts=opts.LegendOpts(is_show=False),
  60. )
  61. )
  62. line1.render_notebook()

3.5 自然月每天订单数量

  1. linestyle_dic = { 'normal': {
  2. 'width': 2,
  3. 'shadowColor': '#696969',
  4. 'shadowBlur': 10,
  5. 'shadowOffsetY': 10,
  6. 'shadowOffsetX': 10,
  7. }
  8. }
  9. df3['购药日期'] = pd.to_datetime(df3['购药日期'])
  10. df_day = df3.groupby(df3['购药日期'].dt.day)['星期'].count()
  11. day_x_data = [str(i) for i in list(df_day.index)]
  12. day_y_data = df_day.values.tolist()
  13. line2 = (
  14. Line(init_opts=opts.InitOpts(bg_color=JsCode(color_js)))
  15. .add_xaxis(xaxis_data=day_x_data)
  16. .add_yaxis(
  17. series_name="",
  18. y_axis=day_y_data,
  19. is_smooth=True,
  20. is_symbol_show=True,
  21. symbol="circle",
  22. symbol_size=6,
  23. linestyle_opts=opts.LineStyleOpts(color="#fff"),
  24. label_opts=opts.LabelOpts(is_show=True, position="top", color="white"),
  25. itemstyle_opts=opts.ItemStyleOpts(
  26. color="red", border_color="#fff", border_width=3
  27. ),
  28. tooltip_opts=opts.TooltipOpts(is_show=False),
  29. areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1),
  30. )
  31. .set_series_opts(
  32. linestyle_opts=linestyle_dic,label_opts=opts.LabelOpts(font_size=12, color='red' ),
  33. markpoint_opts=opts.MarkPointOpts(
  34. data=[opts.MarkPointItem(type_="max",itemstyle_opts=opts.ItemStyleOpts(
  35. color="#fed976", border_width=3)),
  36. opts.MarkPointItem(type_="min",itemstyle_opts=opts.ItemStyleOpts(
  37. color="#fed976", border_width=3))],
  38. symbol_size=[65, 50],
  39. label_opts=opts.LabelOpts(position="inside", color="red", font_size=10)
  40. ),
  41. )
  42. .set_global_opts(
  43. title_opts=opts.TitleOpts(
  44. title="自然月每日订单量",
  45. pos_top="2%",
  46. pos_left="center",
  47. title_textstyle_opts=opts.TextStyleOpts(color="#fff", font_size=16),
  48. ),
  49. xaxis_opts=opts.AxisOpts(
  50. type_="category",
  51. boundary_gap=True,
  52. axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63",font_weight =900),
  53. axisline_opts=opts.AxisLineOpts(is_show=False),
  54. axistick_opts=opts.AxisTickOpts(
  55. is_show=True,
  56. length=25,
  57. linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
  58. ),
  59. splitline_opts=opts.SplitLineOpts(
  60. is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
  61. ),
  62. ),
  63. yaxis_opts=opts.AxisOpts(
  64. type_="value",
  65. position="left",
  66. axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63"),
  67. axisline_opts=opts.AxisLineOpts(
  68. linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")
  69. ),
  70. axistick_opts=opts.AxisTickOpts(
  71. is_show=True,
  72. length=15,
  73. linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
  74. ),
  75. splitline_opts=opts.SplitLineOpts(
  76. is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
  77. ),
  78. ),
  79. legend_opts=opts.LegendOpts(is_show=False),
  80. )
  81. )
  82. line2.render_notebook()

 

 可以看出:5日、15日、25日是药品销售高峰期,尤其是每月15日

3.6 五月每日订单量

  1. df_day = df3.groupby(df3['购药日期'].dt.day)['星期'].count()
  2. day_x_data = [str(i) for i in list(df_day.index)]
  3. day_y_data = df_day.values.tolist()
  4. times = [x.strftime('%Y-%m-%d') for x in list(pd.date_range('20160501', '20160531'))]
  5. data = [[times[index],day_y_data[index]] for index,item in enumerate( day_y_data)]
  6. Cal = (
  7. Calendar(init_opts=opts.InitOpts(width="800px", height="500px"))
  8. .add(
  9. series_name="五月每日订单量分布情况",
  10. yaxis_data=data,
  11. calendar_opts=opts.CalendarOpts(
  12. pos_top='20%',
  13. pos_left='5%',
  14. range_="2016-05",
  15. cell_size=40,
  16. daylabel_opts=opts.CalendarDayLabelOpts(name_map="cn",
  17. margin=20,
  18. label_font_size=14,
  19. label_color='#EB1934',
  20. label_font_weight='bold'
  21. ),
  22. monthlabel_opts=opts.CalendarMonthLabelOpts(name_map="cn",
  23. margin=20,
  24. label_font_size=14,
  25. label_color='#EB1934',
  26. label_font_weight='bold',
  27. is_show=False
  28. ),
  29. yearlabel_opts=opts.CalendarYearLabelOpts(is_show=False),
  30. ),
  31. tooltip_opts='{c}',
  32. )
  33. .set_global_opts(
  34. title_opts=opts.TitleOpts(
  35. pos_top="2%",
  36. pos_left="center",
  37. title=""
  38. ),
  39. visualmap_opts=opts.VisualMapOpts(
  40. orient="horizontal",
  41. max_=800,
  42. pos_bottom='10%',
  43. is_piecewise=True,
  44. pieces=[{"min": 600},
  45. {"min": 300, "max": 599},
  46. {"min": 200, "max": 299},
  47. {"min": 160, "max": 199},
  48. {"min": 100, "max": 159},
  49. {"max": 99}],
  50. range_color=['green','pink','yellow','white','gray','light blue']
  51. ),
  52. legend_opts=opts.LegendOpts(is_show=True,
  53. pos_top='5%',
  54. item_width = 50,
  55. item_height = 30,
  56. textstyle_opts=opts.TextStyleOpts(font_size=16,color='red'),
  57. legend_icon ='path://path://M465.621333 469.333333l-97.813333-114.133333a21.333333 21.333333 0 1 1 32.384-27.733333L512 457.856l111.786667-130.432a21.333333 21.333333 0 1 1 32.426666 27.776L558.357333 469.333333h81.493334c11.84 0 21.461333 9.472 21.461333 21.333334 0 11.776-9.6 21.333333-21.482667 21.333333H533.333333v85.333333h106.517334c11.861333 0 21.482667 9.472 21.482666 21.333334 0 11.776-9.6 21.333333-21.482666 21.333333H533.333333v127.850667c0 11.861333-9.472 21.482667-21.333333 21.482666-11.776 0-21.333333-9.578667-21.333333-21.482666V640h-106.517334A21.354667 21.354667 0 0 1 362.666667 618.666667c0-11.776 9.6-21.333333 21.482666-21.333334H490.666667v-85.333333h-106.517334A21.354667 21.354667 0 0 1 362.666667 490.666667c0-11.776 9.6-21.333333 21.482666-21.333334h81.472zM298.666667 127.957333C298.666667 104.405333 317.824 85.333333 341.12 85.333333h341.76C706.304 85.333333 725.333333 104.490667 725.333333 127.957333v42.752A42.645333 42.645333 0 0 1 682.88 213.333333H341.12C317.696 213.333333 298.666667 194.176 298.666667 170.709333V127.957333zM341.333333 170.666667h341.333334V128H341.333333v42.666667z m-105.173333-42.666667v42.666667H170.752L170.666667 895.893333 853.333333 896V170.773333L789.909333 170.666667V128h63.296C876.842667 128 896 147.072 896 170.773333v725.12C896 919.509333 877.013333 938.666667 853.333333 938.666667H170.666667a42.666667 42.666667 0 0 1-42.666667-42.773334V170.773333C128 147.157333 147.114667 128 170.752 128h65.408z'
  58. ),
  59. )
  60. )
  61. Cal.render_notebook()

4.总结

我学习了Python中常用的数据可视化库,包括matplotlib、seaborn、plotly等。通过实际操作,我掌握了这些库的基本使用方法,了解了它们的特点和优势。同时,我还学习了如何从数据的角度出发进行可视化分析,如何选择合适的可视化方式来呈现数据,以及如何美化图表使其更具可读性和美观度。

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号