Pandas行余弦相似度计算

bwleehnv  于 2023-03-21  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一个 Dataframe ,看起来像这样:

api_spec_id label   Paths_modified        Tags_modified     Endpoints_added
933 803.0   minor              8.0                      3.0                    6               
934 803.0   patch              0.0                      4.0                    2
935 803.0   patch              3.0                      1.0                    0
938 803.0   patch             10.0                      0.0                    4
939 803.0   patch              3.0                      5.0                    1
940 803.0   patch              6.0                      0.0                    0
942 803.0   patch              0.0                      6.0                    2
946 803.0   patch              3.0                      2.0                    3
947 803.0   patch              0.0                      0.0                    1

我想计算每个连续行之间的行余弦相似度。 Dataframe 已经在api_spec_iddate上排序。
预期输出应该如下所示(值不精确):

api_spec_id label   Paths_modified        Tags_modified  Endpoints_added         Distance
933 803.0   minor              8.0                      3.0         6                  ...
934 803.0   patch              0.0                      4.0         2                  1.00234
935 803.0   patch              3.0                      1.0         0
938 803.0   patch             10.0                      0.0         4
939 803.0   patch              3.0                      5.0         1
940 803.0   patch              6.0                      0.0         0
942 803.0   patch              0.0                      6.0         2
946 803.0   patch              3.0                      2.0         3
947 803.0   patch              0.0                      0.0         1

我尝试在stack overflow中查看这里的解决方案,但是在所有情况下的用例似乎都有点不同。我有更多的功能,总共大约32个,我想考虑所有这些功能列(修改的路径,修改的标签和上面df中添加的端点是一些功能的示例),并计算每行的距离度量。
这是我所能想到的,但它没有达到目的:

df = pd.DataFrame(np.random.randint(0, 5, (3, 5)), columns=['id', 'commit_date', 'feature1', 'feature2', 'feature3'])

similarity_df = df.iloc[:, 2:].apply(lambda x: cosine_similarity([x], df.iloc[:, 2:])[0], axis=1)

有没有人对我如何继续这件事有什么建议?

7fyelxc5

7fyelxc51#

这可以在没有apply的情况下完成(更快):

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(0, 5, (3, 5)), columns=['id', 'commit_date', 'feature1', 'feature2', 'feature3'])

# Calculate L2 norm of features in row
df["l2norm"] = np.linalg.norm(df.loc[:, "feature1":"feature3"], axis=1)

# Create shifted dataframe
df2 = df.shift(1, fill_value=0)

# Dot product of current with previous row
dot_product = (df.loc[:, "feature1":"feature3"] * df2.loc[:, "feature1":"feature3"]).sum(axis=1)

# L2 norm product of current and previous row
norm_product = df["l2norm"] * df2["l2norm"]

# Divide and print
print(dot_product / norm_product)

相关问题