Как заполнить недостающие данные GPS в пандах? - PullRequest
1 голос
/ 05 октября 2019

У меня есть кадр данных, который выглядит примерно так:

+-----+------------+-------------+-------------------------+----+----------+----------+
|     | Actual_Lat | Actual_Long |          Time           | ID | Cal_long | Cal_lat  |
+-----+------------+-------------+-------------------------+----+----------+----------+
|   0 | 63.433376  | 10.397068   | 2019-09-30 04:48:13.540 | 11 | 10.39729 | 63.43338 |
|   1 | 63.433301  | 10.395846   | 2019-09-30 04:48:18.470 | 11 | 10.39731 | 63.43326 |
|   2 | 63.433259  | 10.394543   | 2019-09-30 04:48:23.450 | 11 | 10.39576 | 63.43323 |
|   3 | 63.433258  | 10.394244   | 2019-09-30 04:48:29.500 | 11 | 10.39555 | 63.43436 |
|   4 | 63.433258  | 10.394215   | 2019-09-30 04:48:35.683 | 11 | 10.39505 | 63.43427 |
| ... | ...        | ...         | ...                     | ...|      ... |      ... |
|  70 | NaN        | NaN         | NaT                     | NaN| 10.35826 | 63.43149 |
|  71 | NaN        | NaN         | NaT                     | NaN| 10.35809 | 63.43155 |
|  72 | NaN        | NaN         | NaT                     | NaN| 10.35772 | 63.43163 |
|  73 | NaN        | NaN         | NaT                     | NaN| 10.35646 | 63.43182 |
|  74 | NaN        | NaN         | NaT                     | NaN| 10.35536 | 63.43196 |
+-----+------------+-------------+-------------------------+----------+----------+----------+

Actual_lat, а Actual_long содержит GPS-координаты данных, полученных с устройства GPS. Cal_lat и cal_lat - координаты GPS, полученные из OSRM's API. Как видите, в реальных координатах пропущено много данных. Я ищу, чтобы получить набор данных таким образом, чтобы, когда я беру разность фактической_латины против cal_lat, она была равна нулю или, по крайней мере, близка к нулю. Я попытался заполнить эти пропущенные значения адресами lat и long, но это привело бы к огромной разнице. Мой вопрос заключается в том, как я могу заполнить эти значения, используя python / pandas, чтобы, когда транспортное средство следовало по оценочному пути OSRM, разница между фактическим широтным / длинным и расчетным широтным / длинным была нулевой или близкой к нулю. Я новичок в наборах данных ГИС и понятия не имею, что с ними делать.

РЕДАКТИРОВАТЬ : я ищу что-то вроде этого.


+-----+------------+-------------+-------------------------+----------+----------+----------+----------------------+----------------------+
|     | Actual_Lat | Actual_Long |          Time           | Tour ID  | Cal_long | Cal_lat  | coordinates_diff_Lat | coordinates_diff_Lon |
+-----+------------+-------------+-------------------------+----------+----------+----------+----------------------+----------------------+
|   0 |  63.433376 |   10.397068 | 2019-09-30 04:48:13.540 |       11 | 10.39729 | 63.43338 |               -0.000 |               -0.000 |
|   1 |  63.433301 |   10.395846 | 2019-09-30 04:48:18.470 |       11 | 10.39731 | 63.43326 |                0.000 |               -0.001 |
|   2 |  63.433259 |   10.394543 | 2019-09-30 04:48:23.450 |       11 | 10.39576 | 63.43323 |                0.000 |               -0.001 |
|   3 |  63.433258 |   10.394244 | 2019-09-30 04:48:29.500 |       11 | 10.39555 | 63.43436 |               -0.001 |               -0.001 |
|   4 |  63.433258 |   10.394215 | 2019-09-30 04:48:35.683 |       11 | 10.39505 | 63.43427 |               -0.001 |               -0.001 |
| ... |        ... |         ... | ...                     |      ... |      ... |      ... |                  ... |                  ... |
|  70 |   63.43000 |    10.35800 | NaT                     | 115268.0 | 10.35826 | 63.43149 |                0.000 |               -0.003 |
|  71 |   63.43025 |    10.35888 | NaT                     | 115268.0 | 10.35809 | 63.43155 |                0.000 |               -0.003 |
|  72 |   63.43052 |    10.35713 | NaT                     | 115268.0 | 10.35772 | 63.43163 |                0.000 |               -0.002 |
|  73 |   63.43159 |    10.35633 | NaT                     | 115268.0 | 10.35646 | 63.43182 |                0.000 |               -0.001 |
|  74 |   63.43197 |    10.35537 | NaT                     | 115268.0 | 10.35536 | 63.43196 |                0.000 |                0.000 |
+-----+------------+-------------+-------------------------+----------+----------+----------+----------------------+----------------------+

Примечание63.43197,10.35537 - пункт назначения, а 63.433376,10.397068 - начальная позиция. Все эти точки представляют координаты дороги.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

IIUC, вам нужно что-то вроде этого:

Я беру столбцы из df как список.

div = float(len(cal_lat)) / float(len(actual_lat))

new_l = []
for i in range(len(cal_lat)):
    new_l.append(actual_lat[int(i/div)])

print(new_l)
len(new_l)

Делайте то же самое со столбцами долготы. Так как это точки GPS, вы можете настроить вашу модель, чтобы иметь точность до 3 цифр, принимая разницу. Таким образом, учитывая это, начиная с Actual_lat и lng, если ваше следующее значение будет таким же, как первое, разница не будет намного больше. Надеюсь, я понял, и у вас есть решение.

0 голосов
/ 05 октября 2019

Вам нужно pandas.DataFrame.where .

Допустим, ваш фрейм данных df, тогда вы можете сделать:

df.Actual_Lat = df.Actual_Lat.where(~df.Actual_Lat.isna(), df.Cal_lat)

...