计算Haversine距离时,主for循环只有一次运行
While calculating Haversine distance, the main for loop is running only once
我有一个包含城市名称、经度和纬度的数据框。我想要做的是创建一个城市周围 100 公里半径范围内的城市数据框。我的意思是如果我的数据看起来像
City Latitude Longitude
Delhi lat1 long1
Noida lat2 long2
Gurgaon lat3 long3
Mumbai lat4 long4
处理后我希望我的数据看起来像:
City nearby city distance
Delhi Noida x1
Delhi Gurgaon x2
Noida Delhi x3
Noida Gurgaon x4
Gurgaon Delhi x5
Gurgaon Noida x6
孟买被省略了,因为我只想看到该城市 100 公里半径范围内的城市周围的城市。出于这个原因,我使用了 Haversine 公式。这是我的代码:
for idx, val in enumerate(city_list):
lat1 = city_latitude[idx]
long1 = city_longitude[idx]
for next_idx, next_val in enumerate(copy_city_list):
if val == next_val:
pass
else:
lat2 = city_latitude[next_idx]
long2 = city_longitude[next_idx]
lat1, long1, lat2, long2 = map(radians, [lat1, long1, lat2, long2])
# haversine formula
dlon = long2 - long1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
# Radius of earth in kilometers is 6371
km = 6371 * c
if(km > 100):
pass
else:
city.append(val)
near_by_city.append(next_val)
distance.append(km)
print("Record appeneded")
我将我的数据分成 3 个列表,city_list
、city_latitude
、city_longitude
因为当我第一次使用 pandas 数据帧时,我得到了一个输出将近 10 分钟,因为我有 3368 条记录。将它分成列表并执行计算会在 2-3 分钟内给我一个输出,但问题仍然存在。主循环仅执行 3368 次迭代中的一次,附加值也变得混乱。
我想看到的输出是 city
列表中的 Delhi,Delhi,Noida,Noida,Gurgaon,Gurgaon
和 near_by_city
列表中的 Noida,Gurgaon,Delhi,Gurgaon,Delhi,Noida
。相反,我在 city
列表中看到 Noida,Gurgaon
,在 near_by_city
列表中看到 Delhi,Delhi
。
我哪里错了?
我认为只使用您的 city_data 而不将其分成单独的列表可能更容易。
我喜欢列表推导式,所以我将使用它来将城市列表与其自身进行交叉乘积,并计算它们之间的距离。然后我们将只打印彼此相邻的对。
可能会有一些优化,例如,如果您知道从“A”到“B”的距离,那么您可能不需要计算从“B”到“A”的距离。我留给你考虑。
from haversine import haversine
cities = [
["Delhi", 28.7041, 77.1025],
["Noida", 28.5355, 77.3910],
["Gurgaon", 28.4595, 77.0266],
["Mumbai", 19.0760, 72.8777]
]
cities_crossed = [
[x[0], y[0], haversine((x[1], x[2]), (y[1], y[2]))]
for x in cities
for y in cities if x[0] != y[0]
]
print("City\tNearby\tDistance")
for nearby_cities in [city_pair for city_pair in cities_crossed if city_pair[2] < 100]:
print("{}\t{}\t{}".format(*nearby_cities))
我有一个包含城市名称、经度和纬度的数据框。我想要做的是创建一个城市周围 100 公里半径范围内的城市数据框。我的意思是如果我的数据看起来像
City Latitude Longitude
Delhi lat1 long1
Noida lat2 long2
Gurgaon lat3 long3
Mumbai lat4 long4
处理后我希望我的数据看起来像:
City nearby city distance
Delhi Noida x1
Delhi Gurgaon x2
Noida Delhi x3
Noida Gurgaon x4
Gurgaon Delhi x5
Gurgaon Noida x6
孟买被省略了,因为我只想看到该城市 100 公里半径范围内的城市周围的城市。出于这个原因,我使用了 Haversine 公式。这是我的代码:
for idx, val in enumerate(city_list):
lat1 = city_latitude[idx]
long1 = city_longitude[idx]
for next_idx, next_val in enumerate(copy_city_list):
if val == next_val:
pass
else:
lat2 = city_latitude[next_idx]
long2 = city_longitude[next_idx]
lat1, long1, lat2, long2 = map(radians, [lat1, long1, lat2, long2])
# haversine formula
dlon = long2 - long1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
# Radius of earth in kilometers is 6371
km = 6371 * c
if(km > 100):
pass
else:
city.append(val)
near_by_city.append(next_val)
distance.append(km)
print("Record appeneded")
我将我的数据分成 3 个列表,city_list
、city_latitude
、city_longitude
因为当我第一次使用 pandas 数据帧时,我得到了一个输出将近 10 分钟,因为我有 3368 条记录。将它分成列表并执行计算会在 2-3 分钟内给我一个输出,但问题仍然存在。主循环仅执行 3368 次迭代中的一次,附加值也变得混乱。
我想看到的输出是 city
列表中的 Delhi,Delhi,Noida,Noida,Gurgaon,Gurgaon
和 near_by_city
列表中的 Noida,Gurgaon,Delhi,Gurgaon,Delhi,Noida
。相反,我在 city
列表中看到 Noida,Gurgaon
,在 near_by_city
列表中看到 Delhi,Delhi
。
我哪里错了?
我认为只使用您的 city_data 而不将其分成单独的列表可能更容易。
我喜欢列表推导式,所以我将使用它来将城市列表与其自身进行交叉乘积,并计算它们之间的距离。然后我们将只打印彼此相邻的对。
可能会有一些优化,例如,如果您知道从“A”到“B”的距离,那么您可能不需要计算从“B”到“A”的距离。我留给你考虑。
from haversine import haversine
cities = [
["Delhi", 28.7041, 77.1025],
["Noida", 28.5355, 77.3910],
["Gurgaon", 28.4595, 77.0266],
["Mumbai", 19.0760, 72.8777]
]
cities_crossed = [
[x[0], y[0], haversine((x[1], x[2]), (y[1], y[2]))]
for x in cities
for y in cities if x[0] != y[0]
]
print("City\tNearby\tDistance")
for nearby_cities in [city_pair for city_pair in cities_crossed if city_pair[2] < 100]:
print("{}\t{}\t{}".format(*nearby_cities))