数据分析之Pandas(九)高级处理-交叉表与透视表

交叉表与透视表

交叉表与透视表什么作用

探究股票的涨跌与星期几有关?

以下图当中表示,week代表星期几,1,0代表这一天股票的涨跌幅是好还是坏,里面的数据代表比例

可以理解为所有时间为星期一等等的数据当中涨跌幅好坏的比例
在这里插入图片描述
在这里插入图片描述

使用crosstab(交叉表)实现上图
  • 交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)
    • pd.crosstab(value1, value2)
    • DataFrame.pivot_table([], index=[])
案例分析
  • 数据准备
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 准备两列数据,星期数据以及涨跌幅是好是坏数据
    在这里插入图片描述
    在这里插入图片描述
  • 进行交叉表计算
    在这里插入图片描述
    或者
    在这里插入图片描述
    但是我们看到count只是每个星期日子的好坏天数,并没有得到比例,该怎么去做?
  • 对于每个星期一等的总天数求和,运用除法运算求出比例
    在这里插入图片描述
  • 查看效果
    使用plot画出这个比例,使用stacked的柱状图
    在这里插入图片描述
使用pivot_table(透视表)实现

使用透视表,刚才的过程更加简单
在这里插入图片描述
也可以
在这里插入图片描述
在这里插入图片描述

版权声明:
笔者博客文章主要用来作为学习笔记使用,内容大部分整理自互联网,如有侵权,请联系博主删除!

=====================补充


学习目标

  • 应用crosstabpivot_table实现交叉表与透视表

1 交叉表与透视表作用

探究股票的涨跌与星期几有关?

以下图当中表示,week代表星期几,1,0代表这一天股票的涨跌幅是好还是坏,里面的数据代表比例

可以理解为所有时间为星期一等等的数据当中涨跌幅好坏的比例


2 crosstab(交叉表) & pivot_table(透视表)

交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)

  • pd.crosstab(value1, value2)
  • DataFrame.pivot_table([], index=[])

3 案例

# 读取股票的数据
data = pd.read_csv("../Pandas/data/stock_day.csv")

data.head()

  • 1
  • 2
  • 3
  • 4

在这里插入图片描述


3.1 数据准备

  • 准备两列数据,星期数据以及涨跌幅是好是坏数据
  • 进行交叉表计算
# 寻找星期几跟股票涨跌的关系

## 日期索引
date = pd.to_datetime(data.index)

Index([‘2018-02-27’, ‘2018-02-26’, ‘2018-02-23’, ‘2018-02-22’, ‘2018-02-14’,
‘2018-02-13’, ‘2018-02-12’, ‘2018-02-09’, ‘2018-02-08’, ‘2018-02-07’,
...
‘2015-03-13’, ‘2015-03-12’, ‘2015-03-11’, ‘2015-03-10’, ‘2015-03-09’,
‘2015-03-06’, ‘2015-03-05’, ‘2015-03-04’, ‘2015-03-03’, ‘2015-03-02’],
dtype=‘object’, length=643)

## 日索引
date.day
Int64Index([27, 26, 23, 22, 14, 13, 12, 9, 8, 7,
...
13, 12, 11, 10, 9, 6, 5, 4, 3, 2],
dtype=‘int64’, length=643)

## 周索引
date.week
Int64Index([ 9, 9, 8, 8, 7, 7, 7, 6, 6, 6,
...
11, 11, 11, 11, 11, 10, 10, 10, 10, 10],
dtype=‘int64’, length=643)

## 周x索引
data.weekday
Int64Index([1, 0, 4, 3, 2, 1, 0, 4, 3, 2,
...
4, 3, 2, 1, 0, 4, 3, 2, 1, 0],
dtype=‘int64’, length=643)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1、先把对应的日期找到星期几
date = pd.to_datetime(data.index)

data[“weekday”] = date.weekday

data.head()

  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

  • 2、把p_change按照正负分为0或1
# 'p_change' 大于0分为1 小于0分为0
data['posi_neg'] = np.where(data['p_change'] > 0, 1, 0)

 
 
  • 1
  • 2

在这里插入图片描述

  • 3、通过交叉表crosstab找寻两列数据的关系
count = pd.crosstab(data['weekday'], data['posi_neg'])
count

posi_neg 0 1
weekday
0 63 62 # 可见周一’p_change’为负的有63个,为正的有62个
1 55 76
2 61 71
3 63 65
4 59 68

# 但是我们看到 count 只是每个星期日子的好坏天数,为了更直观的显示需得出其比例

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 4、对于每个星期一等的总天数求和,运用除法运算求出比例
sum = count.sum(axis=1)
sum

weekday
0 125
1 131
2 132
3 128
4 127
dtype: int64

per = count.div(sum, axis=0)
per

posi_neg 0 1
weekday
0 0.504000 0.496000
1 0.419847 0.580153
2 0.462121 0.537879
3 0.492188 0.507812
4 0.464567 0.535433

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

3.2 查看效果

使用plot画出这个比例,使用stacked的柱状图

per.plot(kind="bar", stacked=True)
plt.show()

 
 
  • 1
  • 2

在这里插入图片描述


3.3 pivot_table(透视表)实现

使用透视表,刚才的过程更加简单

# 通过透视表,将整个过程变成更简单一些
data.pivot_table(['posi_neg'], index='week')
posi_neg

weekday
0 0.496000 # 小于0.5表示为跌
1 0.580153
2 0.537879
3 0.507812
4 0.535433

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4 小结

  • 什么交叉表,透视表
    • 就是探索两列数据之间的关系
  • pd.crosstab()
    • 返回具体数量
  • 对象.pivot_table()
    • 返回占比情况

相关链接


=====函数参数说明
1、数据透视表
数据透视表是一种常见的数据汇总工具,根据一个或者多个键对数据进行聚合,并根据行、列分组将数据分配到各个矩形区域。pandas.DataFrame中含有pivot_table方法、pandas.pivot_table来实现数据透视表。
pandas.DataFrame.pivot_table函数参数:

pivot_table(self, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
 
# values  :     合并的列,需要聚合的列
# index   :      要聚合的列
# columns :     用与分组的列名,可以理解为列索引名
# aggfunc :     聚合函数
# fill_value:    缺失值填充
# dropna :      boolean, default = True, 当前列都为NaN时,整列丢弃。
# margins:       boolean, default =  False ,  当margins=True, 增加列/行总计
# margins_name   string , default = 'All',  设定margin列名

2、交叉表
交叉表是一种特殊的pivot_table, 同于统计分组频率。
    文档里的crosstab函数如下:

crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)
 
# index : 行索引
# columns: 列值
# value : 聚合的值
# rownames、colnames: 行、列名
# aggfunc: 聚合函数
# normalize :  正则化
 
        - If passed 'all' or `True`, will normalize over all values.
        - If passed 'index' will normalize over each row.
        - If passed 'columns' will normalize over each column.
        - If margins is `True`, will also normalize margin values.
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值