Life is short, I use python!
1 python中常用的数据分析包
2 python:一维数据分析
2.1 用numpy包进行一维数据分析
import numpy as np
import pandas as pd
#定义一维数组array
a=np.array([2,3,4,5])
#查询元素
a[0]
2
#切片访问
#L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。
a[1:4]
array([3, 4, 5])
#循环访问
for i in a:
print(i)
2
3
4
5
#查看数据类型
a.dtype
dtype('int32')
#一维数组平均数
a.mean()
3.5
#标准差
a.std()
1.1180339887498949
#乘以标量
b=a*4
b
array([ 8, 12, 16, 20])
2.2 用pandas包进行一维数据分析
#定义一维数据Series *注意Series要大写S
stockS=pd.Series([54.74,190.9,173.14,1050.3,181.86,1139.49],
index=['腾讯','阿里巴巴','苹果','谷歌','Facebook','亚马逊'])
#描述统计信息
stockS.describe()
count 6.000000
mean 465.071667
std 491.183757
min 54.740000
25% 175.320000
50% 186.380000
75% 835.450000
max 1139.490000
dtype: float64
#根据位置获取值 iloc
stockS.iloc[0]
54.740000000000002
#根据索引获取值 loc
stockS.loc['亚马逊']
1139.49
#向量相加
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
s3
a 11.0
b 22.0
c NaN
d NaN
e NaN
f NaN
dtype: float64
#方法1:删除缺失值
s3.dropna()
a 11.0
b 22.0
dtype: float64
#方法2:将缺失值进行填充
s4=s1.add(s2,fill_value=0)
s4
a 11.0
b 22.0
c 3.0
d 4.0
e 30.0
f 40.0
dtype: float64
3 python:二维数据分析
3.1 用numpy包进行二维数据分析
#定义二维数组
a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
#查询元素
a[0,2]
3
#获取第一行
a[0,:]
array([1, 2, 3, 4])
#获取第一列
a[:,0]
array([1, 5, 9])
#计算每一行平均数 axis=1
a.mean(axis=1)
array([ 2.5, 6.5, 10.5])
#计算每一行平均数 axis=0
a.mean(axis=0)
array([ 5., 6., 7., 8.])
3.2 用pandas包进行二维数据分析
#定义一个字典,映射列名与对应列的值
salesDict={'购药时间':['2018-01-01 星期五','2018-01-02 星期六','2018-01-06 星期三'],
'社保卡号':['001616528','001616528','0012602828'],
'商品编码':[236701,236701,236701],
'商品名称':['强力VC银翘片','清热解毒口服液','感康'],
'销售数量':[6,1,2],
'应收金额':[82.8,28,16.8],
'实收金额':[69,24.64,15]}
#定义一个有序的字典
from collections import OrderedDict
salesorderedDict=OrderedDict(salesDict)
#定义数据框 columns index
salesDf=pd.DataFrame(salesorderedDict)
salesDf
#平均值:是按每列来求平均值
salesDf.mean()
商品编码 236701.000000
销售数量 3.000000
应收金额 42.533333
实收金额 36.213333
dtype: float64
#iloc根据位置查询值
salesDf.iloc[0,1]
'001616528'
salesDf.iloc[0,:]
购药时间 2018-01-01 星期五
社保卡号 001616528
商品编码 236701
商品名称 强力VC银翘片
销售数量 6
应收金额 82.8
实收金额 69
Name: 0, dtype: object
salesDf.iloc[:,0]
0 2018-01-01 星期五
1 2018-01-02 星期六
2 2018-01-06 星期三
Name: 购药时间, dtype: object
#loc根据索引查询值
salesDf.loc[0,'社保卡号']
'001616528'
salesDf.loc[0,:]
购药时间 2018-01-01 星期五
社保卡号 001616528
商品编码 236701
商品名称 强力VC银翘片
销售数量 6
应收金额 82.8
实收金额 69
Name: 0, dtype: object
salesDf.loc[:,'商品名称']
0 强力VC银翘片
1 清热解毒口服液
2 感康
Name: 商品名称, dtype: object
#简单查询
salesDf['社保卡号']
0 001616528
1 001616528
2 0012602828
Name: 社保卡号, dtype: object
3.3 数据框复杂查询
#查询某几列
salesDf[['商品名称','实收金额']]
#切片功能:指定范围
salesDf.loc[:,'商品名称':'实收金额']
#通过条件判断筛选:先构建查询条件,再应用查询条件
querySer=salesDf.loc[:,'销售数量']>1
type(querySer)
pandas.core.series.Series
querySer
0 True
1 False
2 True
Name: 销售数量, dtype: bool
salesDf.loc[querySer,:]
#数据集描述统计信息 *注意大小写
filenameStr='C:\coben\朝阳医院2018年销售数据.xlsx'
xls=pd.ExcelFile(filenameStr)
salesDf=xls.parse('Sheet1')
salesDf.head()
salesDf.loc[:,'销售数量'].dtype
dtype('float64')
salesDf.shape
(6578, 7)
salesDf.describe()
4 数据分析的基本过程
step1 提出问题:这是关键第一步
step2 理解数据
step3 数据清洗
step4 构建模型
step5 数据可视化
#step1:提出问题:
#医院销售数据:1 月均消费次数?2 月均消费金额?3 客单价?4 消费趋势是什么?
filenameStr='C:\coben\朝阳医院2018年销售数据.xlsx'
xls=pd.ExcelFile(filenameStr,dtype='object')
salesDf=xls.parse('Sheet1',dtype='object')
#step2:理解数据
salesDf.head()
salesDf.shape
(6578, 7)
# dtype *dtype要加s
salesDf.dtypes
购药时间 object
社保卡号 object
商品编码 object
商品名称 object
销售数量 object
应收金额 object
实收金额 object
dtype: object
salesDf.describe()
#step3:数据清洗
#示例:选择子集
subsalesDf=salesDf.loc[0:4,'购药时间':'销售数量']
subsalesDf
#列名重命名
colnameDict={'购药时间':'销售时间'}
salesDf.rename(columns=colnameDict,inplace=True)
salesDf.head()
#缺失数据处理
print('处理前shape:',salesDf.shape)
处理前shape: (6578, 7)
#how代表如何删,any是说有缺失值就删
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')
print('处理后shape:',salesDf.shape)
处理后shape: (6575, 7)
#转换数据类型
#字符串转换成数值 astype
salesDf['销售数量']=salesDf['销售数量'].astype('float')
salesDf['应收金额']=salesDf['应收金额'].astype('float')
salesDf['实收金额']=salesDf['实收金额'].astype('float')
print('转换后的数据类型:\n',salesDf.dtypes)
转换后的数据类型:
销售时间 object
社保卡号 object
商品编码 object
商品名称 object
销售数量 float64
应收金额 float64
实收金额 float64
dtype: object
#处理日期
#分割 *split用法
testlist='2018-1-1 星期五'.split(' ')
testlist
['2018-1-1', '星期五']
testlist[0]
'2018-1-1'
#定义分割函数 输入:series销售时间 输出:series销售时间
def splitSaletime(timeColSer):
timelist=[]
for value in timeColSer:
dataStr=value.split(' ')[0]
timelist.append(dataStr)
timeSer=pd.Series(timelist)
return timeSer
#赋值到函数 splitSaletime
timeSer=salesDf.loc[:,'销售时间']
dataSer=splitSaletime(timeSer)
dataSer[0:3]
0 2018-01-01
1 2018-01-02
2 2018-01-06
dtype: object
salesDf.loc[:,'销售时间']=dataSer
salesDf.head()
#字符串转换日期 to_datetime
#format 是指原始格式
#errors='coerce' 是指把不符合日期的格式,转换后赋值为空值 *注意coerce加‘’
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.shape
(6549, 7)
#数据排序
#使用sort_values,by:按哪几列排序,ascending=True 表示升序,ascending=False 表示降序
salesDf=salesDf.sort_values(by='销售时间',ascending=True)
salesDf.head()
#重命名行名 index
salesDf=salesDf.reset_index(drop=True)
salesDf.head()
#通过描述统计信息可以看出:销售数量存在负数,这是异常值。所以要处理异常值。
salesDf.describe()
#通过条件判断筛选出数据
querySer=salesDf.loc[:,'销售数量']>0
print('异常值处理前shape:',salesDf.shape)
salesDf=salesDf.loc[querySer,:]
print('异常值后理前shape:',salesDf.shape)
异常值处理前shape: (6549, 7)
异常值后理前shape: (6506, 7)
#step4:构建模型:这次分析只做到业务指标的分析
#月均消费次数=总消费次数/月份数(同一天内同一个人的消费只算1次)
#月均消费金额=总消费金额/月份数
#客单价=总消费金额/总消费次数
#消费趋势是什么?
kpi1_Df=salesDf.drop_duplicates(subset=['销售时间','社保卡号'])
totalI=kpi1_Df.shape[0]
print('总消费次数=',totalI)
总消费次数= 5342
kpi1_Df=kpi1_Df.sort_values(by='销售时间',ascending=True)
kpi1_Df=kpi1_Df.reset_index(drop=True)
startTime=kpi1_Df.loc[0,'销售时间']
endTime=kpi1_Df.loc[totalI-1,'销售时间']
#//表示整除
daysI=(endTime-startTime).days
monthsI=daysI//30
print('月份数=',monthsI)
月份数= 6
#计算月均销售次数
kpi1_I=totalI//monthsI
print('业务指标1:月均消费次数=',kpi1_I)
业务指标1:月均消费次数= 890
totalMoneyF=salesDf.loc[:,'实收金额'].sum()
monthMoneyF=totalMoneyF/monthsI
print('业务指标2:月均消费金额=',monthMoneyF)
业务指标2:月均消费金额= 50668.351666666305
pct=totalMoneyF/totalI
print('业务指标3:客单价=',pct)
业务指标3:客单价= 56.9094178210404
5 总结
5.1 用到的自带函数读入excel:ExcelFile
打印前5行:head
查看列的数据类型:dtype
查看有多少行,多少列:shape
每一列的统计数:describe
重命名列:rename
删除缺失值:dropna
字符串转换为数值(浮点数):astype
分割:split
字符串转换日期:to_datetime
排序:sort_values
重命名行:reset_index
删除重复值:drop_duplicates
5.2 学习问题解决办法Quickstart tutorialdocs.scipy.org10 Minutes to pandaspandas.pydata.orgUOL Buscabusca.uol.com.br