[英]Create a new column using a condition from other two columns in a dataframe
[英]Pyspark - Create new column with the RMSE of two other columns in dataframe
我对 Pyspark 相当陌生。 我有一个 dataframe,我想创建一个第三列,计算col1
和col2
之间的 RMSE。 我正在使用用户定义的 lambda function 进行 RMSE 计算,但不断收到此错误AttributeError: 'int' object has no attribute 'mean'
from pyspark.sql.functions import udf,col
from pyspark.sql.types import IntegerType
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql import SQLContext
spark = SparkSession.builder.config("spark.driver.memory", "30g").appName('linear_data_pipeline').getOrCreate()
sqlContext = SQLContext(sc)
old_df = sqlContext.createDataFrame(sc.parallelize(
[(0, 1), (1, 3), (2, 5)]), ('col_1', 'col_2'))
function = udf(lambda col1, col2 : (((col1 - col2)**2).mean())**.5)
new_df = old_df.withColumn('col_n',function(col('col_1'), col('col_2')))
new_df.show()
我如何最好地解决此问题? 我还想找到 RMSE/均值、平均绝对误差、平均绝对误差/均值、中值绝对误差和中值百分比误差,但是一旦我弄清楚如何计算一个,我应该会擅长其他的。
我觉得比你还有些糊涂。 RMSE是根据一系列点计算得出的,因此您不必为两列中的每个值计算此值。 我认为您必须使用每列中的所有值来计算 RMSE。
这可能有效:
pow = udf(lambda x: x**2)
rmse = (sum(pow(old_df['col1'] - old_df['col2']))/len(old_df))**.5
print(rmse)
在这种情况下,我认为您不需要udf
。 我认为仅使用pyspark.sql.functions
是可能的。
我可以向您推荐以下未经测试的选项
import pyspark.sql.functions as psf
rmse = old_df.withColumn("squarederror",
psf.pow(psf.col("col1") - psf.col("col2"),
psf.lit(2)
))
.agg(psf.avg(psf.col("squarederror")).alias("mse"))
.withColumn("rmse", psf.sqrt(psf.col("mse")))
rmse.collect()
使用相同的逻辑,您可以获得其他性能统计信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.