Расчет и использование евклидова расстояния в Python - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь вычислить евклидово расстояние между двумя наборами данных в python. Я могу сделать это, используя следующее:

np.linalg.norm(df-signal)

С df и signal, являющимися моими двумя наборами данных. Это возвращает единственное числовое значение (т. Е. 8258155.579535276), что нормально. Моя проблема в том, что я хочу, чтобы он возвращал разницу между каждым столбцом в наборе данных. Примерно так:

AFNLWGT     4.867376e+10
AGI         3.769233e+09
EMCONTRB    1.202935e+07
FEDTAX      8.095078e+07
PTOTVAL     2.500056e+09
STATETAX    1.007451e+07
TAXINC      2.027124e+09
POTHVAL     1.158428e+08
INTVAL      1.606913e+07
PEARNVAL    2.038357e+09
FICA        1.080950e+07
WSALVAL     1.986075e+09
ERNVAL      1.905109e+09

Я довольно новичок в Python, поэтому буду очень признателен за любую возможную помощь.

1 Ответ

2 голосов
/ 11 апреля 2020

Чтобы иметь норму по столбцам с заголовками столбцов, вы можете использовать pandas .DataFrame.aggregate вместе с np.linalg.norm:

import pandas as pd
import numpy as np

norms = (df-signal).aggregate(np.linalg.norm)

Обратите внимание, что по умолчанию .aggregate работает вдоль оси 0 (отсюда столбцы).

Однако это будет намного медленнее, чем реализация numpy:

norms = pd.Series(np.linalg.norm(df.to_numpy()-signal.to_numpy(), axis=0), 
                  index=df.columns)

С тестовыми данными размера 100x2 последний В 20 раз быстрее.

...