机器学习7:——Pandas——7:高级处理4:交叉表和透视表

一.高级处理-交叉表与透视表

学习目标

  • 目标
    • 应用crosstab和pivot_table实现交叉表与透视表
  • 应用
    • 股票的每日涨跌跟星期几关系大

1 交叉表与透视表什么作用

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

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

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

在这里插入图片描述
在这里插入图片描述

2 使用crosstab(交叉表)实现上图

  • 交叉表:

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

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

3 案例分析

3.1 数据准备

  • 准备两列数据,星期数据以及涨跌幅是好是坏数据
  • 进行交叉表计算
# 寻找星期几跟股票张得的关系
# 1、先把对应的日期找到星期几
date = pd.to_datetime(data.index).weekday
data['week'] = date

# 2、假如把p_change按照大小去分个类0为界限
data['posi_neg'] = np.where(data['p_change'] > 0, 1, 0)

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

但是我们看到count只是每个星期日子的好坏天数,并没有得到比例,该怎么去做?

  • 对于每个星期一等的总天数求和,运用除法运算求出比例
# 算数运算,先求和
sum = count.sum(axis=1).astype(np.float32)

# 进行相除操作,得出比例
pro = count.div(sum, axis=0)

3.2 查看效果

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

pro.plot(kind='bar', stacked=True)
plt.show()

3.3 使用pivot_table(透视表)实现

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

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

4 小结

  • 交叉表与透视表的作用【知道】

二.案例实现

交叉表和透视表

In [65]:

data.index

Out[65]:

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)

In [66]:

time = pd.to_datetime(data.index)

In [68]:

time

Out[68]:

DatetimeIndex(['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='datetime64[ns]', length=643, freq=None)

In [70]:

time.day

Out[70]:

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)

In [73]:

weekday = time.weekday

In [75]:

data["week"] = weekday
  • 以上操作获得星期几后,添加到表尾。

In [77]:

data.head()

Out[77]:

openhighcloselowvolumeprice_changep_changema5ma10ma20v_ma5v_ma10v_ma20turnoverweek
2018-02-2723.5325.8824.1623.5395578.030.632.6822.94222.14222.87553782.6446738.6555576.112.391
2018-02-2622.8023.7823.5322.8060985.110.693.0222.40621.95522.94240827.5242736.3456007.501.530
2018-02-2322.8823.3722.8222.7152914.010.542.4221.93821.92923.02235119.5841871.9756372.851.324
2018-02-2222.2522.7622.2822.0236105.010.361.6421.44621.90923.13735397.5839904.7860149.600.903
2018-02-1421.4921.9921.9221.4823331.040.442.0521.36621.92323.25333590.2142935.7461716.110.582
  • 获得股票涨的部分

In [87]:

data["p_n"] = np.where(data["p_change"]>0,1,0)  #假如把p_change按照大小去分个类0为界限

In [89]:

data.head()

Out[89]:

openhighcloselowvolumeprice_changep_changema5ma10ma20v_ma5v_ma10v_ma20turnoverweekp_n
2018-02-2723.5325.8824.1623.5395578.030.632.6822.94222.14222.87553782.6446738.6555576.112.3911
2018-02-2622.8023.7823.5322.8060985.110.693.0222.40621.95522.94240827.5242736.3456007.501.5301
2018-02-2322.8823.3722.8222.7152914.010.542.4221.93821.92923.02235119.5841871.9756372.851.3241
2018-02-2222.2522.7622.2822.0236105.010.361.6421.44621.90923.13735397.5839904.7860149.600.9031
2018-02-1421.4921.9921.9221.4823331.040.442.0521.36621.92323.25333590.2142935.7461716.110.5821
  • 得到股票涨和星期的交集

In [90]:

count = pd.crosstab(data["week"],data["p_n"])

In [91]:

count

Out[91]:

p_n01
week
06362
15576
26171
36365
45968
  • 先求和,再相除得出好坏占的比例

In [93]:

sum = count.sum(axis=1)

In [94]:

sum

Out[94]:

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

In [98]:

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

In [99]:

per

Out[99]:

p_n01
week
00.5040000.496000
10.4198470.580153
20.4621210.537879
30.4921880.507812
40.4645670.535433

In [107]:

# stacked = True:堆叠
per.plot(kind = "bar",stacked = True)

Out[107]:

<AxesSubplot:xlabel='week'>

在这里插入图片描述

In [109]:

per.plot(kind = "bar")

Out[109]:

<AxesSubplot:xlabel='week'>

在这里插入图片描述

  • 使用透视表,让以上过程更简单:pivot_table([“需要求占比的列”,index = “索引列”])

In [113]:

pro2 = data.pivot_table(["p_n"],index="week")
# 输出p_n为1的占比

Out[113]:

p_n
week
00.496000
10.580153
20.537879
30.507812
40.535433
pro2.plot(kind = "bar")

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值