Расстояние между двумя столбцами в фрейме данных с сортированным индексом с плавающей запятой - PullRequest
0 голосов
/ 03 июля 2018

У нас есть фрейм данных с отсортированным индексом с плавающей запятой и двумя столбцами, которые должны быть одинаковыми. Их значения не всегда присутствуют, и в худшем случае они не имеют перекрытий в значениях индекса. Цель состоит в том, чтобы иметь возможность проверить, как далеко они друг от друга.

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

Другим подходом было бы сравнение фактических значений и определение ошибки индекса, для которой это сравнение имело бы смысл.

Вопрос в том, какой подход имеет больше смысла и как рассчитать расстояние. Результат должен сказать нам, насколько они близки друг к другу, например. 0 означает, что они одинаковы.

Пример

У нас есть фрейм данных с двумя столбцами a1 и a2 и отсортированный индекс с плавающей запятой.

df = pd.DataFrame({'a1':[6.1, np.nan, 6.8, 7.5, 7.9], 
                   'a2':[6.2, 6.6, 6.8, np.nan, 7.7]}, 
                  index=[0.10, 0.11, 0.13, 0.16, 0.17])

        a1   a2
0.10   6.1  6.2
0.11   NaN  6.6
0.13   6.8  6.8
0.16   7.5  NaN
0.17   7.9  7.7

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Так как вы упоминаете расстояние

from scipy.spatial import distance
df=df.interpolate(axis=0)
pd.DataFrame(distance.cdist(df.values, df.values, 'euclidean'),columns=df.index,index=df.index)
Out[468]: 
          0.10      0.11      0.13      0.16      0.17
0.10  0.000000  0.531507  0.921954  1.750000  2.343075
0.11  0.531507  0.000000  0.403113  1.234909  1.820027
0.13  0.921954  0.403113  0.000000  0.832166  1.421267
0.16  1.750000  1.234909  0.832166  0.000000  0.602080
0.17  2.343075  1.820027  1.421267  0.602080  0.000000
0 голосов
/ 03 июля 2018

Если ваша цель - получить абсолютное расстояние интерполированных векторов, вы можете действовать следующим образом:

r = pd.interpolate()
absolute_sum = (r["a1"] - r["a2"]).abs().sum()

В данном примере результат равен 0.7000000000000011.

Хотя, если вас интересует, насколько похожи эти два столбца, вы можете взглянуть на коэффициент корреляции .

r = pd.interpolate()
correlation = r["a1"].corr("a2")

В данном примере результат 0.9929580338258082.

...