Pandas 的 [df.groupby(...)['col_name'].shift(1)] 的 SQL 等效项

Posted

技术标签:

【中文标题】Pandas 的 [df.groupby(...)[\'col_name\'].shift(1)] 的 SQL 等效项【英文标题】:SQL equivalent for Pandas's [df.groupby(...)['col_name'].shift(1)]Pandas 的 [df.groupby(...)['col_name'].shift(1)] 的 SQL 等效项 【发布时间】:2018-10-31 00:10:54 【问题描述】:

我有这段代码,我想把它写成 SQL。有谁知道等效的 SQL 代码是什么样的?

lags = range(1, 5)
df = df.assign(**
    ''.format('lag', t): df.groupby('article_id').num_views.shift(t) for t in lags
)

更新:

我正在寻找 SQL 标准方言。 这是一个数据集示例(部分前 10 行):

  article_id section time   num_views   comments
0   abc111b     A   00:00   15            0
1   abc111b     A   01:00   36            0
2   abc111b     A   02:00   36            0
3   bbbddd222hf A   03:00   41            0
4   bbbddd222hf B   04:00   44            0
5   nnn678www   B   05:00   39            0
6   nnn678www   B   06:00   38            0
7   nnn678www   B   07:00   66            0
8   nnn678www   C   08:00   65            0
9   nnn678www   C   09:00   87            1

【问题讨论】:

请提供一个小的可重复样本数据集。另请说明您询问的是哪种 SQL 方言... 我更新了我的问题。 【参考方案1】:

可以使用LAG() function,属于SQL-99 ANSI标准"windowing functions"

select
  article_id, section, time, num_views, comments,
  lag(num_views, 1, 0) over(partition by article_id order by article_id, time) as lag1,
  lag(num_views, 2, 0) over(partition by article_id order by article_id, time) as lag2,
  lag(num_views, 3, 0) over(partition by article_id order by article_id, time) as lag3,
  lag(num_views, 4, 0) over(partition by article_id order by article_id, time) as lag4
from tab;

Complete and working SQLFiddle example...

PSplease be aware that not all RDBMS systems implement "windowing functions"

【讨论】:

写不出这么快,很好:) @MaxU 太好了,谢谢!只是一个小问题 - 如果我想创建 50 个滞后,我该如何循环执行,这样我就不必为每个滞后重复相同的代码? @user8436761,只需使用任何编程语言(例如 Python)动态生成 SQL。

以上是关于Pandas 的 [df.groupby(...)['col_name'].shift(1)] 的 SQL 等效项的主要内容,如果未能解决你的问题,请参考以下文章

df.groupby('id').resample('D').last() 在 Pandas 中的 Pyspark 等效项

python pandas, DF.groupby().agg(), agg() 中的列引用

Groupby并在pandas中执行多个函数的聚合

python – Pandas使用groupby中的count来创建新列

使用带有参数的 Pandas groupby() + apply()

使用 Groupby 的 Pandas 滚动函数