python - 如何计算向量集合之间的成对欧几里得距离
问题描述
我有一个像这样的熊猫数据框。其中索引是 pd.DatetimeIndex,列是时间序列。
x_1 | x_2 | x_3 | |
---|---|---|---|
2020-08-17 | 133.23 | 2457.45 | -4676 |
2020-08-18 | -982 | -6354.56 | -245.657 |
2020-08-19 | 5678.642 | 245.2786 | 2461.785 |
2020-08-20 | -2394 | 154.34 | -735.653 |
2020-08-20 | 236 | -8876 | -698.245 |
我需要计算所有列之间的欧几里得距离。即 (x_1 - x_2), (x_1 - x_3), (x_2 - x_3),并返回一个正方形数据框,如下所示:(请注意,此表中的值只是一个示例,而不是欧几里得的实际结果距离)
x_1 | x_2 | x_3 | |
---|---|---|---|
x_1 | 0 | 123 | 456 |
x_2 | 123 | 0 | 789 |
x_3 | 456 | 789 | 0 |
我尝试了这个资源,但我不知道如何传递我的 df 的列。如果理解正确,该示例将行作为序列传递以计算 ED。
解决方案
实现此目的的明确方法是:
from itertools import combinations
import numpy as np
dist_df = pd.DataFrame(index=df.columns, columns=df.columns)
for col_a, col_b in combinations(df.columns, 2):
dist = np.linalg.norm(df[col_a] - df[col_b])
dist_df.loc[col_a, col_b] = dist
dist_df.loc[col_b, col_a] = dist
print(dist_df)
输出
x_1 x_2 x_3
x_1 NaN 12381.858429 6135.306973
x_2 12381.858429 NaN 12680.121047
x_3 6135.306973 12680.121047 NaN
如果你想0
而不是NaN
使用DataFrame.fillna
:
dist_df.fillna(0, inplace=True)
推荐阅读
- bash - 在 ConEmu 中集成了 ZSH 的 WSL Bash - 在此处打开问题
- java - 卡在试图从 firebase 数据库中检索数据
- linked-list - 是否可以在 Rust 中将一个结构的内存与另一个结构相关联?
- bootstrap-modal - Angular 7在打字稿中隐藏引导模式
- javascript - 如何使用 jquery 手动滚动列表?
- outlook - Outlook 自定义插件
- c++ - 有没有办法为 c++ ranged-for 循环有条件地选择不同的初始化列表?
- azure-active-directory - Azure 广告 b2c 多租户
- reactjs - React 和 Typescript:组件是道具
- java - 为什么我需要从 double 转换为 int,反之则不然?