一定范围内所有 GPS 点的平均测量
Average measure for all GPS points within certain range
我有一个 pandas 数据框,其中包含纬度、经度和 100K+ GPS 点的测量值。
df = pd.DataFrame({'lat': [41.260637, 45.720185, 45.720189, 45.720214, 45.720227, 46.085716, 46.085718, 46.085728, 46.085730, 46.085732],
'lng': [2.825920, 3.068014, 3.068113, 3.067929, 3.068199, 3.341655, 3.341534, 3.341476, 3.341546, 3.341476],
'measure': [6.30000, -0.375000, -0.375000, -0.375000, -0.375000, 0.000000, 0.000000, 0.555556, 0.714286, 0.645833]})
我想要做的是,对于这些点中的每一个,计算 10 米范围内所有点的度量列的平均值。
我知道如何使用geopy
计算两点之间的距离
from geopy.distance import distance
distance([gps_points.lat[3], gps_points.lng[3]], [gps_points.lat[4], gps_points.lng[4]]).m
21.06426497936181
但是我该如何迭代行,选择 10 米范围内的点并取平均值?
我猜是某种 groupby,但不知道如何实现。
在这个例子中,点本身总是被包含在内。使其成为平均值本身的一部分。如果您想排除该点本身,则需要修改该部分。
我们可以使用 BallTree
import pandas as pd
from sklearn.neighbors import BallTree
import numpy as np
以及您的示例数据
df = pd.DataFrame({'lat': [41.260637, 45.720185, 45.720189, 45.720214, 45.720227, 46.085716, 46.085718, 46.085728, 46.085730, 46.085732],
'lng': [2.825920, 3.068014, 3.068113, 3.067929, 3.068199, 3.341655, 3.341534, 3.341476, 3.341546, 3.341476],
'measure': [6.30000, -0.375000, -0.375000, -0.375000, -0.375000, 0.000000, 0.000000, 0.555556, 0.714286, 0.645833]})
我们可以用
创建一棵树
gps_pairs = df[["lat", "lng"]].values
radians = np.radians(gps_pairs)
tree = BallTree(radians, leaf_size=15, metric='haversine')
现在我们需要缩放以获得 10 米的半径(大约):
distance_in_meters = 10
earth_radius = 6371000
radius = distance_in_meters / earth_radius
用
查询radius
is_within, distances = tree.query_radius(radians, r=radius, count_only=False, return_distance=True)
is_within
将包含落在 10 米以内的点的索引。
现在您可以使用以下方法计算平均测量值:
measures = df[['measure']].values
average_measure_for_withins = np.array([ np.mean( measures[withins] ) for withins in is_within ])
例如将其添加到 DF
df['average_for_withins'] = average_measure_for_withins
我有一个 pandas 数据框,其中包含纬度、经度和 100K+ GPS 点的测量值。
df = pd.DataFrame({'lat': [41.260637, 45.720185, 45.720189, 45.720214, 45.720227, 46.085716, 46.085718, 46.085728, 46.085730, 46.085732],
'lng': [2.825920, 3.068014, 3.068113, 3.067929, 3.068199, 3.341655, 3.341534, 3.341476, 3.341546, 3.341476],
'measure': [6.30000, -0.375000, -0.375000, -0.375000, -0.375000, 0.000000, 0.000000, 0.555556, 0.714286, 0.645833]})
我想要做的是,对于这些点中的每一个,计算 10 米范围内所有点的度量列的平均值。
我知道如何使用geopy
from geopy.distance import distance
distance([gps_points.lat[3], gps_points.lng[3]], [gps_points.lat[4], gps_points.lng[4]]).m
21.06426497936181
但是我该如何迭代行,选择 10 米范围内的点并取平均值?
我猜是某种 groupby,但不知道如何实现。
在这个例子中,点本身总是被包含在内。使其成为平均值本身的一部分。如果您想排除该点本身,则需要修改该部分。
我们可以使用 BallTree
import pandas as pd
from sklearn.neighbors import BallTree
import numpy as np
以及您的示例数据
df = pd.DataFrame({'lat': [41.260637, 45.720185, 45.720189, 45.720214, 45.720227, 46.085716, 46.085718, 46.085728, 46.085730, 46.085732],
'lng': [2.825920, 3.068014, 3.068113, 3.067929, 3.068199, 3.341655, 3.341534, 3.341476, 3.341546, 3.341476],
'measure': [6.30000, -0.375000, -0.375000, -0.375000, -0.375000, 0.000000, 0.000000, 0.555556, 0.714286, 0.645833]})
我们可以用
创建一棵树gps_pairs = df[["lat", "lng"]].values
radians = np.radians(gps_pairs)
tree = BallTree(radians, leaf_size=15, metric='haversine')
现在我们需要缩放以获得 10 米的半径(大约):
distance_in_meters = 10
earth_radius = 6371000
radius = distance_in_meters / earth_radius
用
查询radius
is_within, distances = tree.query_radius(radians, r=radius, count_only=False, return_distance=True)
is_within
将包含落在 10 米以内的点的索引。
现在您可以使用以下方法计算平均测量值:
measures = df[['measure']].values
average_measure_for_withins = np.array([ np.mean( measures[withins] ) for withins in is_within ])
例如将其添加到 DF
df['average_for_withins'] = average_measure_for_withins