Python地址数据、标准化
问题背景
在对地址数据进行处理的过程中,现有的地址数据往往是不标准的,如数据中的维度可能有北京市、余杭区、祁县、淀山湖镇等不同精细度的样本,因此本文聚焦的主要问题是将地址数据统一标准化成省-市(区)-县的格式,如下图所示,原始地址和地址的层级分别为address和level,标准化后的地址与经纬度信息见表的其他部分。
导入Python库
-
import requests
-
import json
-
import pandas as pd
-
import time
1 正向地理编码:城市->地理坐标
首先定义一个函数,输入为地址和自己的ak,输出为经纬度和level。
-
def crawl_lnglat(address, ak): # 正向地理编码:城市->地理坐标
-
url = f'https://api.map.百度.com/geocoding/v3/?address={address}&output=json&ak={ak}'
-
response = requests.get(url)
-
info_dict = json.loads(response.text)
-
if info_dict['status']==0:
-
lng = info_dict['result']['location']['lng']
-
lat = info_dict['result']['location']['lat']
-
level = info_dict['result']['level']
-
else: # 如有报错,返回报错数据
-
print(info_dict['status'], address)
-
return lng,lat,level
接着引用上一个函数,返回一个带有lng,lat,level,address的DataFrame,此时可以得到每个地址对应的经纬度信息。
-
def get_df_lnglat(raw_address): # 输入地址,得到对应坐标
-
lng_list, lat_list, level_list, address_list = [],[],[],[]
-
for i in df[raw_address].unique():
-
try:
-
lng, lat, level = crawl_lnglat(i,'您的ak') # 替换成您的ak
-
except:
-
lng, lat, level = crawl_lnglat(wrong_address[i],'您的ak') # 替换成您的ak
-
lng_list.append(lng)
-
lat_list.append(lat)
-
level_list.append(level)
-
address_list.append(i)
-
df_lnglat = pd.DataFrame({'lng':lng_list, 'lat':lat_list, 'level':level_list, 'address':address_list})
-
return df_lnglat
2 逆向地理编码:坐标-> 标准地址
该函数通过输入第二步得到的经纬度数据,输出省-市-区的标准地址。
-
def crawl_address(lng, lat): # 逆向地理编码:坐标-> 标准地址
-
url = f'https://api.map.百度.com/reverse_geocoding/v3/?ak=ifGL3rtNxiQ8ZwPp2NnNCThbxumfDklx&output=json&coordtype=wgs84ll&location={lat},{lng}'
-
response = requests.get(url)
-
info_dict = json.loads(response.text)
-
if info_dict['status']==0:
-
province = info_dict['result']['addressComponent']['province']
-
city = info_dict['result']['addressComponent']['city']
-
district = info_dict['result']['addressComponent']['district']
-
else: # 如有报错,返回报错状态
-
print(info_dict['status'])
-
return province, city, district
通过get_df_address函数即可得到存放所有标准化地址的Dataframe。
-
def get_df_address(df_lnglat): # 输入上面得到的经纬度df, 输出标准化地址
-
province_list, city_list, district_list = [],[],[]
-
for i, j in zip(df_lnglat['lng'],df_lnglat['lat']):
-
province, city, district = crawl_address(i,j)
-
if city == '':
-
city = district
-
province_list.append(province)
-
city_list.append(city)
-
district_list.append(district)
-
df_address = pd.DataFrame({'province':province_list, 'city':city_list, 'district':district_list})
-
return df_address
主函数
标准化后的地址数据最终存在df_total变量里,输出结果如文章开头所示。
-
if __name__ =='__main__':
-
df = pd.read_excel('地址数据.xlsx')
-
df_lnglat = get_df_lnglat('起始城市') # 得到经纬度信息
-
df_address = get_df_address(df_lnglat) # 地址标准化
-
df_total = pd.concat([df_address, df_lnglat], axis=1)
地址标准化主要对地址数据进行预处理,将数据转化为后续模型或算法可以使用的标准化数据,大家在机器学习的数据预处理阶段可以参考本文的代码~
感谢大家的支持!
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcjfee
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13