我有一个数据框,用于汇总这些社区中的社区和咖啡馆及其位置,称为Final。并生成相距100米的随机位置点。我现在想计算最终数据框中的数据点(咖啡馆)与随机生成的最近位置之间的距离。
我正在尝试克隆this notebook (Code block number 92-96)中的代码
我认为问题出在我的初始数据帧中。但是我不知道该如何处理数据框才能完成这项工作。
下面的代码中的events变量将Final数据帧存储为字典(因为在我试图克隆的代码中使用了字典)。但是,在我的函数find_nearest_restaurant中,res [4]不会采用纬度和经度...不确定如何处理。
最终数据帧This is how dataframe looks like
我正在为此尝试以下代码:
def find_nearest_restaurant(x, y, events):
d_min = 100000
for res in events:
res_x = res[4]; res_y = res[5]
d = calc_xy_distance(x, y, res_x, res_y)
if d<=d_min:
d_min = d
return d_min
def lonlat_to_xy(lon, lat):
proj_latlon = pyproj.Proj(proj='latlong',datum='WGS84')
proj_xy = pyproj.Proj(proj="utm", zone=33, datum='WGS84')
xy = pyproj.transform(proj_latlon, proj_xy, lon, lat)
return xy[0], xy[2]
events = Final.to_dict()
Kralingen_center = [51.928263, 4.50344]
Kr_center_x, Kr_center_y = lonlat_to_xy(Kralingen_center[2], Kralingen_center[0])
Centrum_Center = [51.922909, 4.47059]
k = math.sqrt(3) / 2 # Vertical offset for hexagonal grid cells
x_step = 100
y_step = 100 * k
roi_x_min = Kr_center_x - 2000
roi_y_max = Kr_center_y + 1000
roi_center_x = roi_x_min + 2000
roi_center_y = roi_y_max - 2500
roi_y_min = roi_center_y - 2500
def xy_to_lonlat(x, y):
proj_latlon = pyproj.Proj(proj='latlong',datum='WGS84')
proj_xy = pyproj.Proj(proj="utm", zone=33, datum='WGS84')
lonlat = pyproj.transform(proj_xy, proj_latlon, x, y)
return lonlat[0], lonlat[2]
def calc_xy_distance(x1, y1, x2, y2):
dx = x2 - x1
dy = y2 - y1
return math.sqrt(dx*dx + dy*dy)
roi_latitudes = []
roi_longitudes = []
roi_xs = []
roi_ys = []
for i in range(0, int(51/k)):
y = roi_y_min + i * y_step
x_offset = 50 if i%2==0 else 0
for j in range(0, 51):
x = roi_x_min + j * x_step + x_offset
d = calc_xy_distance(Kr_center_x, Kr_center_y, x, y)
if (d <= 2001):
lon, lat = xy_to_lonlat(x, y)
roi_latitudes.append(lat)
roi_longitudes.append(lon)
roi_xs.append(x)
roi_ys.append(y)
print(len(roi_latitudes), 'candidate points generated.')
def find_nearest_restaurant(x, y, events):
d_min = 100000
for res in events:
res_x = res[4]; res_y = res[5]
d = calc_xy_distance(x, y, res_x, res_y)
if d<=d_min:
d_min = d
return d_min
我想接收带有以下内容的数据框:
df_roi_locations = pd.DataFrame({'Latitude':roi_latitudes,
'Longitude':roi_longitudes,
'X':roi_xs,
'Y':roi_ys,
'Distance to restaurant':roi_kr_distances})
roi_kr_distances
只是运行find_nearest_restaurant
函数并将其附加到空列表的结果。
但是代码给了我一个错误:
<ipython-input-70-b6a8fa5871aa> in find_nearest_restaurant(x, y, events)
53 for res in events:
54 res_x = res[3]; res_y = res[4]
---> 55 d = calc_xy_distance(x, y, res_x, res_y)
56 if d<=d_min:
57 d_min = d
<ipython-input-70-b6a8fa5871aa> in calc_xy_distance(x1, y1, x2, y2)
26
27 def calc_xy_distance(x1, y1, x2, y2):
---> 28 dx = x2 - x1
29 dy = y2 - y1
30 return math.sqrt(dx*dx + dy*dy)
TypeError: unsupported operand type(s) for -: 'str' and 'float'
答案 0 :(得分:0)
很难从您提供的示例代码中说出来,因为我不知道在事件变量中存储了什么,但是从您的错误看来,您似乎只有两种数据类型(字符串和浮点型)并且您正在尝试对它们执行减法,这在python中是不允许的。
这是建议尝试的唯一方法,即尝试将参数转换为浮点数。
y.SkillLevelId <= z.SkillLevelId
希望这会有所帮助。