У меня есть набор данных, который включает измерения тока реки, сделанные в определенных географических точках, обозначенных широтой и долготой. В данных присутствует значительный шум, но множественные измерения проходят вверх и вниз по реке. Я пытаюсь рассчитать средний ток для регулярной сетки через реку. Вот что я делаю
- считывание данных на фрейм данных с округлением широты и долготы до разрешения ~ 10 м (0,0001) градуса.
- Создание 10-метровой сетки (X, Y), которая охватывает минимальную и максимальную широту и долготу.
- Генерация среднего тока (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.'