本文包含了利用python中的numpy包和pandas包实践数据分析和数据清洗工作,其中共有两个案列,朝阳医院的销售案例和拉勾网的求职招聘案例
学习步骤:
1.掌握numpy和pandas中参数的用法
#numpy用于数学计算
#pandas是基于numpy的数据分析包,提供了一套名为数据框的数据结构,可以方便的对表结构数据进行分析
#matplotlib是一个图形绘制库,用于图形数据分析的可视化
2. 导入Excel数据,本文列出两种
3.清洗数据- 1)截取数据
2)查看数据是否有异常值
3)删除无用的字符串,列,空值,重复数据
4)重新排序
5)重命名索引
以下来自我的 Jupyter Notebook 笔记,更多详细内容请访问笔记,其中有医院案例分析和拉勾网的数据分析http://note.youdao.com/noteshare?id=aeb875c4c7b2719e274ff7c5391f5f2cnote.youdao.com
import pandas as pd
imy_dfmport numpy as np
import warnings; warnings.simplefilter('ignore')
%matplotlib inline
import matplotlib.pyplot as plt
#一维数组
a = np.array([1,2,3,4,5])
#查询元素
print(a[0])
#切片访问
print(a[1:4])
#循环访问
for i in a:
print(i,end=',')
#查看数据类型
print('数据类型为:', a.dtype)
#运算
print('平均值为:', a.mean())
#标准差
print('标准差为:', a.std())
b = np.array([2,3,4])
c = b*5
print(c)
#pandas 一维数组,index参数用于指定每个元素的索引, Series中的 'S' 要大写
x = pd.Series([54,190,173,1050,181,1137], index = ['腾讯','阿里巴巴','苹果','谷歌','脸书','亚马逊'])
print(x)
#dercribe(),用于获取描述统计信息
print(x.describe())
#iloc 用于根据位置获取值
print(x.iloc[0])
#loc用于根据索引值获取值
print(x.loc['亚马逊'])
#向量运算,s1中的c,d 和 s2中的 e,f不能相互对应, 所以会出想 NaN值
s1 = pd.Series([1,2,3,4], index = ['a','b','c','d'])
s2 = pd.Series([1,2,3,4], index =['a','b','e','f'])
s3 = s1 + s2
#二维数组, numpy依然是用array创建数组,pandas用dataframe创建数据框
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
#查询元素
print(a)
print(a[0,2])
print(a[0,:])
print(a[:,0])
#axis=1 表示按行计算
print(a.mean(axis=1))
#axis=0 表示按列计算
print(a.mean(axis=0))
#定义字典, 映射列名与对应列的值
salesdict={
'购药时间':['2018-01-01 星期五','2018-01-02 星期六','2018-01-06 星期三'],
'社保卡号':['0016','0017','0018'],
'商品编码':[236,236,236],
'销售数量':[6,1,2],
'应收金额':[82.8,28,16.8],
'实收金额':[69,24.64,15]
}
#输出结果为 无序字典
s = pd.DataFrame(salesdict)
print(s)
#使用有序字典
#导入有序字典 OrderedDict
from collections import OrderedDict as D
sd = D(salesdict)
salesdf = pd.DataFrame(sd)
salesdf
#读取excel 方法1
filepath = r"C:\Users\jy035\Desktop\zty\朝阳医院2018年销售数据.xlsx"
filerd = pd.ExcelFile(filepath)
rd = filerd.parse('Sheet1')
rd.head()
#读取excel 方法2
df = pd.read_excel(r"C:\Users\jy035\Desktop\zty\朝阳医院2018年销售数据.xlsx")
df.head()
#每一列的统计数, dercribe 描述统计学, 如果代码加入dtype = 'object'之后, 会有不同的结果
#不加dtype = 'object'
rd.describe()
#选择子集-有时原始数据太大,需要先选择其中一部分来做分析
#行:0-4行, 列:购药时间列-销售数量
rd1 = rd.loc[0:4,'购药时间':'销售数量']
rd1
#列名重命名, 先给新的名称赋值
# rename
#inplace=false的话,表示数据框本身不会变,会另外自动创建一个新的数据框,与旧的不互相影响,inplace的默认值就是false
#如果inplace = True的话,原始数据框会变成重命名后的样子
renamedic = {'购药时间':'购药时间改'}
rd.rename(columns = renamedic, inplace=True)
rd.head()
#缺失数据处理,简单来说就是 删除数据中为空白的值
# how=any 在给定的任何一列中有缺失值 就 直接删除
print('删除缺失值前大小:', rd.shape)
rd = rd.dropna(subset = ['购药时间改','社保卡号'], how='any')
print('删除缺失值后大小', rd.shape)
#字符串转换为数值 (浮点数), astype语句, \n用于string中, 后面的输出另起一行
rd['销售数量'] = rd['销售数量'].astype('float')
rd['应收金额'] = rd['应收金额'].astype('float')
rd['实收金额'] = rd['实收金额'].astype('float')
print('转换后的数据类型:\n', rd.dtypes)
#定义函数:分割销售日期,获取销售时间
#输入:timecs 销售时间这一列,是series类型
#输出:分割后的时间,返回也是个series数据类型
def sstime (timecs):
timelist=[]
for value in timecs:
#例如 2018-01-01 星期五,分割后为:2018-01-01
datestr=value.split(' ')[0]
timelist.append(datestr)
#将列表转行为一维数据series类型
timeser=pd.Series(timelist)
return timeser
#获取‘销售时间’这一列
timeser=rd.loc[:,'购药时间改']
#对字符串进行分割,获取销售日期
dateser = sstime(timeser)
dateser[0:3]
#字符串转化为日期的数据类型
# to_datetime 修改时间格式
#errors = 'coerce' 如果原属数据不符合日期的格式,转换后的值为nat
#format 是原始数据中的日期格式
rd.loc[:,'购药时间改'] = pd.to_datetime(rd.loc[:,'购药时间改'],
format = '%Y-%m-%d',
errors = 'coerce')
#重命名行名,变为从零的有序升序排列
rd = rd.reset_index(drop = True)
rd.head()
#删除异常值:通过条件判断筛选出数据
#查询条件
queryser = rd.loc[:,'销售数量']>0
#应用查询条件
print('删除异常值前:', rd.shape)
rd = rd.loc[queryser,:]
print('删除异常值后: ',rd.shape)
#构建模型
#同一天内,同一个人发生的所有消费,算作一次消费
#月均消费次数= 月均消费次数 / 月份数
#假设 在1月1日, 0016的社保卡号有两次消费,需要删除重复的数据,用来计算 总消费次数
# 利用 drop_duplicates函数删除 购药时间和社保卡号 都相同的数值, 只保留其中1条
kpil = rd.drop_duplicates(subset = ['购药时间改','社保卡号'])
kpil = kpil.dropna(subset = ['购药时间改','社保卡号'], how = 'any')
# shape函数提供 ‘行数’和 ‘列数’ 的信息, shape[0],表示提取行数信息
totalI = kpil.shape[0]
print('总消费次数: ', totalI)
#step 1:排序
#按照销售时间升序排列
kpil = kpil.sort_values(by='购药时间改',
ascending = True)
#重命名行名 (index)
kpil = kpil.reset_index(drop = True)
kpil.head()
# step 2: 获取时间范围
# 最小时间值
startime = kpil.loc[0,'购药时间改']
# 最大时间值
endtime = kpil.loc[totalI-1, '购药时间改']
#step 3: 计算月份数
#天数
daysI = (endtime-startime).days
print(daysI)
#月份数: 运算符 '//' 表示取整除
monthI = daysI//30
print('月份数: ', monthI)
#业务指标1
#月均消费次数
#总消费次数/月份数
kpil_month_sale= totalI // monthI
print('业务指标1:月均消费次数= ',kpil_month_sale)
#业务指标2
#月均消费金额
#总消费金额/月份数
#总消费金额
totalmoneyf = rd.loc[:,'实收金额'].sum()
#月均消费金额
monthmoneyf = totalmoneyf/monthI
print('业务指标2: 月均消费金额', monthmoneyf)
# totalmoneyf :总消费金额
# totalI: 总消费次数
pct = totalmoneyf / totalI
print('客单价: ', pct)