用python做数值计算_用python进行数据分析的基本步骤和方法
本文通过一案例,介绍用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进行数据分析的基本步骤和方法相关推荐
- python做统计分析_用Python做数据分析,Numpy,Pandas,matp
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用Python做数据分析,Numpy,Pandas,matplotlib是怎么也绕不开的三个包,我最开始学习pandas是看的<利用Python进行 ...
- python做副业_学习Python可以做哪些副业,你是不是感觉自己错过了一个亿?
另外小编整理了一套Python的学习资料需要的按以下步骤可获得! 1.评论 2.转发 3.关注 4.后台私信[python]即可获取! 人生苦短,我用Python. 近年来,Python凭借其简洁易入 ...
- python做运动控制_用 Python 写一个跟踪运动对象系统
这个该死的家伙.我就知道他偷了我最后一罐啤酒! 对于一个男人来讲,这些话永远都不该说.但是当我关上冰箱门的时候,我愤怒地叹息,感到厌恶,自言自语地说了这些. 你看,我花了12个小时写了这篇将要发表的文 ...
- python做物联网_使用Python来做物联网,就是这么easy!
搭建整套物联网系统的方法有很多,最近四处捣鼓,使用python + 阿里云搭建一套最简单的物联系统,可以将单片机上的数据通过阿里云传输到PC端. 一.基本结构 先看架构图 框架.png 二.设备端接入 ...
- python做流程图_少儿Python编程_第十四讲:开发游戏
无论哪一种编程语言,实现图形界面程序的方法都大同小异.本讲介绍用Python开发小游戏的方法,从中学习使用Python编写图形界面的程序,图形图像的基础知识,以及在图形界面程序中与用户交互.最后部分还 ...
- 有什么网站是python做的_自学python有什么网站
Python是未来人工智能最好的编程语言,很多程序员在有其她编程基础的情况选择学习python是比较容易的,当然现在很多想进入编程界的新手选择python开始接触学习编程,但是由于经费有限,只能选择最 ...
- 怎么用python做战斗机_关于python文件操作
总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...
- python做统计_利用 Python 进行统计
你将学到什么 Create and interpret data visualizations using the Python programming language and associated ...
- python做积分_利用python求积分的实例
python的numpy库集成了很多的函数.利用其中的函数可以很方便的解决一些数学问题.本篇介绍如何使用python的numpy来求解积分. 代码如下: # -*- coding: utf-8 -*- ...
最新文章
- David与Vincent的博弈游戏[树型DP]
- oracle 的目录是空的,oracle sqlplus在@命令路径中有空格的问题
- CentOS6.3的Grub启动项的menu.lst文件内容
- Mysql主从配置,实现读写分离
- Java Byte类的compareTo()方法和示例
- JDK1.8中如何用ScriptEngine动态执行JS
- C语言数组越界导致无限循环
- 关于iPhone 11系列、A13芯片 知乎网友是这么说的
- KNN(一)--简单KNN原理及实现
- EL表达式和JSTL的介绍以及基本使用
- 一个中专生:我在华为面试的真实经历
- 去掉word 2007中可恶的信息检索
- 给人脸戴上口罩,Python实战项目来了
- Python画樱花树代码和小猪佩奇
- 软件工程_绘制系统业务流程图
- Android底部导航栏切换页面填坑
- maven_防止在多模块Maven中找到“未找到插件”
- 【优化选址】基于模拟退火结合粒子群算法求解分布式电源定容选址问题matlab源码
- 2014年中国移动游戏行业研究报告
- java判断一个月连续打卡时间_java并发编程实战《五》死锁 挑战打卡60天