一、pandas简介
1、Numpy特点:主要对象是同种元素的多维数组,即numpy中所有元素都是同一类型,Numpy中纬度(dimension)叫做轴(axes),轴的个数叫秩(rank)
文兄:【Python数据分析】Numpy的详细教程 zhuanlan.zhihu.com
2、Pandas特点:有两个数据结构;Series和DataFrame(记住大小写区分),为大多数应用提供了可靠的,易于使用的数据基础。其中Series类似于一维数组,和numpy的array接近,由一组数据和数据标签组成,数据标签具索引作用。DataFrame是一个表格型的数据结构,它含有不同的列,每列都是不同的数据类型,想象得更明白一点,它类似一张excel表。
二、所涉及的python知识点梳理
三、数据分析实例
基本思路:数据理解——数据预处理(导入、数据清洗)——数据分析(可视化)——结论——可行性建议
数据来源:python——第4关数据分析的基本过程——朝阳医院2018年销售数据
https://pan.baidu.com/s/1uCr9403EdXnX8fcqEqxxdg
1、数据理解
做数据分析前,先要锁定针对的问题是什么,需要帮助你达到什么样的目的。如,下面我们想了解药店的客户的消费水平。我们就需要以下几个特征。
月均消费次数:同一个人在一个月内消费了多少次,即,总消费次数/总月份;可以看出病患的消费频率,可以间接反应医院的服务质量等等。
月均消费金额:同一个人每月大概花费多少钱,即,总消费金额/总月份;可以推测病患的医疗承担费用。
客单价:一个人,每次大概花费多少钱,即,总消费金额/总次数;
2、数据预处理(导入、清洗)
1)数据导入,查看
数据来源于excel,将excel中的数据导入pandas中。查看数据全貌,找出有用信息。
import pandas as pd
import numpy as np
#导入excel文件,我的文件在E盘中,命名为hospital,在这里指明导入的数据格式为object类型;
#注意,E后面加冒号,“Sheet1”中首字母大写,并用引号。
data=pd.read_excel("E:/python/hospital.xlsx",sheet_name="Sheet1",dtype="object")
共有6578条数据,7列。
其中缺失数据为:购药时间,社保卡号,缺2条;商品编码,商品名称,销售数量,应收金额,实收金额缺 2条。
2)尝试将列名字重命名
#这里可以尝试下列名重命名,将所有中文名转化为英文
col = {"购药时间":"time",
"社保卡号":"cardno",
"商品编码":"drugid",
"商品名称":"drugid",
"销售数量":"salesvolumes",
"应收金额":"amountreceivable",
"实收金额":"amountcollected",
}
data.rename(columns = col,inplace=True)
3) 缺失数据处理
原始数据可能有数据缺失情况,缺失值的处理方式有两种:缺失值较多时,利用插法补充;缺失值较少,可直接删除。在第一步中,我们看到有缺失数据,也可以用isnull()方式查看
从上图发现:缺失数据量很少,并且在计算月均消费次数,月均消费金额及客单价时,时间、社保卡号(代表消费者),实收金额是不可或缺的,因此我们采用删除法。
df.dropna可通过subset参数指定从哪几列判断缺失值;
how=’any’表示指定列中,任意一列有缺失值,就删除行;
how=’all’表示指定列中,所有列同时有缺失值时,才能删除行;
inplace=True直接在原表上做修改。
删除行数据后,立即查看数据框大小是否改变:由此看到删除缺失值后,还有6575行。
4) 数据类型转换
a)在导入excel时,我们默认所有的数据为object,然而salesvolumes(销售数量),amountreceivable(销售金额),amountcollected(实收金额)都是数据类型,并且时浮点类型,所以要将其转换成浮点型。
#数据类型转换
#字符串转为数值(浮点数)
data1["amountcollected"]=data1["amountcollected"].astype("float")
data1["amountreceivable"]=data1["amountreceivable"].astype("float")
data1["salesvolumes"]=data1["salesvolumes"].astype("float")
data1.dtypes
b)日期处理 ——将字符串转换为日期数据类型
“2018-02-12 星期五”,其中 星期几 我们目前不需要,可以考虑把星期几,分离出来,并将其删除。 因为要分割的是数据框中的整列数据,所以要用函数来分离日期。定义splittime为日期分离函数。 输入:timeColser销售这一列,是个Series数据类型输出;分割后的时间,也是个Series数据类型;
此刻,刚刚完成了第一步,即分割字符串。接下来要将字符串更改为日期型数据。
可使用pd.to_datetime。
format为原始日期数据的格式化形式,此处用”%Y-%m-%d”;errors=’coerce’用于控制非日期型数据转换后为空值。注意,此处m,d均为小写字母。
data1.loc[:,"time"]=pd.to_datetime(data1.loc[:,"time"],
format='%Y-%m-%d',
errors='coerce')
及时查看,数据类型是否符合预期,均符合。
转换日期过程中不符合日期格式的数值可能会被转换为空值,查看一下。
转换过程中,有空值产生,删除列(销售时间,社保卡号)中为空的行。
5) 数据排序
a)按月排序
因为在后面的计算中,有月均消费,因此我们需要按月排序,然后提取月份数。
排序:sort_values
b)索引排序
查看排序后的结果,可见,排序后的索引,还是以前的序号,在此,将索引的序号按顺序排列。
对索引用 reset_index() 重新排序
到此,数据格式转换结束。
6)异常数据处理
由上可见,salesvolumes(销售数量)不可为负数,存在异常值,所以要删除异常值。
这里可以用Series条件筛选销售数量大于0的行,间接删除了行后,立刻重置索引顺序reset_index(drop=True,inplace=True)
至此,数据处理已完成。
三、数据指标分析
1)月均消费次数=总消费次数/月分数;
月均消费次数
2)月均消费金额 月均消费金额=总消费金额/月份数
3)客单价
总结,本文中遇到的知识点分别如下:
#1、excel数据导入pandas;
data=pd.read_excel("E:/py/hosptal.xlsx","Sheet1","dtype=object")
#2、列名重命名
#先定义字典
col_dict = {"购药时间":"time","社保卡号":"cardno"}
#再重命名
data.rename(columns=col_dict,inplace=True)
#3、汇总数据是否有缺失值
data.isnull().sum()
#4、删除某几列为空的值
data1=data.dropna(subset=["time","cardno"],how="any")
#5、数据类型转换:字符串转为数值
data1["salesvolumes"]=data1["salesvolumes"].astype("float")
#6、函数定义 def
#7、字符串转换为日期值
#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT
#format 是你原始数据中日期的格式
data2.loc[:,'销售时间']=pd.to_datetime(data2.loc[:,'销售时间'],
format='%Y-%m-%d',
errors='coerce')
#8、数据排序
#按销售日期升序排序
data=data.sort_values(by='销售时间',
ascending=True)
#9、索引重置
data=data.reset_index(drop=True)
备注:函数的定义和应用,可参考以下文献:了解和掌握Python的函数