数据分析包:Numpy+Pandas+matplotlib

1. 一维数据分析

1、Pands和Numpy
1)一维数据的表示方式:

  • Numpy:Array
  • Pandas:Series

2)二者的关系:
pandas的Serise功能多于Array,且Series建立在Array基础上。
因此,以后会使用pandas的Series实现一维数据的操作。

1-1. Numpy一维数组
1、基本操作:初始化、查询、访问

import numpy as np
import pandas as pd

'''
一、Numpy基本操作
'''

#Numpy一维数组
a=np.array([2,3,4,5])
a

#查询index=0时array中存放的数据
a[0]

#切片查询  a[index1:index2],其中不包括a[index2]这个数据
a[1:3]

#循环访问 ,i代表array中的每个元素
for val in a:
    print(val)
#查询数据类型 
a.dtype

2、高级操作:均值、标准差、向量相加、向量相乘

'''
二、Numpy统计学相关操作
'''
#均值
print(a.mean())
#标准差
print(a.std())
#向量的加法
b=[7,8,3,2]
a+b
#向量的乘法
a*3

1-2. Pandas一维数据
基本操作

#Series初始化
stockS=pd.Series([54.74,190.9,173.14,1050.3,181.86,1139.49],
                 index=['腾讯','阿里','苹果','谷歌','Facebook','亚马逊'])

#获取描述统计信息
stockS.describe()

#获取index对应的元素
stockS.iloc[1]

#获取索引值对应的元素
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——dropna方法
print(s3.dropna())

#向量相加,将缺失值用0填充
s3=s1.add(s2,fill_value=0)
print(s3)

2. 二维数据

2-1. Numpy二维数据

'''
Numpy二维数据结构:Array
基本操作:初始化、根据index访问元素、根据切片获取元素
'''
#二维数组初始化
a=np.array([
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12]
])

#根据index获取元素,获取行号为0,列号为2的元素
print(a[0,2])

#切片操作获取元素——获取第一行元素
print(a[0,:])

#切片操作获取元素——获取第一列元素
print(a[:,0])

'''
axis
'''
#按列计算均值
a.mean(axis=0)

#按行计算均值
a.mean(axis=1)

2-2. pandas二维数据

Numpy二维数组,每个数据都一样,不利于表示Excel类似的不同数据类型

pandas的好处

  • 每一列可以是不同类型,可以方便表示Excel数据
  • 每一行、每一列都有统计数据

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 OrderedDict

#定义一个有序字典,保证数据插入顺序为存储顺序
salesOrderDict=OrderedDict(salesDict)

#初始化DataFrame
salesDf=pd.DataFrame(salesOrderDict)

2、获取统计信息_平均值

salesDf.mean()

3、查询数据

#ioc获取数据方式
salesDf.iloc[0,1] #获取第0行,第1列数据
salesDf.iloc[0,:] #获取第一行数据
salesDf.iloc[:,0] #获取第一列数据

#loc获取数据方式
salesDf.loc[0,'商品编码'] #第0行,列名为“商品编码”对应位置的数据
salesDf.loc[0,:] #第0行所有数据
salesDf.loc[:,'商品编码'] #获取商品编码列所有的数据
...

采取各种方式获取列数据
...
#获取某列数据
salesDf['商品编码']

#通过列表来选择某几列的数据
salesDf[['商品名称','销售数量']]

# 通过切片功能,获取指定范围的列
salesDf.loc[:,'购药时间':'销售数量']

4、获取符合条件的数据

# step1:选择销售数量大于1的行号
querySer=salesDf.loc[:,'销售数量']>1

# step2:根据行号进行切片,获取想要的列
salesDf.loc[querySer,:]

5、获取数据集的描述统计信息

# 读取Excel数据
fileNameStr='./朝阳医院2018年销售数据.xlsx'#设置Excel的名字和位置
xls=pd.ExcelFile(fileNameStr)  #读取Excel数据
salesDf=xls.parse('Sheet1') #将指定Sheet的数据转为DateFram数据

salesDf.head(3) #读取前三行数据,确保数据正常读取
salesDf.shape #获取数据的行数和列数
salesDf.loc[:,'销售数量'].dtype #查看某列的数据类型
salesDf.describe() #查看每列的统计描述信息

3. 案例:销售数据分析


数据分析步骤

  1. 提出问题
    一切数据分析的目标都是为了解决生活和工作中的实际问题
    在撰写分析报告前,必须定义清楚要研究的问题
  2. 理解数据
    采集数据:根据定义的问题,采集相关数据
    导入数据:数据可能在Excel等文件中
    查看数据集的信息:从整体理解数据
  3. 数据清洗
  4. 构建模型
    对清洗后的数据进行分析
    简单的分析:求取业务指标;
    复杂的分析:机器学习训练
  5. 数据可视化
    图表方式展示数据

3-1. 提出问题
需要分析出的业务指标:
1)月均消费次数
2)月均消费金额
3)客单价
4)消费趋势

3-2. 理解数据

import pandas as pd
#理解数据 第一步:读取Excel文件
fileNameStr='./朝阳医院2018年销售数据.xlsx' #设置filename:路径+文件名
salesDf=pd.read_excel(fileNameStr,sheet_name='Sheet1',dtype='object') #数据以object形式读入

#理解数据 第二步:打印前几行,看看每行数据情况
salesDf.head(5)  #查看前5行数据

#理解数据 第三步:查看行数和列数
salesDf.shape  

# 理解数据 第四步:查看每列数据类型
salesDf.dtypes

在这里插入图片描述

数据信息

3-3. 数据清洗

数据清洗的步骤:

  • 选择子集
  • 列名重命名
  • 缺失数据处理
  • 数据类型转换
    将某些字符形式的数字转为数字类型
  • 数据排序
  • 异常值处理
    数据大小或者太大,可能是异常值

3-3-1. 补充知识

3-3-1-1. split函数+merge函数
1、实现字符串分割+合并功能

# 初始化dataFrame
data = {'brand_model': ['德力西 GW912200', '埃帝尔 IB-207TPN-06231C02', '德力西 72LT3YFM40D', '科顺 2-3654-561 铆钉型'],
        'cate':['低压', '管阀', '低压', '搬运']}
df_data = pd.DataFrame(data)
df_data.head()

#split 切割数据
df_data_brand_model=df_data['brand_model'].str.split(' ', 1, expand=True)
print(df_data_brand_model)

# merge 合并数据
df_data=pd.merge(df_data,df_data_brand_model,how='inner',left_index=True,right_index=True)
df_data.head(2)

# split+merge切割数据+合并数据
pd.merge(df_data, df_data['brand_model'].str.split(' ', 1, expand=True), how='left', left_index=True, right_index=True)

2、split函数

 split(sep,n,expand=false)

split更详细的解释

3、merge函数

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
         left_index=False, right_index=False, sort=True,
         suffixes=('_x', '_y'), copy=True, indicator=False,
         validate=None)

merge函数与mysql的join函数功能相同。

  • left:左表名
  • right:右表名
  • how:连接方式 inner——内连接/outter——外连接/left——左连接/right——右连接
  • on:根据某个字段进行连接,必须存在于两个DateFrame中
  • left_on:根据左表哪个列连接
  • right_on:根据右表哪个列连接
  • left_index:是否根据左表索引连接
  • right_index:是饭否根据右表索引连接

更加具体的解释查看下方的链接:

3-3-1-2. sort函数

sort_values函数
by:按哪几列排序
ascending=True 表示升序排列,ascending=False表示降序排列
'''
#按销售日期进行升序排列
salesDf=salesDf.sort_values(by='销售时间’,ascending=True)

3-3-1-3 pandas条件查询

3-3-2. 数据清洗详细过程

'''
数据清洗第一步:选择子集(本案例不需要选择子集)
'''
# subSalesDf=salesDf.loc[0:3,'购药时间':'销售数量']

'''
数据清洗第二步:列名重命名
'''

colNameDict={'购药时间':'销售时间'} #定义旧列名和新列名对应关系的词典
salesDf.rename(columns=colNameDict,inplace=True) #inplace=True 重命名在原始数据框进行操作

'''
数据清洗第三步:缺失数据处理
'''
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any') #删除销售时间、社保卡号列所有为空的行
salesDf=salesDf.reset_index(drop=True) # reset_index重置索引使得索引序号不连续

'''
数据清洗第四步:数据类型转换
'''
#1、将销售数量、应收金额、实收金额转为float64类型
salesDf['销售数量']=salesDf['销售数量'].astype('float')
salesDf['应收金额']=salesDf['应收金额'].astype('float')
salesDf['实收金额']=salesDf['实收金额'].astype('float')

#2、将销售时间'2018-06-03 星期五' 格式转为 '2018-06-03';然后将数据转为日期格式
salesDf['销售时间']=salesDf['销售时间'].str.split(' ', 1, expand=True)[0] #split按照空格进行分割
salesDf.loc[:,'销售时间']=pd.to_datetime(salesDf.loc[:,'销售时间'],
                                        format='%Y-%m-%d', 
                                        errors='coerce') #将字符串类型转为datetime类型 
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')#去掉销售时间为NAN或者NULL值所在的行

'''
数据清洗第五步:数据排序
'''
salesDf=salesDf.sort_values(by='销售时间',ascending=True)#按照销售日期进行排序
salesDf=salesDf.reset_index(drop=True) #重置index索引值

'''
数据清洗第六步:异常值处理
'''
#查看最大值、最小值、均值等信息,看看是否存在异常
salesDf.describe() 
#筛选子集,销售数量>0
querySer=salesDf.loc[:,'销售数量']>0 
salesDf=salesDf.loc[querySer,:]

3-4. 模型构建

3-4-1. 月均消费次数
1、指标拆解
月均消费次数=总消费数/月份数

注意点:

  • 同一天内,同一个人 发生的所有消费算作一次消费
  • 使用(日期+社保卡号)两个值作为标识,去除重复数据

2、求解过程

'''
业务指标1:月均消费次数
指标拆解:月均消费次数=总消费次数/月份
'''
# step1:获取总消费次数
kpil1_Df=salesDf.drop_duplicates(subset=['销售时间','社保卡号'])#以(销售时间和社保卡号)为唯一标识,删除重复值
total=kpil1_Df.shape[0]  #有多少行数据

# step2:求取月份数
#求取月份数第一步:获取开始日期和结束日期
startMonth=salesDf['销售时间'].min()
endMonth=salesDf['销售时间'].max()

#求取月份数第二步:获取开始日期和结束日期之间的月份
months=(endMonth-startMonth).days//30

#step3:月均消费次数计算
kpi1=total//months
print('月均消费次数:',kpi1)

3-4-2. 月均消费金额
1、指标拆解
月均消费金额=总消费/月份数
2、求解过程

'''
业务指标2:月均消费金额
指标拆解:月均消费金额=总消费金额/月份数
'''

#第一步 求总消费金额
totalMoney=salesDf['实收金额'].sum()  #也可以采取的总消费金额计算方式 totalMoney=salesDf.loc[:,'实收金额'].sum()

#第二步 月均消费金额
monthlyMoney=totalMoney/months;
print('月均消费金额:',monthlyMoney)

3-4-3. 客单价
1、指标拆解
指标拆解:客单价=总金额/总消费次数
2、代码实现

'''
业务指标3:客单价
指标拆解:客单价=总金额/总消费次数
'''
pct=totalMoney/total
print('客单价:',pct)

3-4-3. 消费趋势
消费趋势需要学习完pandas绘图后才能实现

4、相关资料

pandas基本使用

pandas数据分析(1)

pandas数据分析2

-END-


学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习、自动化测试带你从零基础系统性的学好Python!

👉[CSDN大礼包:《python安装工具&全套学习资料》免费分享]安全链接,放心点击

👉Python学习大礼包👈

在这里插入图片描述

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)
在这里插入图片描述

👉Python必备开发工具👈

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python书籍和视频合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

👉Python面试刷题👈

👉Python副业兼职路线👈

在这里插入图片描述
在这里插入图片描述
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以点击链接免费领取或者保存图片到wx扫描二v码免费领取保证100%免费

👉[CSDN大礼包:《python安装工具&全套学习资料》免费分享]安全链接,放心点击

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐