专栏首页小小挖掘机举一反三-Pandas实现Hive中的窗口函数

举一反三-Pandas实现Hive中的窗口函数

1、Hive窗口函数

我们先来介绍一下Hive中几个常见的窗口函数,row_number(),lag()和lead()。

row_number()

该函数的格式如下:

row_Number() OVER (partition by 分组字段 ORDER BY 排序字段 排序方式asc/desc)

简单的说,我们使用partition by后面的字段对数据进行分组,在每个组内,使用ORDER BY后面的字段进行排序,并给每条记录增加一个排序序号。

lag()

该函数的格式如下:

lag(字段名,N) over(partition by 分组字段 order by 排序字段 排序方式) 

lag括号里理由两个参数,第一个是字段名,第二个是数量N,这里的意思是,取分组排序后比该条记录序号小N的对应记录的指定字段的值,如果字段名为ts,N为1,就是取分组排序后上一条记录的ts值。

lead() 该函数的格式如下:

lead(字段名,N) over(partition by 分组字段 order by 排序字段 排序方式) 

lead括号里理由两个参数,第一个是字段名,第二个是数量N,这里的意思是,取分组排序后比该条记录序号大N的对应记录的对应字段的值,如果字段名为ts,N为1,就是取分组排序后下一条记录的ts值。

有关这几个函数的详细的实例,可以参考我之前写过的文章:https://www.jianshu.com/p/3738d3591da9,这里我们就不再赘述。

2、窗口函数的Pandas实现

接下来,我们介绍如何使用Pandas来实现上面的几个窗口函数。

数据使用 我们建立如下的测试数据集:

df = pd.DataFrame({'A':[12,20,12,5,18,11,18],
                   'C':['A','B','A','B','B','A','A']})

我们使用C作为分组列,使用A作为窗口列。

2.1 row_number()

该函数的意思即分组排序,在pandas中我们可以结合groupby和rank函数来实现和row_number()类似的功能。

我们先看一下实现代码:

df['row_number'] = df['A'].groupby(df['C']).rank(ascending=True,method='first')
print(df)

代码的输出为:

这样我们的row_number功能就实现了,groupby方法大家应该很熟悉了,那么我们主要介绍一下rank函数,rank函数主要有两个参数,首先是ascending参数,决定是按照升序还是降序排列,这里我们选择的是升序。第二个参数是填充方式,主要有以下几种方式: dense:稠密的方式,即当两个或多个的数值相同时,使用同样的序号,同时后面的序号是该序号+1,即多个相同的值只会占用一个序号位,例如四个数的排序,中间两个数相同,那么四个数的排序为1,2,2,3.

我们用代码看一下效果:

df = pd.DataFrame({'A':[12,20,12,5,18,11,18],
                   'C':['A','B','A','B','B','A','A']})
df['row_number'] = df['A'].groupby(df['C']).rank(ascending=True,method='min')
print(df)

输出为:

first:即当两个或多个的数值相同时,使用不样的序号,按照数据出现的先后顺序进行排序,这个其实跟row_number的实现是相同的。

df = pd.DataFrame({'A':[12,20,12,5,18,11,18],
                   'C':['A','B','A','B','B','A','A']})
df['row_number'] = df['A'].groupby(df['C']).rank(ascending=True,method='first')
print(df)

输出为:

max :当两个或多个的数值相同时,使用相同的序号,不过使用的是能达到的最大的序号值。例如四个数的排序,中间两个数相同,那么四个数的排序为1,3,3,4.

df = pd.DataFrame({'A':[12,20,12,5,18,11,18],
                   'C':['A','B','A','B','B','A','A']})
df['row_number'] = df['A'].groupby(df['C']).rank(ascending=True,method='max')
print(df)

输出为:

min :当两个或多个的数值相同时,使用相同的序号,不过使用的是能达到的最小的序号值。例如四个数的排序,中间两个数相同,那么四个数的排序为1,2,3,4.

df = pd.DataFrame({'A':[12,20,12,5,18,11,18],
                   'C':['A','B','A','B','B','A','A']})
df['row_number'] = df['A'].groupby(df['C']).rank(ascending=True,method='min')
print(df)

输出为:

2.2 lag/lead函数

pandas中使用shift函数来实现lag/lead函数,首先我们来看一个例子:

df = pd.DataFrame({'A':[12,20,12,5,18,11,18],
                   'C':['A','B','A','B','B','A','A']})

df['lag'] = df.sort_values('A').groupby('C')['A'].shift(1)
df['lead'] = df.sort_values('A').groupby('C')['A'].shift(-1)
print(df)

输出为:

可以看到,当shift函数中的数字为正数时,我们就实现了lag的功能,当数字为负数时,实现的是lead的功能。不过这里切记,一定要排序哦,否则可能出现下面的结果:

df = pd.DataFrame({'A':[12,20,12,5,18,11,18],
                   'C':['A','B','A','B','B','A','A']})

df['lag'] = df.groupby('C')['A'].shift(1)
df['lead'] = df.groupby('C')['A'].shift(-1)
print(df)

输出为,这个就是完全根据数据出现的顺序进行排序的,不符合我们的要求!

本文分享自微信公众号 - 小小挖掘机(wAIsjwj),作者:文文

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据分析最有用的Top 50 Matplotlib图(带有完整的Python代码)(上)

    50个Matplotlib图的汇编,在数据分析和可视化中最有用。此列表允许您使用Python的Matplotlib和Seaborn库选择要显示的可视化对象。

    石晓文
  • 盘一盘 Python 系列 10 - Cufflinks

    Cufflinks 是一个可视化的库,可以无缝衔接 pandas 和 plotly,前者中的 dataframe 在数据分析中无处不在,后者的交互式让可视化又上...

    石晓文
  • 特征工程|时间特征构造以及时间序列特征构造

    数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功...

    石晓文
  • 快速介绍Python数据分析库pandas的基础知识和代码示例

    “软件工程师阅读教科书作为参考时不会记住所有的东西,但是要知道如何快速查找重·要的知识点。”

    deephub
  • 妈妈再也不用担心我忘记pandas操作了

    pandas的操作上千种,但对于数据分析的使用掌握常用的操作就可以应付了,更多的操作可以参考pandas官网。

    Python数据科学
  • 用 Pandas 进行数据处理系列 二

    获取行操作df.loc[3:6]获取列操作df['rowname']取两列df[['a_name','bname']] ,里面需要是一个 list 不然会报错增...

    zucchiniy
  • Pandas入门操作

    俺也想起舞
  • 利用深度学习建立流失模型(附完整代码)

    失去一个老用户会带来巨大的损失,大概需要公司拉新10个新用户才能予以弥补。如何预测客户即将流失,让公司采取合适的挽回措施,是每个公司都要关注的重点问题。

    Python中文社区
  • 基于机器学习算法的时间序列价格异常检测(附代码)

    异常检测也称为异常值检测,是一种数据挖掘过程,用于确定数据集中发现的异常类型并确定其出现的详细信息。 在当今世界,由于大量数据无法手动标记异常值,自动异常检测显...

    量化投资与机器学习微信公众号
  • Pandas 常见用法总结

    TalkPython

扫码关注云+社区

领取腾讯云代金券