在pandas dataframe中获取特定范围索引的最佳算法

zbdgwd5y  于 2023-09-29  发布在  其他
关注(0)|答案(1)|浏览(109)

我需要落实司机是否超速行驶。GPS信息每秒从安装在驾驶员驾驶的车辆中的GPS设备上传,如下所示。

  1. [(37.165224, 127.2354123), ... ,(37.123456, 127.123456)]

此外,有速度限制信息为每个roal在网格格式如下.

  1. (MinX, MaxX, MinY, MaxY, Speed Limit)
  2. [37.123456, 37.123458, 127.123456, 127.123458, 80]
  3. [37.123457, 37.123458, 127.123457, 127.123459, 70]
  4. ...

该网格信息具有重叠部分,其是由立交桥引起的信息。
因此,如果驾驶员被包括在多个网格信息中,则决定选择对应的速度限制的最大速度作为速度限制。
例如,在上述信息中,如果驾驶员包括在(37.123457, 127.123457)中,则根据网格信息,速度限制为8070,并且基于最高限制速度规则,速度限制被确定为80
我决定将其实现为每日批处理,并使用pandas dataframe实现了它,如下所示。

  1. with open("/path/file.pickle", "rb") as f:
  2. matsers:list = pickle.load(f)
  3. def func_max_spd_iterrow(lon, lat, master):
  4. limit_spd = -1
  5. if ((lat >= 33.0) & (lat <= 39.0)):
  6. locs = master.loc[(master['MINY']<=lat)&(master['MAXY']>lat)&(master['MINX']<=lon)&(master['MAXX']>lon)]
  7. if(locs.size != 0):
  8. spd = locs['LIMIT_SPD'].max()
  9. return spd

如上图所示,网格信息是使用pickle加载的,数据长度约为1000万。所以,仅仅分析一个司机2,000秒的驾驶记录就需要大约12秒
因此,我有一个问题,分析3,000个行程信息,因为它是极其耗时的。

是否有合适的算法来解决这个问题或pandas dataframe方法可以加速索引?

bgtovc5b

bgtovc5b1#

  1. #Convert your grid information into GeoDataFrame:
  2. import geopandas as gpd
  3. # Create a GeoDataFrame from your grid information
  4. gdf = gpd.GeoDataFrame(grid_info,
  5. columns=['Speed Limit'],
  6. geometry=gpd.GeoSeries([Polygon([(minX, minY), (maxX, minY), (maxX, maxY), (minX, maxY)])
  7. for minX, maxX, minY, maxY, _ in grid_info]))

然后,

  1. #Create a spatial index for the GeoDataFrame:
  2. gdf.sindex

然后,

  1. #Iterate through your GPS points and perform spatial queries:
  2. from shapely.geometry import Point
  3. def find_speed_limit(lon, lat):
  4. point = Point(lon, lat)
  5. possible_matches_index = list(gdf.sindex.intersection(point.bounds))
  6. possible_matches = gdf.iloc[possible_matches_index]
  7. for idx, row in possible_matches.iterrows():
  8. if point.within(row['geometry']):
  9. return row['Speed Limit']
  10. return -1 # No matching grid cell found

用法示例:

  1. speed_limit = find_speed_limit(37.165224, 127.2354123)
  2. print(speed_limit)
展开查看全部

相关问题