• 朝阳药品数据分析案例


    目的:掌握 熟悉 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()

  • 相关阅读:
    S7-200SMART案例分析——运动控制编程三轴控制(一)
    Ribbon工作原理
    【密码学篇】数字签名基础知识(无保密性)
    phpstudy设置允许远程访问mysql数据库(linux,pc都适用)
    Yolov7代码解析
    神经网络算法应用广泛吗,神经网络算法应用实例
    PCF8591学习笔记
    pgsql中实现按周统计,计算日期是周几
    Linux—权限管理
    关卡一: jQuery编程
  • 原文地址:https://blog.csdn.net/qq_44386182/article/details/125793613