Python 季度差异
我有一个简单的Spark数据框,存储2020年初以来的季度总数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
| 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