组队学习|DCIC2021算法分析题学习分享
本次主要针对学习baseline过程中未曾想到的方法与代码技巧进行分享
赛题分析
思路
通过共享单车订单数据与共享单车停车点数据进行匹配,可以获得不同时间共享单车在何处打开与关闭的数据。针对二者计算差值可以获得不同停车点的潮汐值,对比停车点的面积可以获得潮汐密度。
难点
- 停车点的面积应该如何计算?
- 如何将单车与停车点进行匹配?
数据预处理
如何定位每个停车点中心并求其面积?
- 将停车点的LOACTION处理成矩阵形式
- 找出每个停车点经纬度的最大值与最小值
- 通过对列求平均值获得停车点的中心经纬度
- 以最大最小经纬度之间的距离表停车点面积(利用geopy库的geodesic函数)
lambda x : geodesic((x['MIN_LATITUDE'], x['MIN_LONGITUDE']), (x['MAX_LATITUDE'], x['MAX_LONGITUDE'])).meters
停车点处理
方法一:基于geohash的停车点匹配潮汐点计算
原理
- geohash是一个地理位置编码,根据二维的经纬度在地图上划分出许多矩形区域,每个矩形区域具有一个编码,根据编码可以大致确定某个点的地理区域范围
- 通过geohash给每个停车位与共享单车订单位置进行编码,对二者进行匹配
import geohash
bike_order['geohash'] = bike_order.apply(
lambda x: geohash.encode(x['LATITUDE'], x['LONGITUDE'], precision=6), axis=1)
bike_fence['geohash'] = bike_fence['FENCE_CENTER'].apply( lambda x: geohash.encode(x[0], x[1], precision=6)
)
- 结合订单状态、订单时间与geohash编码,可以获得不同区域单车的潮汐情况
实现过程
pivot_table透视表:pivot_table(df,values,index,columns,aggfunc,fill_value)
index
为表的行,columns
为表的列,values
为表中行列确定的值,aggfunc
为聚合方法,fill_value
填充空值
bike_flow = pd.pivot_table(bike_order[bike_order['LOCK_STATUS']==1],
values='LOCK_STATUS', index=['geohash'],
columns=['DAY_HOUR'], aggfunc='count', fill_value=0)
方法二:基于距离匹配计算潮汐点
Nearestneighbors & hnsw近似搜索
- NN最近邻搜索:为每个订单寻找最近的停车点,并进行匹配(数据集过大时效率很低)
- hnsw近似搜索:一文看懂HNSW算法理论的来龙去脉