当前位置:   article > 正文

python数据分析之药品数据分析_基于python的药品销售数据分析

基于python的药品销售数据分析

目的:掌握 熟悉 pandas matplotplt numpy等库

1导入数据

  1. #导入数据
  2. file_name = '朝阳医院2018年销售数据.xlsx'
  3. # 使用ExcelFile()时需要传入目标excel文件所在路径及文件名称
  4. xls = pd.ExcelFile(file_name)
  5. print(xls)
  6. # 使用parse()可以根据传入的sheet名称来提取对应的表格信息转化成df格式
  7. dataDF = xls.parse('Sheet1',dtype='object')
  8. print(dataDF)
  9. # 输出前五行数据
  10. dataDF.head()

 

其中,商品编码就是商品名称 这两列数据重复

2查看数据

  1. # 使用sheet_names来查看当前表格中包含的所有sheet名称(按顺序)
  2. print(xls.sheet_names[0])
  3. #查看基本信息
  4. #查看数据几行几列
  5. print(dataDF.shape)
  6. #查看索引
  7. print(dataDF.index)
  8. #查看每一列的列表头内容
  9. print(dataDF.columns)
  10. #查看每一列数据统计数目
  11. print(dataDF.count())

以下可知购药时间和社保卡号存在缺失值

 

重命名一些列名

  1. #列重命名
  2. dataDF.rename(columns={'购药时间':'销售时间'},inplace=True)
  3. print(dataDF.head())

处理缺失值

  1. #缺失值处理
  2. print('删除缺失值前:', dataDF.shape)

 

 删除缺失值

  1. # 使用info查看数据信息,
  2. #print(dataDF.info())
  3. #删除缺失值
  4. # axis:轴。0'index',表示按行删除;1'columns',表示按列删除。
  5. # how:筛选方式。‘any',表示该行/列只要有一个以上的空值,就删除该行/列;‘all',表示该行/列全部都为空值,就删除该行/列。
  6. # thresh:非空元素最低数量。int型,默认为None。如果该行/列中,非空元素数量小于这个值,就删除该行/列。
  7. # subset:子集。列表,元素为行或者列的索引。如果axis=0或者‘index',subset中元素为列的索引;如果axis=1或者‘column',subset中元素为行的索引。由subset限制的子区域,是判断是否删除该行/列的条件判断区域。
  8. # inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
  9. dataDF = dataDF.dropna(subset=['销售时间','社保卡号'], how='any')
  10. print('\n删除缺失值后',dataDF.shape)

 

数据类型转换
  1. #数据类型转换
  2. dataDF['销售数量'] = dataDF['销售数量'].astype('float')
  3. dataDF['应收金额'] = dataDF['应收金额'].astype('float')
  4. dataDF['实收金额'] = dataDF['实收金额'].astype('float')
  5. print(dataDF.dtypes)

 索引重构

  1. dataDF = dataDF.reset_index(drop=True) # 索引重构
  2. print(dataDF)

 

 

定义函数:分割销售日期,提取销售日期
输入:timeColSer 销售时间这一列,Series数据类型,例‘2018-01-01 星期五’
输出:分割后的时间,返回Series数据类型,例‘2018-01-01’

  1. def splitSaletime(timeColSer):
  2. timeList = []
  3. for value in timeColSer:
  4. dateStr = value.split(' ')[0] # 用空格进行分割 并取第0项,也就是日期
  5. timeList.append(dateStr)
  6. timeSer = pd.Series(timeList) # 将列表转行为一维数据Series类型
  7. return timeSer
  8. #获取“销售时间”这一列
  9. timeSer = dataDF.loc[:,'销售时间']
  10. print(timeSer)
  11. #对字符串进行分割,提取销售日期
  12. dateSer = splitSaletime(timeSer)
  13. #修改销售时间这一列的值
  14. dataDF.loc[:,'销售时间'] = dateSer
  15. print(dataDF.head())

 

 

数据类型转换:字符串转换为日期

把切割后的日期转为时间格式,方便后面的数据统计:

  1. #errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT
  2. dataDF.loc[:, '销售时间'] = pd.to_datetime(dataDF.loc[:, '销售时间'], format='%Y-%m-%d', errors='coerce')
  3. print(dataDF.dtypes)

 

 统计空值

  1. print(dataDF.head())
  2. print(dataDF.isnull().sum())

 销售时间转换后有23个null

转换日期过程中不符合日期格式的数值会被转换为空值
删除含有NaT的空行

  1. dataDF = dataDF.dropna(subset=['销售时间','社保卡号'],how='any')
  2. datasDF = dataDF.reset_index(drop = True) #索引重铸
数据排序
  1. #数据排序
  2. dataDF = dataDF.sort_values(by='销售时间', ascending=True) # 升序排序
  3. dataDF = dataDF.reset_index(drop=True)
  4. dataDF.head()
  5. #查看描述统计信息
  6. print(dataDF.describe())

将'销售数量'这一列小于0的数据排除掉
  1. # 将'销售数量'这一列小于0的数据排除掉
  2. pop = dataDF.loc[:,'销售数量'] > 0
  3. print(pop)
  4. dataDF = dataDF.loc[pop, :] # 选取布尔值真的行和所有列
  5. dataDF.describe()

 统计月均消费次数(同一天一个人的所有消费算作一次消费)

  1. #计算总消费次数
  2. #删除重复数据
  3. kpil_Df = dataDF.drop_duplicates(subset=['销售时间', '社保卡号'])
  4. totalI = kpil_Df.shape[0] #shape[0]输出为行数
  5. print('总消费次数=', totalI)
  6. # 计算月份数
  7. # 按销售时间升序排序
  8. kpil_Df = kpil_Df.sort_values(by='销售时间', ascending=True)
  9. # 行索引重排
  10. kpil_Df = kpil_Df.reset_index(drop=True)
  11. # 获 取时间范围
  12. startTime = kpil_Df.loc[0, '销售时间']
  13. endTime = kpil_Df.loc[totalI-1, '销售时间']
  14. # 计算月份
  15. # 天数
  16. daysI = (endTime-startTime).days
  17. print(daysI)
  18. mounthI = daysI//30
  19. print('月份数=',mounthI)
  20. #月平均消费次数
  21. kpil_I = totalI//mounthI
  22. print('业务指标1:月均消费次数=', kpil_I)

  1. #消费总金额
  2. totalMoneyF = dataDF.loc[:, '实收金额'].sum()
  3. mounthMoney = totalMoneyF // mounthI
  4. print('业务指标2:月均消费金额=', mounthMoney)

 

  1. #客单价
  2. pct = totalMoneyF / totalI
  3. print('业务指标3:客单价=', pct)

每天消费趋势图

  1. import matplotlib.pyplot as plt
  2. #画图时用于显示中文字符
  3. from pylab import mpl
  4. mpl.rcParams['font.sans-serif'] = ['SimHei'] # SimHei是黑体的意思
  5. #font = FontProperties(fname='/Library/Fonts/Songti.ttc') #设置字体
  6. #在操作之前先复制一份数据,防止影响清洗后的数据
  7. groupDF = dataDF
  8. # 将'销售时间'设置为index
  9. groupDF.index = groupDF['销售时间']
  10. print(groupDF.head())
  11. gb = groupDF.groupby(groupDF.index)
  12. dayDF = gb.sum()
  13. print(dayDF)
  14. #画图
  15. plt.plot(dayDF['实收金额'])
  16. plt.title('按天消费金额')
  17. plt.xlabel('时间')
  18. plt.ylabel('实收金额')
  19. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/921421
推荐阅读
相关标签
  

闽ICP备14008679号