交叉表与透视表
交叉表与透视表什么作用
探究股票的涨跌与星期几有关?
以下图当中表示,week代表星期几,1,0代表这一天股票的涨跌幅是好还是坏,里面的数据代表比例
可以理解为所有时间为星期一等等的数据当中涨跌幅好坏的比例
使用crosstab(交叉表)实现上图
- 交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)
- pd.crosstab(value1, value2)
- DataFrame.pivot_table([], index=[])
案例分析
- 数据准备
- 准备两列数据,星期数据以及涨跌幅是好是坏数据
- 进行交叉表计算
或者
但是我们看到count只是每个星期日子的好坏天数,并没有得到比例,该怎么去做? - 对于每个星期一等的总天数求和,运用除法运算求出比例
- 查看效果
使用plot画出这个比例,使用stacked的柱状图
使用pivot_table(透视表)实现
使用透视表,刚才的过程更加简单
也可以
版权声明:
笔者博客文章主要用来作为学习笔记使用,内容大部分整理自互联网,如有侵权,请联系博主删除!
=====================补充
目录
学习目标
- 应用
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()
- 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.