我想用Pandas UDF计算两个向量的余弦相似度.我用Spark UDF实现了它,它与以下脚本一起工作得很好.

import numpy as np
from pyspark.sql.functions import udf
from pyspark.sql.types import FloatType

# Create dataframe
df = spark.createDataFrame([("A", [1, 2, 3], [3, 4, 5]), ("B", [5, 6, 7], [7, 8, 9] )], ("name", "vec1", "vec2"))

# Cosime Similarity function
def cosine_similarity(vec1, vec2):
    return float(np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2)))

# Spark UDF
cosine_similarity_udf = udf(cosine_similarity, FloatType())

当我用Pandas UDF包装它时,如下所示,它给我一个TypeError,显示为TypeError: only size-1 arrays can be converted to Python scalars

import pandas as pd
from pyspark.sql.functions import pandas_udf, PandasUDFType

@pandas_udf(returnType=FloatType())
def cosine_similarity_udf(vec1: pd.Series, vec2: pd.Series) -> pd.Series:
    return pd.Series(cosine_similarity(vec1, vec2))

What should be the correct way to get this desired output using Pandas UDF? enter image description here

推荐答案

如果我这样做,我可以获得价值:

@pandas_udf(returnType=FloatType())
def cosine_similarity_udf(vec1: pd.Series, vec2: pd.Series) -> pd.Series:
    return vec1.combine(vec2, func=lambda v1, v2: cosine_similarity(np.array(v1), np.array(v2)))

然后用以下方式呼叫它:

df = df.withColumn("cosine_similarity", cosine_similarity_udf("vec1", "vec2"))
df.show()

Pandas doc for Series.combine.

Python相关问答推荐

不同数据类型的Python成员变量不会在具有相同优先级的不同线程中更新

是否有方法将现有的X-Y图转换为X-Y-Y1图(以重新填充)?

将词典写入Excel

获取Azure Pipelines以从pyproject.toml(而不是relevments_dev.文本)安装测试环境

如何观察cv2.erode()的中间过程?

Numpy索引argsorted使用integer数组,同时保留排序顺序

创建带有二维码的Flask应用程序,可重定向到特定端点

Image Font生成带有条形码Code 128的条形码时出现枕头错误OSErsor:无法打开资源

Pandas 除以一列中出现的每个值

使用plotnine和Python构建地块

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

如何在Python脚本中附加一个Google tab(已经打开)

如何获得每个组的时间戳差异?

我对我应该做什么以及我如何做感到困惑'

合并帧,但不按合并键排序

手动设置seborn/matplotlib散点图连续变量图例中显示的值

python—telegraph—bot send_voice发送空文件

从列表中获取n个元素,其中list [i][0]== value''

用SymPy在Python中求解指数函数