python中numpy包_利用python的Pandas和numpy包进行数据分析

本文包含了利用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=aeb875c4c7b2719e274ff7c5391f5f2c​note.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)


版权声明:本文为weixin_36301296原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。