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
- 对 HP, Attack, Defense, Sp. Atk, Sp. Def, Speed 进行加总,验证是否为 Total 值。
- 对于 # 重复的妖怪只保留第一条记录,解决以下问题:
- 求第一属性的种类数量和前三多数量对应的种类
- 求第一属性和第二属性的组合种类
- 求尚未出现过的属性组合
- 按照下述要求,构造 Series :
- 取出物攻,超过120的替换为 high ,不足50的替换为 low ,否则设为 mid
- 取出第一属性,分别用 replace 和 apply 替换所有字母为大写
- 求每个妖怪六项能力的离差,即所有能力中偏离中位数最大的值,添加到 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 窗口实现这一功能。