Pandas提高篇

2.Pandas提高篇

2.1 如何提高数据的颜值?

很多时候面对各种数据,我们想要让不同DataFrame有不同的颜色或格式来显示(styling),这时可以使用pandas Styler底下的format函式来实现,如何实现?以下通过一个实例来说明。
(1)生成数据

(2)数据浏览

(3)对dataframe不同数据设置不同的显示风格

(4)显示结果

2.2如何使你的分析更专业?

通常的数据分析有:排序、分组汇总平均分析、同比、环比等等,如何使你的分析更专业?可以通过引入一些更具专业的KPI指标分析,如反应客户偏好的TGI分析、反应客户价值的RMF指标、投资回报比(ROI)等等,这里以TGI分析为例,这也是用户画像中的一个重要指标。

2.2.1 TGI指标解释

1.TGI(Target Group Index的简称)指标计算公式:

2.TGI关键特征
TGI计算公式中,有三个关键点:总体,目标群体,某一特征。
 总体:是我们研究的所有对象,比如一个学校里的所有人;
 目标群体:是总体中我们感兴趣的一个分组,比如一个班;
 某一特征:想要分析的某种行为或者状态,比如打篮球。
3、TGI计算示例
假设一个学校有1000人,有300个人喜欢打篮球,那么这个比例就是30%,即“总体中具有相同特征的群体所占比例” = 30%。
假设一个班有50个人,有20个人喜欢打篮球,那么这个比例就是40%,即“目标群体中具有某一特征的群体所占比例” = 40%。
TGI指数 = (40% / 30%) * 100 = 133
TGI指数大于100,代表着某类用户更具有相应的倾向或者偏好,数值越大则倾向和偏好越强;小于100,则说明该类用户相关倾向较弱(和平均相比);而等于100则表示在平均水平。

2.2.2 导入数据

本数据为客户购买商品的订单信息,具体数据包括品牌名、买家姓名、付款时间、订单状态和地域等字段,一共28832条数据。
1、导入数据

2、数据浏览

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 28832 entries, 0 to 28831
Data columns (total 9 columns):
品牌名称 28832 non-null object
买家昵称 28832 non-null object
付款日期 28832 non-null datetime64[ns]
订单状态 28832 non-null object
实付金额 28832 non-null float64
邮费 28832 non-null int64
省份 28832 non-null object
城市 28832 non-null object
购买数量 28832 non-null int64
dtypes: datetime64[ns](1), float64(1), int64(2), object(5)
memory usage: 2.0+ MB

2.2.3 选择一个特征

这里我们以每个客户平均销售额50为界限,划分“高客单”或"低客单",接下来我们以“高客单”为特征进行TGI分析。
1、对dataframe进行分组汇总

2、增加一个客单类别指标

2.2.4 获取客户地域信息

df_users有单个用户的金额和客户类型,为便于各省市消费情况的比较,接下来就是添加每个用户的地域字段, 这个可以同pd.merge函数实现,具体与两表关联类型。由于源数据是未去重的,我们得先按昵称去重,不然匹配的结果会有许多重复的数据。
1、关联前对原df进行预处理

【说明】
DataFrame.duplicated函数格式为:
DataFrame.duplicated(subset=None, keep='first') 参数说明:
 subset可选
 keep{‘first’, ‘last’, False}, default ‘first’ df.loc函数功能:
通过标签或布尔数组访问一组行和列

2.2.5 计算高客单TGI指标

这样得到的结果包含了层次化索引,要索引得到“高客单”列,需要先索引“买家昵称”,再索引“高客单”。

这样,拿到了每个省市的高客单人数,然后再拿到低客单的人数,进行横向合并:

再看看每个城市总人数以及高客单人数占比,来完成“目标群体(如:高客单)中具有某一特征的群体所占比例”这个分子的计算:

有些非常小众的城市,高客单或者低客单人数等于1甚至没有,而这些值尤其是空值会影响结果的计算,我们要提前检核数据:

0.41528303343887557
最后一步,就是TGI指数的计算,顺便排个序

2.2.6 重要结论

基于各城市高客单TGI指数,我们发现福州、珠海、北京、厦门、佛山、南昌、成都、上海、无锡和深圳,是高客单偏好排名前10的城市!咱们要试销的高客单新产品,如果仅从客单角度,可以优先考虑他们!

2.3 如何使你的分析结果更具震撼效果?

为使分析结果更直观、更具震撼效果,可以采用pycharts工具,该工具提供了很多富有感染力的画图模块,除通常的图形外,Pycharts还提供热力图、日历图、迁徙图、地图等等,这里我们以地图为例。
1、导入需要的库

2、对tgi增加一个字段
为便于使用中国地图,这里增加一个中国字段。

3、创建画图函数

运行该函数

显示各省或直辖市,高客单的用户数。

另外,向大家提供一个有关如何提升数据分析能力的博客,供大家参考
月薪3000和30000的数据分析师差在哪?

pandas基础篇

1. Pandas基础篇

Python有了NumPy的Pandas,用Python处理数据就像使用Exel或SQL一样简单方便。
Pandas是基于NumPy的Python 库,它被广泛用于快速分析数据,以及数据清洗和准备等工作。可以把 Pandas 看作是 Python版的Excel或Table。Pandas 有两种数据结构:
Series和DataFrame,Pandas经过几个版本的更新,目前已经成为数据清洗、处理和分析的不二选择。

1.1 问题:Pandas有哪些优势?

科学计算方面NumPy是优势,但NumPy中没有标签,数据清理、数据处理就不是其强项了。而DataFrame有标签,就像SQL中的表一样,所以在数据处理方面DataFrame就更胜一筹了,具体包含以下几方面:
(1)读取数据方面
Pandas提供强大的IO读取工具,csv格式、Excel文件、数据库等都可以非常简便地读取,对于大数据,pandas也支持大文件的分块读取。
(2)在数据清洗方面
面对数据集,我们遇到最多的情况就是存在缺失值,Pandas把各种类型数据类型的缺失值统一称为NaN,Pandas提供许多方便快捷的方法来处理这些缺失值NaN。
(3)分析建模阶段
在分析建模阶段,Pandas自动且明确的数据对齐特性,非常方便地使新的对象可以正确地与一组标签对齐,由此,Pandas就可以非常方便地将数据集进行拆分-重组操作。
(4)结果可视化方面
结果展示方面,我们都知道Matplotlib是个数据视图化的好工具,Pandas与Matplotlib搭配,不用复杂的代码,就可以生成多种多样的数据视图。

1.2 Pandas数据结构

Pandas中两个最常用的对象是Series和DataFrame。使用pandas前,需导入以下内容:

Pandas主要采用Series和DataFrame两种数据结构。Series是一种类似一维数据的数据结构,由数据(values)及索引(indexs)组成,而DataFrame是一个表格型的数据结构,它有一组序列,每列的数据可以为不同类型(NumPy数据组中数据要求为相同类型),它既有行索引,也有列索引。

图1-1 DataFrame结构

1.3 Series

上章节我们介绍了多维数组(ndarray),当然,它也包括一维数组,Series类似一维数组,为啥还要介绍Series呢?或Series有哪些特点?
Series一个最大特点就是可以使用标签索引,序列及ndarray也有索引,但都是位置索引或整数索引,这种索引有很多局限性,如根据某个有意义标签找对应值,切片时采用类似[2:3]的方法,只能取索引为2这个元素等等,无法精确定位。
Series的标签索引(它位置索引自然保留)使用起来就方便多了,且定位也更精确,不会产生歧义。以下通过实例来说明。
(1)使用Series

0 1
1 3
2 6
3 -1
4 2
5 8
dtype: int64
(2)使用Series的索引

a 1
c 3
d 6
e -1
b 2
g 8
dtype: int64
(3)根据索引找对应值

1.4 DataFrame

DataFrame除了索引有位置索引也有标签索引,而且其数据组织方式与MySQL的表极为相似,除了形式相似,很多操作也类似,这就给操作DataFrame带来极大方便。这些是DataFrame特色的一小部分,它还有比数据库表更强大的功能,如强大统计、可视化等等。
DataFrame有几个要素:index、columns、values等,columns就像数据库表的列表,index是索引,values就是值。

图1-2 DataFrame结果

1.4.1 生成DataFrame

生成DataFrame有很多,比较常用的有导入等长列表、字典、numpy数组、数据文件等。

1.4.2 获取数据

获取DataFrame结构中数据可以采用obj[]操作、obj.iloc[]、obj.loc[]等命令。
(1)使用obj[]来获取列或行

(2)使用obj.loc[] 或obj.iloc[]获取行或列数据。
loc通过行标签获取行数据,iloc通过行号获取行数据。
loc 在index的标签上进行索引,范围包括start和end.
iloc 在index的位置上进行索引,不包括end.
这两者的主要区别可参考如下示例:

【说明】
除使用iloc及loc外,早期版本还有ix格式。pandas0.20.0及以上版本,ix已经丢弃,请尽量使用loc和iloc;

1.4.3 修改数据

我们可以像操作数据库表一样操作DataFrame,删除数据、插入数据、修改字段名、索引名、修改数据等,以下通过一些实例来说明。

图1-3 数据结构

1.4.4 汇总统计

Pandas有一组常用的统计方法,可以根据不同轴方向进行统计,当然也可按不同的列或行进行统计,非常方便。
常用的统计方法有:
表1-1 Pandas统计方法

以下通过实例来说明这些方法的使用
(1)把csv数据导入pandas

(2)查看df的统计信息

【说明】

即各项-均值的平方求和后再除以N 。
std:表示标准差,是var的平方根。

1.4.5选择部分列

这里选择学生代码、课程代码、课程名称、程程成绩,注册日期等字段

1.4.6删除重复数据

如果有重复数据(对df1的所有列),则删除最后一条记录。

1.4.7补充缺省值

(1)用指定值补充NaN值
这里要求把stat_date的缺省值(NaN)改为'2018-09-01'

(2)可视化,并在图形上标准数据

结果为:

(3)导入一些库及支持中文的库

(4)画图

运行结果


图1-4 可视化结果

1.4.8 Pandas操作MySQL数据库

(1)从MySQL数据库中获取学生基本信息表

(2)查看df_info前3行数据

(3)选择前两个字段

(4)df2 与df_info1 根据字段stud_code 进行内关联

(5)对df3 根据字段stud_code,sub_code进行分组,并求平均每个同学各科的平均成绩。

【备注】
如果需要合计各同学的成绩,可用如下语句。

(6)选择数学分析课程,并根据成绩进行降序。

(7)取前5名

注:DataFrame数据结构的函数或方法有很多,大家可以通过df.[Tab键]方式查看,具体命令的使用方法,如df.count(),可以在Ipython命令行下输入:?df.count() 查看具体使用,退出帮助界面,按q即可。

1.4.9 Pandas操作excel

把DataFrame数据写入excel中的多个sheet中

1.4.10 Pandas的三板斧

我们知道数据库中有很多函数可用作用于表中元素,DataFrame也可将函数(内置或自定义)应用到各列或行上,而且非常方便和简洁,具体可用通过DataFrame的apply、applymap和map来实现,其中apply、map对数据集中的每列或每行的逐元操作,applymap对dataframe的每个元素进行操作,这些函数对数据处理的强大工具。以下通过实例说明具体使用。

1.4.11 处理时间序列

pandas最基本的时间序列类型就是以时间戳(时间点)(通常以python字符串或datetime对象表示)为索引的Series:

索引为日期的DataFrame数据的索引、选取以及子集构造

1.4.12 数据离散化

如何离散化连续性数据?在一般开发语言中,可以通过控制语句来实现,但如果分类较多时,这种方法不但繁琐,效率也比较低。在Pandas中是否有更好方法?如果有,又该如何实现呢?
pandas有现成方法,如cut或qcut等,不需要编写代码,至于如何使用还是通过实例来说明。

现在需要对age字段进行离散化, 划分为(20,30],(30,40],(40,50].

1.4.13 交叉表

我们平常看到的数据格式大多像数据库中的表,如购买图书的基本信息:
表1-2 客户购买图书信息

这样的数据比较规范,比较适合于一般的统计分析。但如果我们想查看客户购买各种书的统计信息,就需要把以上数据转换为如下格式:
表1-3 客户购买图书的对应关系

我们观察一下不难发现,把表1-3中书代码列旋转为行就得到表2数据。如何实现行列的互换呢?编码能实现,但比较麻烦,还好,pandas提供了现成的方法或函数,如stack、unstack、pivot_table函数等。以下以pivot_table为例说明具体实现。

实现行列互换,把书代码列转换为行或索引