【Pandas】交叉表与透视表


学习目标

  • 应用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()

在这里插入图片描述


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、先把对应的日期找到星期几
date = pd.to_datetime(data.index)

data["weekday"] = date.weekday

data.head()

在这里插入图片描述

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

在这里插入图片描述

  • 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 只是每个星期日子的好坏天数,为了更直观的显示需得出其比例
  • 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

3.2 查看效果

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

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

在这里插入图片描述


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

4 小结

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

相关链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值