鸭哥这次教大家Python数据分析的两个基础包Numpy和Pandas。
首先导入这两个包。
import numpy as np
import pandas as pd
#定义一维数组array,参数传入是一个列表[2,3,4,5]
a=np.array([2,3,4,5])
#查询
a[0]
#切片访问,访问一个范围的元素
a[1:3]
#查询数据类型
a.dtype
#统计计算平均值
a.mean()
#标准差
a.std()
#向量化运行乘以标量
b=np.array[(1,2,3)]
c=b*4
#定义:Pandas一维数据结构:Series
#存放6家公司每一天的股价
stockS=pd.Series([54.74,190.9,173.14,1050.3,181.86,1139.49],
index=['腾讯',
'阿里巴巴',
'苹果',
'谷歌',
'Facebook',
'亚马逊'])
#获取描述统计信息
stockS.describe()
#iloc属性用于根据序号获取值
stcok.iloc[0]
#loc属性用于根据名字获取值
stockS.loc['腾讯']
#向量化运算:向量相加
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
#方法1:删除缺失值
s3.dropna()
#方法2:相加的时候把缺失值进行填充
s3=s1.add(s2,fill_value=0)
import numpy as np
import pandas as pd
a=np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
])
#获取行号是0,列号是2的元素a[0,2]
a[0,2]
#获取第一行,0前面要加逗号,不然打印类型出来
a[:,0]
#获取第一列,0后面加逗号
a[0,:]
#按轴计算:axis=1 计算每一行的平均值
a.mean(axis=1)
#第1步:定义一个字典,映射列名与对应列的值
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 OrdereDict
#定义一个有序字典
salesOrderDict=OrderedDict(salesDict)
#定义数据框,传入字典,列名
salesDf=pd.DataFrame(salesOrderDict)
#按照每列求平均值
saleDf.mean()
#查询第一行第二列的元素
salesDf.iloc[0.1]
#获取第一行,代表所有列
salesDf.iloc[0,:]
#获取第一列,代表所有行
salesDf.iloc[:,0]
#根据行号和列名称来查询值
salesDf.loc[0,'商品编码']
#获取第一行
salesDf.loc[0,:]
#获取‘商品名称’这一列
salesDf.loc[:,'商品名称']
salesDf['商品名称']
#通过列表来选择某几列的数据
salesDf[['商品名称','销售数量']]
#通过切片功能,获取指定范围的列
salesDf.loc[:,'购药时间':'销售数量']
#通过条件判断筛选,构件查询条件
querySer=salesDf.loc[:,'销售数量']>1
salesDf.loc[querySer,:]
#读取Excel数据
fileNameStr='./朝阳医院2018年销售数据.xlsx'
xls=pd.ExcelFile(fileNameStr)
salesDf=xls.parse('Sheet1')
#打印前面三行
salesDf.head(3)
#有多少行,多少列
salesDf.shape
#查询某一列的数据类型
salesDf.loc[:,'销售数量'].dtype
#查看每一列的统计数值
salesDf.describe()
接下来鸭哥带大家做一个案例。
import pandas as pd
fileNameStr='./朝阳医院2018年销售数据.xlsx'
salesDf=pd.readexcel(fileNameStr,sheet_name='Sheet1',detpe=str)
#打印前面五行
salesDf.head(5)
#有多少行,多少列
salesDf.shape
#查看每一列的数据类型
salesDf.dtypes
1)选择子集(本案例不需要选择子集)
subSalesDf=salesDf.loc[0:4,'购药时间':'销售数量']
2)列名重命名
colNameDict ={'购药时间':'销售时间'}
salesDf.rename(columns=colNameDict,inplace=True)
salesDf.head()
3)缺失值处理
python缺失值有3种:
1)Python内置的None值
2)在pandas中,将缺失值表示为NA,表示不可用not available。
3)对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。
后面出来数据,如果遇到错误:说什么foloat错误,那就是有缺失值,需要处理掉
所以,缺失值有3种:None,NA,NaN
dropna函数详细使用地址:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html
#删除列(销售时间,社保卡号)中为空的行
#how='any' 在给定的任何一列中有缺失值就删除
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')
#字符串转为数值(浮点型)
salesDf['销售数量'] = salesDf['销售数量'].astype('float')
salesDf['应收金额'] = salesDf['应收金额'].astype('float')
salesDf['实收金额'] = salesDf['实收金额'].astype('float')
#字符串分隔
testList='2018-06-03 星期五'.spilt(' ')
testList[0]
'''
定义函数:分割销售日期,获取销售日期
输入:timeColSer 销售时间这一列,是个Series数据类型
输出:分割后的时间,返回也是个Series数据类型
'''
def splitSaletime(timeColSer):
timeList=[]
for value in timeColSer:
#例如2018-01-01 星期五,分割后为:2018-01-01
dateStr=value.split(' ')[0]
timeList.append(dateStr)
#将列表转行为一维数据Series类型
timeSer=pd.Series(timeList)
return timeSer
#获取“销售时间”这一列
timeSer=salesDf.loc[:,'销售时间']
#对字符串进行分割,获取销售日期
dateSer=splitSaletime(timeSer)
#修改销售时间这一列的值
salesDf.loc[:,'销售时间']=dateSer
#数据类型转换:字符串转换为日期
#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为控制NaT
#format 是你原始数据中的日期的格式
salesDf.loc[:,'销售时间']=pd.to_datatime(salesDf.loc[:,'销售时间'],
formate='%y-%m-%d',
errors='coerce')
4.数据排序
by:按哪几行排序
ascending=true 表示升序排序
na-position='first' 表示空值放到前面
#按照销售日期升序
salesDf=salesDf.sort_values(by='销售时间',
ascending=True
naposition='first')
#重命名行号(index)排序后的列索引号是之前的行号,需要修改成从0到N按顺序的索引值
salesDf=salesDf.reset_index(drop=True)
salesDf.head()
5.异常值处理
#通过描述指标可以看出销售数量不可以小于0
salesDf.describe()
#删除异常值:通过条件判断筛选出数据
#查询条件
querySer=salesDf.loc[:,销售数量]>0
salesDf=salesDf.loc[querySer,:]
#业务指标1:月均消费次数=总消费次数 / 月份数
kpilDf=salesDf.drop_duplicates(
subset=['销售时间','社保卡号']
)
#总消费次数:有多少行
totalI=kpi1_Df.shape[0]
#第一步,按销售时间升序排序
kpil_Df=kpilDf.sort_value(by='销售时间',
ascending=True)
#重命名行名(index)
kpil_Df=kpil_Df.reset.index(drop=Ture)
#获取时间范围
#最小时间值
startTime=kpil_Df.loc[0,'销售时间']
endTime=kpil_Df.loc[tatali-1,'销售时间']
#第三步 计算月份
daysi=(endTime-startTime).days
#月份数 //表示整除
monthsi=daysi//30
#业务指标1:月均消费次数=总消费次数 / 月份数
kpil_i=tatali//monthi
#指标2:月均消费金额 = 总消费金额 / 月份数
#总消费金额
totalMoneyF=salesDf.loc[:,‘实收金额’].sum()
#月均消费金额
monthMoneyF=totalMoneyF/monthsi
#指标3:客单价=总消费金额 / 总消费次数
pct=totalMoneyF/totali
打了这么多代码做个总结:
这回基本上都是熟悉API,所以比较枯燥,不过要熟能生巧,冲鸭!