学习目标
- 应用
crosstab
和pivot_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()
- 返回占比情况