from odps.df import DataFrame
iris = DataFrame(o.get_table('pyodps_iris'))

窗口函数

DataFrame API也支持使用窗口函数:

>>> grouped = iris.groupby('name')
>>> grouped.mutate(grouped.sepallength.cumsum(), grouped.sort('sepallength').row_number()).head(10)
          name  sepallength_sum  row_number
0  Iris-setosa            250.3           1
1  Iris-setosa            250.3           2
2  Iris-setosa            250.3           3
3  Iris-setosa            250.3           4
4  Iris-setosa            250.3           5
5  Iris-setosa            250.3           6
6  Iris-setosa            250.3           7
7  Iris-setosa            250.3           8
8  Iris-setosa            250.3           9
9  Iris-setosa            250.3          10

窗口函数可以使用在列选择中:

>>> iris['name', 'sepallength', iris.groupby('name').sort('sepallength').sepallength.cumcount()].head(5)
          name  sepallength  sepallength_count
0  Iris-setosa          4.3                  1
1  Iris-setosa          4.4                  2
2  Iris-setosa          4.4                  3
3  Iris-setosa          4.4                  4
4  Iris-setosa          4.5                  5

窗口函数按标量聚合时,和分组聚合的处理方式一致。

>>> from odps.df import Scalar
>>> iris.groupby(Scalar(1)).sort('sepallength').sepallength.cumcount()

DataFrame API支持的窗口函数包括:

窗口函数

说明

cumsum

计算累积和

cummean

计算累积均值

cummedian

计算累积中位数

cumstd

计算累积标准差

cummax

计算累积最大值

cummin

计算累积最小值

cumcount

计算累积和

lag

按偏移量取当前行之前第几行的值,如当前行号为rn,则取行号为rn-offset的值

lead

按偏移量取当前行之后第几行的值,如当前行号为rn则取行号为rn+offset的值

rank

计算排名

dense_rank

计算连续排名

percent_rank

计算一组数据中某行的相对排名

row_number

计算行号,从1开始

qcut

将分组数据按顺序切分成n片,并返回当前切片值,如果切片不均匀,默认增加第一个切片的分布

nth_value

返回分组中的第n个值

cume_dist

计算分组中值小于等于当前值的行数占分组总行数的比例

其中,rank、dense_rank、percent_rank 和 row_number 支持下列参数:

参数名

说明

sort

排序关键字,默认为空

ascending

排序时,是否依照升序排序,默认 True

lag 和 lead 除 rank 的参数外,还支持下列参数:

参数名

说明

offset

取数据的行距离当前行的行数

default

当 offset 指定的行不存在时的返回值

而 cumsum、cummax、cummin、cummean、cummedian、cumcount 和 cumstd 除 rank 的上述参数外,还支持下列参数:

参数名

说明

unique

是否排除重复值,默认 False

preceding

窗口范围起点

following

窗口范围终点