我有一个点的数据帧,其id名称和纬度/经度为:
df = pd.DataFrame({'id':list('abcde'),'latitude': [38.470628, 37.994155, 38.66937, 34.119578, 36.292307],'longitude': [-121.404586, -121.802341, -121.295325, -117.413791, -119.804074]}) #sample
对于每个id,我需要计算(同一数据集的(位于距离它2英里半径内的点的数量。
问题:如何在Python中以最简单的方式做到这一点?
这个问题有些模棱两可。你需要的第一个组件是一个计算两个坐标之间距离的函数,这需要一些三角法,并且在以下问题中有几个实现。
完成函数后,只需在所有点上循环并进行计算。可能有比两个嵌套循环更有效的方法,但这是最简单的。
import numpy as np
import pandas as pd
from sklearn.neighbors import BallTree
样本数据
df = pd.DataFrame({'id':list('abcde'),'latitude': [38.470628, 37.994155, 38.66937, 34.119578, 36.292307],'longitude': [-121.404586, -121.802341, -121.295325, -117.413791, -119.804074]}) #sample
提取lat、long并转换为弧度。当转换为单位球体时,计算所需的半径。
coords = df[["latitude","longitude"]]
distance_in_miles = 50
earth_radius_in_miles = 3958.8
radius = distance_in_miles / earth_radius_in_miles
tree = BallTree( np.radians(coords), leaf_size=10, metric='haversine')
tree.query_radius( np.radians(coords), r=radius, count_only=True)
哪个给出array([3, 2, 2, 1, 1])
如果您想返回标记并将其用于骨料;一种方法是
df = pd.DataFrame({'id':list('abcde'),'latitude': [38.470628, 37.994155, 38.66937, 34.119578, 36.292307],'longitude': [-121.404586, -121.802341, -121.295325, -117.413791, -119.804074], 'saleprice_usd_per_sqf': [200, 300, 700, 350, 50]})
coords = df[["latitude","longitude"]]
distance_in_miles = 50
earth_radius_in_miles = 3958.8
radius = distance_in_miles / earth_radius_in_miles
注意,我们在这里使用标记,而不仅仅是计数;
tree = BallTree( np.radians(coords), leaf_size=10, metric='haversine')
indici = tree.query_radius( np.radians(coords), r=radius, count_only=False)
例如,使用列表理解来获得每个半径的中值。请注意,点本身始终包含在其自身的半径中。
[np.median(df.saleprice_usd_per_sqf.values[idx]) for idx in indici]