首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyspark -用于分组的UDAF函数由两个日期列组成,UDAF用于计算实际值和预测值之间的RMSE

Pyspark -用于分组的UDAF函数由两个日期列组成,UDAF用于计算实际值和预测值之间的RMSE
EN

Stack Overflow用户
提问于 2020-04-12 03:56:04
回答 1查看 88关注 0票数 1

在接下来的几年里,我有像这样的pyspark数据帧中的数据。week_start_dt是我开始预测的时候。和start_month是前12个月。

代码语言:javascript
复制
+--------------------+------------------+----------------------+----------------+
|     start_month    |     week_start_dt|           predictions|       actuals  |
+--------------------+------------------+----------------------+----------------+
|             2019-01|        2019-11-11|                    12|              11|
|             2018-12|        2019-11-11|                    13|              11|
|             2019-08|        2019-11-11|                     9|              11|
|             2019-11|        2019-11-11|                    12|              11|
|             2019-11|        2019-11-11|                  1970|            1440|
|             2019-11|        2019-11-11|                   478|             501|
+--------------------+------------------+----------------------+----------------+

我想用start_monthweek_start_dt上的groupby来计算RMSE。我认为它需要一个用户定义的聚合函数。在熊猫中类似的东西:Python Dataframe: Calculating R^2 and RMSE Using Groupby on One Column

我使用以下代码来获取groupby的实际和预测的汇总计数。

代码语言:javascript
复制
df_startmonth_week = actuals_compare.groupby('start_month', 'week_start_dt').agg(f.sum('predictions'), f.sum('actuals'))

为了计算预测值和实际值之间的RMSE,我在聚合步骤中做了哪些更改?我需要一个UDF来做这件事吗?

下面是我在excel中创建的最终目标的一个示例。

代码语言:javascript
复制
| week_start_dt | start_month | RMSE |
|---------------|-------------|------|
| 20-01-2020    | 2019-02     | 2345 |
| 20-01-2020    | 2019-03     | 2343 |
| 20-01-2020    | 2019-04     | 2341 |
| 20-01-2020    | 2019-05     | 2100 |
| 20-01-2020    | 2019-06     | 1234 |
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-14 00:41:00

我看不出problem here有什么不同,所以我调整了解决方案,使其适用于略有不同的变量名:

代码语言:javascript
复制
import pyspark.sql.functions as psf

def compute_RMSE(expected_col, actual_col):

  rmse = old_df.withColumn("squarederror",
                           psf.pow(psf.col(actual_col) - psf.col(expected_col),
                                   psf.lit(2)
                           ))
  .groupby('start_month', 'week_start_dt')
  .agg(psf.avg(psf.col("squarederror")).alias("mse"))
  .withColumn("rmse", psf.sqrt(psf.col("mse")))

  return(rmse)


compute_RMSE("predictions", "actuals")

如果我漏掉了问题中的细微差别,请告诉我

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61162907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档