本文通过一案例,介绍用python进行数据分析的基本步骤和方法,数据集为某医院的药品销售数据。

数据分析基本步骤:

1.提出问题

从销售数据中分析出以下业务指标: 1)月均消费次数2)月均消费金额3)客单价4)消费趋势

2.理解数据

import pandas as pd

#定义一个变量,存放数据集文件路径

fileNameStr="D:\python\朝阳医院2018年销售数据.xlsx"

'''使用pandas.read_excel函数读取Excel数据,

参数sheet_name:数据在Excel里的哪个sheet下面,这块就写该sheet在excel里的名称

参数dtype=str: 统一先按照字符串读入,之后再转换

'''

salesDf=pd.read_excel(fileNameStr,sheet_name="Sheet1",dtype=str)

#打印出前几行,查看数据基本信息,确保数据运行正常

salesDf.head()

#查看数据行、列数

salesDf.shape

(6578, 7)

#查看每列的数据类型

salesDf.dtypes

购药时间 object

社保卡号 object

商品编码 object

商品名称 object

销售数量 object

应收金额 object

实收金额 object

dtype: object

3.清洗数据

#1)选择子集,本例中不需要

subSalesDf=salesDf.loc[0:5,"购药时间":"销售数量"]

subSalesDf

#2)列名重命名

'''inplace=False,数据框本身不会变,而会创建一个改动后新的数据框,inplace=True,数据框本身会改动,默认的inplace是False '''

salesDf.rename(columns={"购药时间":"销售时间"},inplace=True)#用字典指定旧列名和新列名的对应关系

#查看重命名后的数据表

salesDf.head()

#3)缺失数据处理

python缺失值有3种:None,NA,NaN

1)Python内置的None值

2)在pandas中,将缺失值表示为NA,表示不可用not available。

3)对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。

后面出来数据,如果遇到错误:说什么foloat错误,那就是有缺失值,需要处理掉

#删除销售时间、社保卡号中数据有缺失值的行

salesDf.dropna(subset=["销售时间","社保卡号"],how="any")#how=any表示,给定的任一列中缺失值就删除

print("删除缺失值后数据的大小:",salesDf.shape)

删除缺失值后数据的大小: (6578, 7)

#删除缺失值使索引序号不连续,用reset_index重置索引

salesDf.reset_index(drop=True)#drop=True: 把原来的索引index列去掉;drop=False:保留原来的索引

#4)数据类型转换

#将销售数量、应收金额、实收金额转换为数值型(浮点型)

salesDf["销售数量"]=salesDf["销售数量"].astype("float")

salesDf["应收金额"]=salesDf["应收金额"].astype("float")

salesDf["实收金额"]=salesDf["实收金额"].astype("float")

#转换后的数据类型

salesDf.dtypes

销售时间 object

社保卡号 object

商品编码 object

商品名称 object

销售数量 float64

应收金额 float64

实收金额 float64

dtype: object

#字符串分割,split()函数可对字符串进行拆解,然后返回一个下标从零开始的列表

'''定义函数:分割销售日期,获取销售日期输入:timeColSer 销售时间这一列,是个Series数据类型输出:分割后的时间,返回也是个Series数据类型'''

def splitSaletime(timeColSer):

timeList=[]#定义一个列表

for value in timeColSer:

dateStr=value.split(" ")[0]

timeList.append(dateStr)

#将列表转换为一维数据Series类型

timeSer=pd.Series(timeList)

return timeSer

#获取"销售时间”这一列

timeSer=salesDf.loc[:,"销售时间"]

#对字符串进行分割,获取销售日期

dateSer=splitSaletime(timeSer)

dateSer[0:4]

0 2018-01-01

1 2018-01-02

2 2018-01-06

3 2018-01-11

dtype: object

#修改“销售时间”这一列的值

salesDf.loc[:,"销售时间"] = dateSer

salesDf.head()

销售时间社保卡号商品编码商品名称销售数量应收金额实收金额

02018-01-01001616528236701强力VC银翘片6.082.869.00

12018-01-02001616528236701清热解毒口服液1.028.024.64

22018-01-060012602828236701感康2.016.815.00

32018-01-110010070343428236701三九感冒灵1.028.028.00

42018-01-1500101554328236701三九感冒灵8.0224.0208.00

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

#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT

#format 是你原始数据中日期的格式

salesDf.loc[:,'销售时间']=pd.to_datetime(salesDf.loc[:,'销售时间'],format="%Y-%m-%d",errors='coerce')

salesDf.dtypes

销售时间 datetime64[ns]

社保卡号 object

商品编码 object

商品名称 object

销售数量 float64

应收金额 float64

实收金额 float64

dtype: object

'''转换日期过程中不符合日期格式的数值会被转换为空值,这里删除列(销售时间,社保卡号)中为空的行'''

salesDf=salesDf.dropna(subset=["销售时间","社保卡号"],how="any")

#5)数据排序

print("排序前数据")

salesDf.head()

排序前数据

销售时间社保卡号商品编码商品名称销售数量应收金额实收金额

02018-01-01001616528236701强力VC银翘片6.082.869.00

12018-01-02001616528236701清热解毒口服液1.028.024.64

22018-01-060012602828236701感康2.016.815.00

32018-01-110010070343428236701三九感冒灵1.028.028.00

42018-01-1500101554328236701三九感冒灵8.0224.0208.00

'''by:按哪几列排序ascending=True 表示升序排列,ascending=True表示降序排列na_position=True表示排序的时候,把空值放到前列,这样可以比较清晰的看到哪些地方有空值官网文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.html'''

#按销售时间进行升序排列

salesDf=salesDf.sort_values(by="销售时间",ascending=True,na_position="first")

#排序后的数据

salesDf.head()

销售时间社保卡号商品编码商品名称销售数量应收金额实收金额

02018-01-01001616528236701强力VC银翘片6.082.869.0

14752018-01-0100107891628861456酒石酸美托洛尔片(倍他乐克)2.014.012.6

13062018-01-01001616528861417雷米普利片(瑞素坦)1.028.528.5

38592018-01-010010073966328866634硝苯地平控释片(欣然)6.0111.092.5

38882018-01-010010014289328866851缬沙坦分散片(易达乐)1.026.023.0

#重命名行名(index):排序后的列索引值是之前的行号,需要修改成从0到N按顺序的索引值

salesDf=salesDf.reset_index(drop=True)#使用drop参数来避免将旧索引添加为列

salesDf.head()

销售时间社保卡号商品编码商品名称销售数量应收金额实收金额

02018-01-01001616528236701强力VC银翘片6.082.869.0

12018-01-0100107891628861456酒石酸美托洛尔片(倍他乐克)2.014.012.6

22018-01-01001616528861417雷米普利片(瑞素坦)1.028.528.5

32018-01-010010073966328866634硝苯地平控释片(欣然)6.0111.092.5

42018-01-010010014289328866851缬沙坦分散片(易达乐)1.026.023.0

#6)异常值处理

salesDf.describe()#销售数量不能为负值

销售数量应收金额实收金额

count6552.0000006552.000006552.000000

mean2.38415850.4302546.266972

std2.37475487.6807581.043956

min-10.000000-374.00000-374.000000

25%1.00000014.0000012.320000

50%2.00000028.0000026.500000

75%2.00000059.6000053.000000

max50.0000002950.000002650.000000

#查询条件

querySer=salesDf.loc[:,"销售数量"]>0

print("删除异常值前",salesDf.shape)

#应用查询条件

salesDf=salesDf.loc[querySer,:]

print("删除异常值后",salesDf.shape)

删除异常值前 (6552, 7)

删除异常值后 (6509, 7)

4.构建模型

#指标1:月消费次数=总消费次数 / 月份数

'''根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,将重复的数据删除'''

kpi1_Df=salesDf.drop_duplicates(subset=["销售时间","社保卡号"])

#去重后数据集的行数即为总消费次数

totalI=kpi1_Df.shape[0]

print("总消费次数=",totalI)

总消费次数= 5345

#计算月份数

kpi1_Df=kpi1_Df.sort_values(by="销售时间",ascending=True)

#重置索引

kpi1_Df=kpi1_Df.reset_index(drop=True)

kpi1_Df.head()

销售时间社保卡号商品编码商品名称销售数量应收金额实收金额

02018-01-01001616528236701强力VC银翘片6.082.869.0

12018-01-010013448228861507苯磺酸氨氯地平片(安内真)1.09.58.5

22018-01-010012697828861464复方利血平片(复方降压片)4.010.09.4

32018-01-010010616728865099硝苯地平片(心痛定)2.03.43.0

42018-01-010010060654328861458复方利血平氨苯蝶啶片(北京降压0号)1.010.39.2

#获取时间范围

minTime=kpi1_Df.loc[0,"销售时间"]

maxTime=kpi1_Df.loc[totalI-1,"销售时间"]

#计算天数

daysI=(maxTime-minTime).days

monthsI=daysI//30#“//”表示取整除

print("月份数:",monthsI)

月份数: 6

#月均消费次数=总消费次数/月份数

kpi1_I=totalI/monthsI

print("月均消费次数=",kpi1_I)

月均消费次数= 890.8333333333334

指标2:月均消费金额=总消费金额/月份数

#总消费金额

totalMoneyF=salesDf.loc[:,"实收金额"].sum()

#月均消费金额

monthMoneyF=totalMoneyF/monthsI

print("月均消费金额=",monthMoneyF)

月均消费金额= 50672.494999999995

指标3:客单价=总消费金额/总消费次数

#客单价即每个顾客平均消费金额

pct=totalMoneyF/totalI

print("客单价=",pct)

客单价= 56.88212722170252

指标4:消费趋势,趋势分析需要用到python的高级功能,将在后续文章中介绍

#在进行操作之前,先把数据复制到另一个数据框中,防止对之前清洗后的数据框造成影响

groupDf=salesDf

#第1步:重命名行名(index)为销售时间所在列的值

groupDf.index=groupDf['销售时间']

groupDf.head()

销售时间社保卡号商品编码商品名称销售数量应收金额实收金额

销售时间

2018-01-012018-01-01001616528236701强力VC银翘片6.082.869.0

2018-01-012018-01-0100107891628861456酒石酸美托洛尔片(倍他乐克)2.014.012.6

2018-01-012018-01-01001616528861417雷米普利片(瑞素坦)1.028.528.5

2018-01-012018-01-010010073966328866634硝苯地平控释片(欣然)6.0111.092.5

2018-01-012018-01-010010014289328866851缬沙坦分散片(易达乐)1.026.023.0

用python做数值计算_用python进行数据分析的基本步骤和方法相关推荐

  1. python做统计分析_用Python做数据分析,Numpy,Pandas,matp

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用Python做数据分析,Numpy,Pandas,matplotlib是怎么也绕不开的三个包,我最开始学习pandas是看的<利用Python进行 ...

  2. python做副业_学习Python可以做哪些副业,你是不是感觉自己错过了一个亿?

    另外小编整理了一套Python的学习资料需要的按以下步骤可获得! 1.评论 2.转发 3.关注 4.后台私信[python]即可获取! 人生苦短,我用Python. 近年来,Python凭借其简洁易入 ...

  3. python做运动控制_用 Python 写一个跟踪运动对象系统

    这个该死的家伙.我就知道他偷了我最后一罐啤酒! 对于一个男人来讲,这些话永远都不该说.但是当我关上冰箱门的时候,我愤怒地叹息,感到厌恶,自言自语地说了这些. 你看,我花了12个小时写了这篇将要发表的文 ...

  4. python做物联网_使用Python来做物联网,就是这么easy!

    搭建整套物联网系统的方法有很多,最近四处捣鼓,使用python + 阿里云搭建一套最简单的物联系统,可以将单片机上的数据通过阿里云传输到PC端. 一.基本结构 先看架构图 框架.png 二.设备端接入 ...

  5. python做流程图_少儿Python编程_第十四讲:开发游戏

    无论哪一种编程语言,实现图形界面程序的方法都大同小异.本讲介绍用Python开发小游戏的方法,从中学习使用Python编写图形界面的程序,图形图像的基础知识,以及在图形界面程序中与用户交互.最后部分还 ...

  6. 有什么网站是python做的_自学python有什么网站

    Python是未来人工智能最好的编程语言,很多程序员在有其她编程基础的情况选择学习python是比较容易的,当然现在很多想进入编程界的新手选择python开始接触学习编程,但是由于经费有限,只能选择最 ...

  7. 怎么用python做战斗机_关于python文件操作

    总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...

  8. python做统计_利用 Python 进行统计

    你将学到什么 Create and interpret data visualizations using the Python programming language and associated ...

  9. python做积分_利用python求积分的实例

    python的numpy库集成了很多的函数.利用其中的函数可以很方便的解决一些数学问题.本篇介绍如何使用python的numpy来求解积分. 代码如下: # -*- coding: utf-8 -*- ...

最新文章

  1. David与Vincent的博弈游戏[树型DP]
  2. oracle 的目录是空的,oracle sqlplus在@命令路径中有空格的问题
  3. CentOS6.3的Grub启动项的menu.lst文件内容
  4. Mysql主从配置,实现读写分离
  5. Java Byte类的compareTo()方法和示例
  6. JDK1.8中如何用ScriptEngine动态执行JS
  7. C语言数组越界导致无限循环
  8. 关于iPhone 11系列、A13芯片 知乎网友是这么说的
  9. KNN(一)--简单KNN原理及实现
  10. EL表达式和JSTL的介绍以及基本使用
  11. 一个中专生:我在华为面试的真实经历
  12. 去掉word 2007中可恶的信息检索
  13. 给人脸戴上口罩,Python实战项目来了
  14. Python画樱花树代码和小猪佩奇
  15. 软件工程_绘制系统业务流程图
  16. Android底部导航栏切换页面填坑
  17. maven_防止在多模块Maven中找到“未找到插件”
  18. 【优化选址】基于模拟退火结合粒子群算法求解分布式电源定容选址问题matlab源码
  19. 2014年中国移动游戏行业研究报告
  20. java判断一个月连续打卡时间_java并发编程实战《五》死锁 挑战打卡60天

热门文章

  1. 开源免费,捷微H5活动平台(微砍价、九宫格、斧头帮、摇一摇送卡券) h5huodong.com
  2. java面试题目整理
  3. Spring Security安全机制
  4. Google I/O 2021 发布 Flutter 2.2
  5. 网络征信技术接口(架构篇)
  6. 便利店新零售怎么做,才能实现销售额倍增?
  7. 揭开电脑上登录多个微信的秘密
  8. Unity3D白皮书(二)纹理导入设置
  9. 移动固态硬盘删除分区(包括EFI分区)
  10. php怎么用不了图像处理函数,php图像处理函数