常用数据分析领域的包:numpy(数学计算)、pandas(基于Numpy的工具:数据框)、matplotlib(数据分析可视化)
一、一维数据分析
建立numpy包---Array(数组) 建立pandsa包---Series
# 导入numpy包、pandas包
import numpy as np
import pandas as pd
1、numpy--一维数组
#定义一维数据 array
a=np.array([2,3,4,5])
#1)查询元素
a[0]-->2
#2)切边访问
a[1:3]-->[3,4]
#这里值的提醒的是切边访问,结果不包含结束索引即元素5,所以输出值为[3,4]
#3)循环访问
for i in a:
print(i)
#4)数据类型
a.dtype--> dtype('int32')
numpy一维数据与列表的区别
①统计功能:平均值mean()、标准差std()
#平均值
a.mean()-->3.5
a.std()-->1.1180339887498949
②向量化计算
2、pandas 一维数据结构
#定义一维数据结构
stockS=pd.Series([54.74,190.9,173.13,1050.3,181.86,1139.49],index=['腾讯','阿里巴巴','苹果','谷歌','Facebook','亚马逊'])
#描述统计信息
stockS.describe()-->count 6.000000
mean 465.070000
std 491.184946
min 54.740000
25% 175.312500
50% 186.380000
75% 835.450000
max 1139.490000
dtype: float64
iloc属性用于根据位置获取值
#iloc用法
stockS.iloc[0]-->54.740000000000002
loc属性用于根据索引获取值
#loc用法
stockS.loc['腾讯']-->54.740000000000002
一维数组pandas向量运算
#pandas向量化运算
s1=pd.Series([1,2,3,4],index=['a','b','c','d'])
s2=pd.Series([10,20,30,40],index=['a','b','e','f'])
s3=s1+s2
print('向量化增加后结果:',s3)
-->向量化增加后结果: a 11.0
b 22.0
c NaN
d NaN
e NaN
f NaN
dtype: float64
#方法一,删除缺失值
s3.dropna()--> a 11.0
b 22.0
dtype: float64
#方法二,将缺失值进行填充
s3=s1.add(s2,fill_value=0)
s3
-->a 11.0
b 22.0
c 3.0
d 4.0
e 30.0
f 40.0
dtype: float64
二、二维数据分析
二维数据结构
numpy-->array(数据) pandas-->DataFrame(数据框)
1、numpy二维数组
#定义numpy二维数据,注意创建时的[]
a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
--> array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
#二维数组得行号与列号,都是从0开始
#1)查询元素
a[0,2]-->3
#2)获取第1行
a[0,:]-->array([1, 2, 3, 4])
#3)获取第1列
a[:,0]-->array([1, 5, 9])
Numpy数轴参数
axis=1 指定行、axis=0 指定列
#按轴计算:axis=1计算每一行的平均值
a.mean(axis=1)--> array([ 2.5, 6.5, 10.5])
2、pandas 二维数组(DateFrame 数据框)
pands相比于Numpy的优点:
①pandas 每一列可以是不同类型的数据
②pandas有可以使用索引功能
salesDict={
'购药时间':['2018-01-01 星期五','2018-01-02 星期六','2018-01-06 星期三'],
'社保卡号':['001616528','001616528','0012602828'],
'商品编号':['强力vc银翘片','清热解毒口服液','感康'],
'销售数据':[6,1,2],
'应收金额':[82.8,28,16.8],
'实收金额':[69,24.64,15]}
#定义数据框、参数传入字典
salesDf=pd.DataFrame(salesDict)
salesDf-->
引入有序字典
#有序的数据框,导入有序字典
from collections import OrderedDict
#定义一个有序字典
salesorderedDict=OrderedDict(salesDict)
#传入数据框数据
salesDf=pd.DataFrame(salesorderedDict)
salesDf-->
平均值的计算
#pandas二维数组平均值计算
salesDf.mean()--> 销售数据 3.000000
应收金额 42.533333
实收金额 36.213333
dtype: float64
iloc用于根据位置查询值-iloc(行号,列号)
#1)查询元素
salesDf.iloc[0,2]--> '强力vc银翘片
#获取第一行
salesDf.iloc[0,:]--> 购药时间 2018-01-01 星期五
社保卡号 001616528
商品编号 强力vc银翘片
销售数据 6
应收金额 82.8
实收金额 69
#获取第2列
salesDf.iloc[:,1]--> 0 001616528
1 001616528
2 0012602828
Name: 社保卡号, dtype: object
loc属性用于根据索引查询值-loc(行名,列名)
#1)查询元素
salesDf.loc[0,'商品编号']-->'强力vc银翘片'
#2)获取第一行
salesDf.loc[0,:]--> 购药时间 2018-01-01 星期五
社保卡号 001616528
商品编号 强力vc银翘片
销售数据 6
应收金额 82.8
实收金额 69
Name: 0, dtype: object
#3)获取第1列
salesDf.loc[:,'商品编号']--> 0 强力vc银翘片
1 清热解毒口服液
2 感康
Name: 商品编号, dtype: object
#简单写法 salesDf['商品编号']
复杂的数据框查询
#查询某几列
salesDf[['商品编号','销售数据','实收金额']]-->
#切片功能:指定范围
salesDf.loc[:,'商品编号':'实收金额']-->
条件判断
#通过条件判断筛选
#1)构建查询条件
queryStr=salesDf.loc[:,'销售数据']>1
type(queryStr)-->pandas.core.series.Series
#2)应用查询条件
salesDf.loc[queryStr,:]-->
三、分析案例
数据分析的流程:1、提出问题-->2、理解数据-->3、数据清洗-->
4、构建模型-->5、数据可视化
1、提出问题:①、月均消费次数
②、月均消费金额
③、客架单
④、消费趋势
2、理解数据:
#读取数据
fileNameStr='F:\数据分析(中级)(Python)\第3关:数据分析的基本过程/朝阳医院2018年销售数据.xlsx'
xls=pd.ExcelFile(fileNameStr,dtype='object')
salesDf=xls.parse('Sheet1',dtype='object')
##获取前5行
salesDf.head()-->
#多少行,列
salesDf.shape--> (6578, 7)
#查看数据类型
salesDf.dtypes--> 购药时间 object
社保卡号 object
商品编码 object
商品名称 object
销售数量 object
应收金额 object
实收金额 object
dtype: object
3、数据清洗
流程;1、选择子集-->2、列重命名-->3、缺失值处理-->
4、数据类型转换-->5、数据排序-->异常值处理
#1、选择子集,这里选取了前5行,由于这个案例不需要选择子集,下的只为练习
salesDf_1=salesDf.loc[0:4,'购药时间':'销售数量']
salesDf_1
#2、列进行重命名
colnameDict={'购药时间':'销售时间'}
salesDf.rename(columns=colnameDict,inplace=True) #inplace=Flase 数据框本身不动,新创建
salesDf #inplace=True 修改数据本身
#3、缺失值处理:
salesDf=salesDf.dropna(subset=(['销售时间','社保卡号']),how='any')
#any表示任意一列
salesDf.shape--> (6575, 7)
#4、数据转换
salesDf['销售数量']=salesDf['销售数量'].astype('float')
salesDf['应收金额']=salesDf['应收金额'].astype('float')
salesDf['实收金额']=salesDf['实收金额'].astype('float')
salesDf.dtypes--> 销售时间 object
社保卡号 object
商品编码 object
商品名称 object
销售数量 float64
应收金额 float64
实收金额 float64
dtype: object
salesDf-->
字符串split
#字符串分割
testList='2018-08-13 星期一'.split(' ')
testList--> ['2018-08-13', '星期一']
testList[0]-->'2018-08-13'
数据格式的转换
#定义函数
def splitsaletime(timecolser):
#创建一个空的容器(列表)
testList=[]
#进行迭代
for value in timecolser:
#将字数组数据转换为字符串
value=str(value)
#split字符串分割
dataSer=value.split(' ')[0]
#逐一添加
testList.append(dataSer)
#返回series 一维数组
timeSer=pd.Series(testList)
return timeSer
timeser=salesDf.loc[:,'销售时间']
dataser= splitsaletime(timeser)
dataser-->
salesDf.loc[:,'销售时间']=dataser
salesDf-->
#字符串转换日期格式
#如果格式不能转换日期格式,就变为空值
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')
salesDf-->
#数据排序
print('排序前的数据集')
salesDf.head()-->
#按销售日期进行排序
salesDf=salesDf.sort_values(by='销售时间',ascending=True)
salesDf
#True表示升序排序,False表示降序-->
#重命名行名(index):排序后的列索引值是之前的行号,需要修改成从0到N按顺序的索引值
salesDf=salesDf.reset_index(drop=True)
salesDf.head()-->
#数据的描述统计
salesDf.describe()-->发现最小金额为负数,属于异常值
#删除异常值:通过条件判断筛选出数据
#查询条件
#删除异常值:通过条件判断筛选出数据
#查询条件
query=salesDf.loc[:,'销售数量']>0
salesDf=salesDf.loc[query,:]
salesDf.shape-->(6506, 7)
构建模型
1、业务指标1:月均消费次数=总消费次数 / 月份数
#删除重复数据
kpi1_Df=salesDf.drop_duplicates(subset=['销售时间','社保卡号'])
#查询shape的行数据
total=kpi1_Df.shape[0]
total-->5342
#按销售时间升序排列
kpil_Df=kpi1_Df.sort_values(by='销售时间',ascending=True)
#重命名行名称
kpil_Df=kpi1_Df.reset_index(drop=True)
kpil_Df-->
#最早销售时间
startTime=kpil_Df.loc[0,'销售时间']
#最晚销售时间
endTime=kpil_Df.loc[total-1,'销售时间']
#计算天数
daysI=(endTime-startTime).days
#计算月份数,取整删余
months=daysI//30
print('月份为:',months,'天')--> 6 天
#业务指标1:计算月消费次数
kpil_I=total/months
print('月消费次数:','{:3f}'.format(kpil_I))
--> 月消费次数: 890.333333
2、业务指标2:月均消费金额=总消费金额/月份数
#计算所有的实收金额
monerysum=sum(salesDf['实收金额'])
#计算月均消费金额
moneryF=monerysum/months
moneryF-->50668.351666666305
3、业务指标3:客单价=总消费金额/总消费次数
#客单价=总消费金额/总消费次数
pct=monerysum / total
print('客单价:',pct)-->56.909417821