расчет YTD и MTD с использованием pyspark - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь реализовать это около месяца. Просто используя некоторые примеры данных из других вопросов о переполнении стека.

   FinancialYearStart  MonthOfFinancialYear  SalesTotal
            2015                     1          10
            2015                     2          10
            2015                     5          10
            2015                     6          50
            2016                     1          10
            2016                     3          20
            2016                     2          30
            2017                     6          70
            2017                     7          80

Как мы можем использовать это, чтобы вычислить итоги продаж с начала года за каждый месяц.

FinancialYearStart  MonthOfFinancialYear  SalesTotal  YTDTotal
            2015                     1          10        10
            2015                     2          10        20
            2015                     5          10        30
            2015                     6          50        50
            2016                     1          10        60
            2016                     3          20        80
            2016                     2          30       110
            2017                     6          70        70
            2017                     7          80       150

, чтобы быть более точным, как можномы рассчитываем эти метрики, используя группу или используя функции управления окнами.

Например:

Year Month Customer TotalMonthlySales
2015 1 Dog 10
2015 2 Dog 10
2015 3 Cat 20
2015 4 Dog 30
2015 5 Cat 10
2015 7 Cat 20
2015 7 Dog 10
2016 1 Dog 40
2016 2 Dog 20
2016 3 Cat 70
2016 4 Dog 30
2016 5 Cat 10
2016 6 Cat 20
2016 7 Dog 10

даст:

Year Month Customer TotalMonthlySales YTDSales
2015 1 Dog 10 10
2015 2 Dog 10 20
2015 3 Cat 20 20
2015 4 Dog 30 50
2015 5 Cat 10 30
2015 7 Cat 20 40
2015 7 Dog 10 60
2016 1 Dog 40 40
2016 2 Dog 20 60
2016 3 Cat 70 70
2016 4 Dog 30 90
2016 5 Cat 10 80
2016 6 Cat 20 100
2016 7 Dog 10 100

Теперь я использую скользящее окнофункции для расчета последних 4 недель 13 недель, используя следующий подход.

w = (Window().partitionBy(col("number"),col("id")).orderBy(F.col("timestampGMT").cast('long')).rangeBetween(-days(27), 0))
df1 = df.withColumn('lw_4weeksCY_SALES_DOLLARS', F.sum("CY_SALES_DOLLARS").over(w)).withColumn('lw_4weeksCY_SALES_UNITS', F.sum("CY_SALES_UNITS")

1 Ответ

0 голосов
/ 30 сентября 2019

Вы можете использовать оконную функцию для достижения в Spark-Sql

df.show()
+----+-----+--------+-----------------+
|Year|Month|Customer|TotalMonthlySales|
+----+-----+--------+-----------------+
|2015|    1|     Dog|               10|
|2015|    2|     Dog|               10|
|2015|    3|     Cat|               20|
|2015|    4|     Dog|               30|
|2015|    5|     Cat|               10|
|2015|    7|     Cat|               20|
|2015|    7|     Dog|               10|
|2016|    1|     Dog|               40|
|2016|    2|     Dog|               20|
|2016|    3|     Cat|               70|
|2016|    4|     Dog|               30|
|2016|    5|     Cat|               10|
|2016|    6|     Cat|               20|
|2016|    7|     Dog|               10|
+----+-----+--------+-----------------+

df.registerTempTable("test")
sql("select *, sum(TotalMonthlySales) over(partition by year,Customer order by month) tt from test ").orderBy("year","month").show()
+----+-----+--------+-----------------+---+
|Year|Month|Customer|TotalMonthlySales| tt|
+----+-----+--------+-----------------+---+
|2015|    1|     Dog|               10| 10|
|2015|    2|     Dog|               10| 20|
|2015|    3|     Cat|               20| 20|
|2015|    4|     Dog|               30| 50|
|2015|    5|     Cat|               10| 30|
|2015|    7|     Cat|               20| 50|
|2015|    7|     Dog|               10| 60|
|2016|    1|     Dog|               40| 40|
|2016|    2|     Dog|               20| 60|
|2016|    3|     Cat|               70| 70|
|2016|    4|     Dog|               30| 90|
|2016|    5|     Cat|               10| 80|
|2016|    6|     Cat|               20|100|
|2016|    7|     Dog|               10|100|
+----+-----+--------+-----------------+---+

Надеюсь, это поможет вам. пожалуйста, дайте мне знать, если у вас есть запрос для того же

...