五、练习

Ex1:口袋妖怪数据集

现有一份口袋妖怪的数据集,下面进行一些背景说明:

  • # 代表全国图鉴编号,不同行存在相同数字则表示为该妖怪的不同状态
  • 妖怪具有单属性和双属性两种,对于单属性的妖怪, Type 2 为缺失值
  • Total, HP, Attack, Defense, Sp. Atk, Sp. Def, Speed 分别代表种族值、体力、物攻、防御、特攻、特防、速度,其中种族值为后6项之和
In [116]: df = pd.read_csv('data/pokemon.csv')
In [117]: df.head(3)
Out[117]: 
   #       Name Type 1  Type 2  Total  HP  Attack  Defense  Sp. Atk  Sp. Def  Speed
0  1  Bulbasaur  Grass  Poison    318  45      49       49       65       65     45
1  2    Ivysaur  Grass  Poison    405  60      62       63       80       80     60
2  3   Venusaur  Grass  Poison    525  80      82       83      100      100     80
  1. 对 HP, Attack, Defense, Sp. Atk, Sp. Def, Speed 进行加总,验证是否为 Total 值。
  2. 对于 # 重复的妖怪只保留第一条记录,解决以下问题:
    1. 求第一属性的种类数量和前三多数量对应的种类
    2. 求第一属性和第二属性的组合种类
    3. 求尚未出现过的属性组合
  3. 按照下述要求,构造 Series :
    1. 取出物攻,超过120的替换为 high ,不足50的替换为 low ,否则设为 mid
    2. 取出第一属性,分别用 replace 和 apply 替换所有字母为大写
    3. 求每个妖怪六项能力的离差,即所有能力中偏离中位数最大的值,添加到 df 并从大到小排序

Ex2:指数加权窗口

1、作为扩张窗口的 ewm 窗口

在扩张窗口中,用户可以使用各类函数进行历史的累计指标统计,但这些内置的统计函数往往把窗口中的所有元素赋予了同样的权重。事实上,可以给出不同的权重来赋给窗口中的元素,指数加权窗口就是这样一种特殊的扩张窗口。

其中,最重要的参数是 alpha ,它决定了默认情况下的窗口权重为 (w_i = (1 - \alpha)^i, i\in {0, 1, ..., t}) ,其中 (i=t) 表示当前元素, (i=0) 表示序列的第一个元素。

从权重公式可以看出,离开当前值越远则权重越小,若记原序列为 x ,更新后的当前元素为 (y_t) ,此时通过加权公式归一化后可知:

[\begin{split}y_t &=\frac{\sum_{i=0}^{t} w_i x_{t-i}}{\sum_{i=0}^{t} w_i} \ &=\frac{x_t + (1 - \alpha)x_{t-1} + (1 - \alpha)^2 x_{t-2} + ... + (1 - \alpha)^{t} x_{0}}{1 + (1 - \alpha) + (1 - \alpha)^2 + ... + (1 - \alpha)^{t}}\\end{split}]

对于 Series 而言,可以用 ewm 对象如下计算指数平滑后的序列:

In [118]: np.random.seed(0)
In [119]: s = pd.Series(np.random.randint(-1,2,30).cumsum())
In [120]: s.head()
Out[120]: 
0   -1
1   -1
2   -2
3   -2
4   -2
dtype: int32
In [121]: s.ewm(alpha=0.2).mean().head()
Out[121]: 
0   -1.000000
1   -1.000000
2   -1.409836
3   -1.609756
4   -1.725845
dtype: float64

请用 expanding 窗口实现。

2、作为滑动窗口的 ewm 窗口

从第1问中可以看到, ewm 作为一种扩张窗口的特例,只能从序列的第一个元素开始加权。现在希望给定一个限制窗口 n ,只对包含自身的最近的 n 个元素作为窗口进行滑动加权平滑。请根据滑窗函数,给出新的 (w_i) 与 (y_t) 的更新公式,并通过 rolling 窗口实现这一功能。