Панды, вращающиеся с логическим - PullRequest
0 голосов
/ 07 июня 2018

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

ID  Time     Latitude  Longitude            
1   2:00    60.092033  20.765083                 
1   3:00    60.097300  20.672767                 
1   4:00    60.125550  20.593650                 
1   5:00    60.115233  20.505367                  
1   6:00    60.103800  20.425850                  
1   7:00    60.113750  20.335717                  
1   8:00    60.115683  20.303683                  
1   9:00    60.114817  20.305500                 
1   10:00   60.077983  20.316917                  
1   11:00   60.034500  20.305317

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

Я использую библиотеку haversine для вычисления расстояния (км) между двумя различными координатами.

lat = df['Latitude'].values
long = df['Longitude'].values
CurrentCoordinates = zip(lat, long)
TargetedCoordinates = [60.103900, 20.415850]

for i, j in CurrentCoordinates
    print(haversine((i, j), TargetedCoordinates))

это дает мне все расстояние между каждым текущим coodinates и координатами цели.

Любые предложения будут великолепны.Спасибо

1 Ответ

0 голосов
/ 07 июня 2018

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

Вот один подход.Ключевым компонентом является scipy.spatial.distance.cdist, который может вычислять попарные расстояния.

import pandas as pd
import numpy as np
from scipy.spatial.distance import cdist
from haversine import haversine

df = pd.read_csv(
    pd.compat.StringIO(
        """ID  Time     Latitude  Longitude
1   2:00    60.092033  20.765083
1   3:00    60.097300  20.672767
1   4:00    60.125550  20.593650
1   5:00    60.115233  20.505367
1   6:00    60.103800  20.425850
1   7:00    60.113750  20.335717
1   8:00    60.115683  20.303683
1   9:00    60.114817  20.305500
1   10:00   60.077983  20.316917
1   11:00   60.034500  20.305317"""
    ),
    sep=r" +",
)

targets = pd.DataFrame(
    [[60.103900, 20.415850], [60.403900, 20.715850]], columns=["Latitude", "Longitude"]
)

res_data = (
    cdist(
        df[["Latitude", "Longitude"]],
        targets[["Latitude", "Longitude"]],
        metric=haversine,
    )
    < 2
)

res_df = pd.DataFrame(
    res_data,
    index=df[["Latitude", "Longitude"]].round(3).apply(tuple, axis=1),
    columns=targets[["Latitude", "Longitude"]].round(3).apply(tuple, axis=1),
)

Результат:

                  (60.104, 20.416)  (60.404, 20.716)
(60.092, 20.765)             False             False
(60.097, 20.673)             False             False
(60.126, 20.594)             False             False
(60.115, 20.505)             False             False
(60.104, 20.426)              True             False
(60.114, 20.336)             False             False
(60.116, 20.304)             False             False
(60.115, 20.306)             False             False
(60.078, 20.317)             False             False
(60.034, 20.305)             False             False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...