我正在使用NYC旅行数据。我想将数据中存在的纬度转换为纽约市的各个行政区。我特别想知道在其中一次旅行中是否有纽约机场(拉瓜迪亚/肯尼迪机场)。
我知道Google Maps API甚至像Geopy这样的库都会获得反向地理编码。但是,他们中的大多数都提供城市和国家级别的编码。
我想从lat-long中提取自治市镇或机场(如Queens,Manhattan,JFK,Laguardia等)。对于接送和下降位置我都有lat-long。
以下是pandas dataframe中的示例数据集。
VendorID lpep_pickup_datetime Lpep_dropoff_datetime Store_and_fwd_flag RateCodeID Pickup_longitude Pickup_latitude Dropoff_longitude Dropoff_latitude Passenger_count Trip_distance Fare_amount Extra MTA_tax Tip_amount Tolls_amount Ehail_fee improvement_surcharge Total_amount Payment_type Trip_type
0 2 2015-09-01 00:02:34 2015-09-01 00:02:38 N 5 -73.979485 40.684956 -73.979431 40.685020 1 0.00 7.8 0.0 0.0 1.95 0.0 NaN 0.0 9.75 1 2.0
1 2 2015-09-01 00:04:20 2015-09-01 00:04:24 N 5 -74.010796 40.912216 -74.010780 40.912212 1 0.00 45.0 0.0 0.0 0.00 0.0 NaN 0.0 45.00 1 2.0
2 2 2015-09-01 00:01:50 2015-09-01 00:04:24 N 1 -73.921410 40.766708 -73.914413 40.764687 1 0.59 4.0 0.5 0.5 0.50 0.0 NaN 0.3 5.80 1 1.0
In [5]:
您也可以在这里找到数据:
http://www.nyc.gov/html/tlc/html/about/trip_record_data.shtml
经过一番研究后,我发现我可以利用Google Maps API来获取县级甚至企业级数据。
这是我写的代码:
def reverse_geocode(latlng):
result = {}
url = 'https://maps.googleapis.com/maps/api/geocode/json?latlng={}'
request = url.format(latlng)
data = requests.get(request).json()
if len(data['results']) > 0:
result = data['results'][0]
return result
# Geo_code data for pickup-lat-long
trip_data_sample["est_pickup"] = [y["address_components"][0]["long_name"] for y in map(reverse_geocode, trip_data_sample["lat_long_pickup"].values)]
trip_data_sample["locality_pickup"]=[y["address_components"][2]["long_name"] for y in map(reverse_geocode, trip_data_sample["lat_long_pickup"].values)]
但是,我最初有1.4MM的记录。完成这项工作需要花费大量时间。所以我减少到200K。即便这样也需要很多时间才能运行。那么我减少到115K。即便花费太多时间。
所以现在我减少到50K。但是这个样本几乎不具有整个数据的代表性分布。
我想知道是否有更好更快的方法来获得lat-long的反向地理编码。我没有使用Spark,因为我在本地mac上运行它。所以使用Spark可能无法在单台机器上提供那么多的速度杠杆。请指教。