用Python进行数据分析——Numpy与Pandas

Numpy与Pandas是进行数据分析最常用的包。其中,Numpy(Numerical Python)是用来处理矩阵运算的,其运算效率高于列表;Pandas则是基于Numpy的数据分析工具,其能更方便地操作大型数据集,功能比Numpy更强大。

一、Numpy

由于Numpy包是第三方工具,因此每次使用前必须在代码中导入,其格式如下。其中,np为Numpy包约定俗成的简写,以便在后续程序中引用。

img

Numpy中用array函数可创建一维或多维数组(矩阵),与列表类似,其索引从0开始,可用切片的方式来访问数组(矩阵)中的数值。

值得注意的是:array内部的元素必须为相同的类型。

img

img

除上述基础操作外,Numpy还有实现数据的统计与向量加减等功能。但总体而言,Numpy可视作列表功能的扩展与延伸,其比列表更高效。后面将重点介绍作为主要数据分析工具的Pandas。

二、Pandas

Pandas有两个主要的数据结构:Series和DataFrame(须区分大小写)。

  • Series

Series用于创建一维数组,由一组数据和数据索引组成。数据索引是Pandas区别于Numpy的重要特征。不同于Array或列表,Series的索引不一定从0开始,它可以被定义,在Series创建的一位数组可通过定义的索引来获取值。

img

  • DataFrame

DataFrame是一个表格型的数据结构,它含有不同的列,每列都可以是不同的数据类型。类似一张excel表格或者SQL,其功能更强大。

定义DataFrame最常用的方法是导入一个字典。其中,DataFrame将字典的key作为列索引,可自行定义,而行索引则是从0开始定义。

img

通过行列索引即可获取DataFrame中的各数值。

img

三、用Pandas进行数据分析

除了导入字典以外,还可通过直接读取Excel文件来定义DataFrame。

img

在读取了待分析的数据表格后,就可对其进行数据分析。但在数据分析之前还有一个很重要的步骤:数据清洗。即:把读取到的原始数据,通过截取、重命名、类型转换、排序以及缺失/异常值处理等操作,转化为适合进行分析的干净、准确的数据形式。

img

现结合一个医院销售数据分析的具体项目,通过如下代码展现数据清洗的基本操作。

import pandas as pd
#导入Pandas,并简写为pd

'''数据清洗'''

#读取原始数据表格
fileNameStr = 'C:\houzi\医院销售数据.xlsx'
salesDf = pd.read_excel(fileNameStr,sheet_name='Sheet1',dtype=str)


#将表格中的“购药时间”重命名为“销售时间”
colNameDict = {'购药时间':'销售时间'}
salesDf.rename(columns=colNameDict,inplace=True)


#删除表格中销售时间或社保卡号缺失的行
salesDf = salesDf.dropna(subset=['销售时间','社保卡号'],how='any')


#将表格中的销售与金额数据转换为浮点数
salesDf['销售数量'] = salesDf['销售数量'].astype('float')
salesDf['应收金额'] = salesDf['应收金额'].astype('float')
salesDf['实收金额'] = salesDf['实收金额'].astype('float')


#定义函数处理“销售时间”中的日期
def splitSaletime(timeColSer):
    timeList=[]
    for value in timeColSer:
        dateStr=value.split(' ')[0]
        timeList.append(dateStr)
        
    timeSer=pd.Series(timeList)
    return timeSer

timeSer = salesDf.loc[:,'销售时间']
dateSer = splitSaletime(timeSer)
salesDf.loc[:,'销售时间'] = dateSer.values

#转换日期格式
salesDf.loc[:,'销售时间']=pd.to_datetime(salesDf.loc[:,'销售时间'],
                                    format='%Y-%m-%d', 
                                    errors='coerce')
salesDf = salesDf.dropna(subset=['销售时间','社保卡号'],how='any')


#按销售日期进行升序排列,并重命名行名
salesDf = salesDf.sort_values(by='销售时间',ascending=True)
salesDf = salesDf.reset_index(drop=True)


#删除表格中销售数量异常值
querySer = salesDf.loc[:,'销售数量']>0
salesDf = salesDf.loc[querySer,:]

#打印清洗后的数据表格前6行
salesDf.head(6)

img

原始表格经过清洗后即得到了干净、准确、可读性强且易于分析的数据。对该数据作运算分析就能得到我们想要的信息了,比如月均消费次数、月均消费金额等。

'''数据分析或构建模型'''

#计算消费次数(同一天内、同一人发生的所有消费算作一次消费)
kpi1_Df = salesDf.drop_duplicates(subset=['销售时间','社保卡号'])#删除“销售时间”与“社保卡号”重复的行
totalI = kpi1_Df.shape[0]
print('总消费次数=',totalI)

#计算总消费金额
totalMoney = salesDf.loc[:,'实收金额'].sum()

#计算消费月份数
startTime = kpi1_Df.loc[0,'销售时间']
endTime = kpi1_Df.loc[totalI-1,'销售时间']
daysI=(endTime-startTime).days
monthsI=daysI//30
print('月份数:',monthsI)

#计算月均消费次数
kpi1_I = totalI // monthsI
print('月均消费次数=',kpi1_I)

#计算月均消费金额
monthMoney = totalMoney / monthsI
print('月均消费金额=',monthMoney)

#计算客单价
pct = totalMoney / totalI
print('客单价:',pct)

img

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值