Python 季度差异

Python 季度差异,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我有一个简单的Spark数据框,存储2020年初以来的季度总数 | id | year | quarter | yq | total | |:---:|:----:|:-------:|:------:|:------:| | 1 | 2020 | 1 | 202001 | 23 | | 1 | 2020 | 2 | 202002 | 3545 | | 1 | 2020 | 3 | 202003 | 3 | | 1

我有一个简单的Spark数据框,存储2020年初以来的季度总数

|  id | year | quarter |   yq   |  total |
|:---:|:----:|:-------:|:------:|:------:|
| 1   | 2020 | 1       | 202001 | 23     |
| 1   | 2020 | 2       | 202002 | 3545   |
| 1   | 2020 | 3       | 202003 | 3      |
| 1   | 2020 | 4       | 202004 | 5345   |
| 1   | 2021 | 1       | 202101 | 3534   |
| 2   | 2020 | 1       | 202001 | 567    |
| 2   | 2020 | 2       | 202002 | 35     |
| 2   | 2020 | 3       | 202003 | 989    |
| 2   | 2020 | 4       | 202004 | 78786  |
| 2   | 2021 | 1       | 202101 | 321    |
| ... | ..   | ...     | ...    | ...    |
如何比较当前季度与上一年同一季度的百分比差异

预期产出:

| id  | yq     | growth_over_same_quarter_in_previous_year |
|-----|--------|-------------------------------------------|
| 1   | 202101 | 197                                       |
| 2   | 202101 | -55                                       |
| ... | ...    | ...                                       |

对于相同的id,您可以使用
lag
与同一年的上一季度进行比较

from pyspark.sql import functions as F, Window

last_year = F.lag('total').over(Window.partitionBy('id', 'quarter').orderBy('year'))

df2 = df.withColumn(
    'change',
    (F.col('total') - last_year) / last_year * 100
).filter('change is not null').select('id', 'yq', 'change')

df2.show()
+---+------+-------------------+
| id|    yq|             change|
+---+------+-------------------+
|  1|202101| 15265.217391304346|
|  2|202101|-43.386243386243386|
+---+------+-------------------+

对于相同的id,您可以使用
lag
与同一年的上一季度进行比较

from pyspark.sql import functions as F, Window

last_year = F.lag('total').over(Window.partitionBy('id', 'quarter').orderBy('year'))

df2 = df.withColumn(
    'change',
    (F.col('total') - last_year) / last_year * 100
).filter('change is not null').select('id', 'yq', 'change')

df2.show()
+---+------+-------------------+
| id|    yq|             change|
+---+------+-------------------+
|  1|202101| 15265.217391304346|
|  2|202101|-43.386243386243386|
+---+------+-------------------+

这里过滤器的用途是什么?要说明0的更改?如果没有前一行(例如yq=202001),其中
lag
将返回null,因此
change
在someguywhocodes处也将为null。这里的过滤器的用途是什么?要解释0更改?如果没有前一行(例如yq=202001),其中
lag
将返回null,因此
change
在Someguywhocodes处也将为null