найти средние значения в географических координатах - PullRequest
0 голосов
/ 04 июня 2019

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

  1. считывание данных на фрейм данных с округлением широты и долготы до разрешения ~ 10 м (0,0001) градуса.
  2. Создание 10-метровой сетки (X, Y), которая охватывает минимальную и максимальную широту и долготу.
  3. Генерация среднего тока (Z) для каждой точки на сетке <--- Здесь все идет не так. </li>
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import descartes
import geopandas as gpd
from shapely.geometry import Point, Polygon
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline

df = pd.read_csv('./Downloads/current_test/SpdCoach 2182533 20190506 0637AM.csv', skiprows=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,29], na_values='---')
df['GPS Lon.'] = np.around(df['GPS Lon.'].fillna(method='ffill',limit=50),decimals=4)
df['GPS Lat.'] = np.around(df['GPS Lat.'].fillna(method='ffill',limit=50),decimals=4)
# use the difference in latitude and longitude to determine direction of travel
df['del_lon']=df['GPS Lon.'].diff()
df['del_lat']=df['GPS Lat.'].diff()
df['dir']=np.arctan(df['del_lat']/df['del_lon'])
# use difference between impeller and GPS speed to estimate current
df['current']=np.abs(df['Speed (IMP)'] -df['Speed (GPS)'])

# Set the limits of the meshgrid
x = np.arange(min(df['GPS Lon.']),max(df['GPS Lon.']),0.0001)
y = np.arange(min(df['GPS Lat.']),max(df['GPS Lat.']),0.0001)

X, Y = np.meshgrid(x, y)
Z = np.mean(df.current[df['GPS Lon.']==X][df['GPS Lat.']==Y])

Я попробовал утверждение np.mean(df['current'][df['GPS Lon.']==-71.248][df['GPS Lat.']==42.362]) и он правильно рассчитал средний ток для этой единственной пары широта / долгота.

Я ожидал, что когда я заменил числовые значения на X и Y, оператор будет оцениваться для каждой точки сетки и вычислять среднее значение для каждого. Большинство значений будут равны нулю, кроме случаев, когда в файле есть фактические данные.

Я получаю следующую ошибку.

~/anaconda3/lib/python3.7/site-packages/pandas/core/ops.py in wrapper(self, other, axis)
   1743             # as it will broadcast
   1744             if other.ndim != 0 and len(self) != len(other):
-> 1745                 raise ValueError('Lengths must match to compare')
   1746 
   1747             res_values = na_op(self.values, np.asarray(other))

ValueError: Lengths must match to compare

У меня нет опыта использования этого типа индексации, поэтому я, вероятно, что-то делаю не так. Буду признателен, если кто-нибудь скажет мне, что это такое.

Спасибо

Полная трассировка:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-33-9430b088fa85> in <module>
      5 
      6 X, Y = np.meshgrid(x, y)
----> 7 Z = np.mean(df.current[df['GPS Lon.']==X][df['GPS Lat.']==Y])
      8 
      9 cm = plt.cm.get_cmap('RdYlBu')

~/anaconda3/lib/python3.7/site-packages/pandas/core/ops.py in wrapper(self, other, axis)
   1743             # as it will broadcast
   1744             if other.ndim != 0 and len(self) != len(other):
-> 1745                 raise ValueError('Lengths must match to compare')
   1746 
   1747             res_values = na_op(self.values, np.asarray(other))

ValueError: Lengths must match to compare

Фрейм данных определяется файлом CSV. Имена столбцов во фрейме данных:

['Interval',
 'Distance (GPS)',
 'Distance (IMP)',
 'Elapsed Time',
 'Split (GPS)',
 'Speed (GPS)',
 'Split (IMP)',
 'Speed (IMP)',
 'Stroke Rate',
 'Total Strokes',
 'Distance/Stroke (GPS)',
 'Distance/Stroke (IMP)',
 'Heart Rate',
 'Power',
 'Catch',
 'Slip',
 'Finish',
 'Wash',
 'Force Avg',
 'Work',
 'Force Max',
 'Max Force Angle',
 'GPS Lat.',
 'GPS Lon.',
 'del_lon',
 'del_lat',
 'dir',
 'current',
 'geometry']

Цель строки кода, которая выдает ошибку, состоит в том, чтобы использовать пары Lat, Lon, определенные в сетке сетки, определенной X, Y. X и Y - это массивы NumPy с размерами 282 на 231.

Мое ограниченное понимание заключалось в том, что этот стиль индексации будет индексировать каждую пару X, Y и находить совпадающие значения в столбце данных df столбца «GPS Lat». и 'GPS Lon.'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...