• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Python地址数据、标准化

武飞扬头像
dual_HZ
帮助1

问题背景

        在对地址数据进行处理的过程中,现有的地址数据往往是不标准的,如数据中的维度可能有北京市、余杭区、祁县、淀山湖镇等不同精细度的样本,因此本文聚焦的主要问题是将地址数据统一标准化成省-市(区)-县的格式,如下图所示,原始地址和地址的层级分别为address和level,标准化后的地址与经纬度信息见表的其他部分。

学新通

导入Python库

  1.  
    import requests
  2.  
    import json
  3.  
    import pandas as pd
  4.  
    import time

1 正向地理编码:城市->地理坐标

        首先定义一个函数,输入为地址和自己的ak,输出为经纬度和level。

  1.  
    def crawl_lnglat(address, ak): # 正向地理编码:城市->地理坐标
  2.  
    url = f'https://api.map.百度.com/geocoding/v3/?address={address}&output=json&ak={ak}'
  3.  
    response = requests.get(url)
  4.  
    info_dict = json.loads(response.text)
  5.  
    if info_dict['status']==0:
  6.  
    lng = info_dict['result']['location']['lng']
  7.  
    lat = info_dict['result']['location']['lat']
  8.  
    level = info_dict['result']['level']
  9.  
    else: # 如有报错,返回报错数据
  10.  
    print(info_dict['status'], address)
  11.  
    return lng,lat,level

         接着引用上一个函数,返回一个带有lng,lat,level,address的DataFrame,此时可以得到每个地址对应的经纬度信息。

  1.  
    def get_df_lnglat(raw_address): # 输入地址,得到对应坐标
  2.  
    lng_list, lat_list, level_list, address_list = [],[],[],[]
  3.  
    for i in df[raw_address].unique():
  4.  
    try:
  5.  
    lng, lat, level = crawl_lnglat(i,'您的ak') # 替换成您的ak
  6.  
    except:
  7.  
    lng, lat, level = crawl_lnglat(wrong_address[i],'您的ak') # 替换成您的ak
  8.  
    lng_list.append(lng)
  9.  
    lat_list.append(lat)
  10.  
    level_list.append(level)
  11.  
    address_list.append(i)
  12.  
    df_lnglat = pd.DataFrame({'lng':lng_list, 'lat':lat_list, 'level':level_list, 'address':address_list})
  13.  
    return df_lnglat

2 逆向地理编码:坐标-> 标准地址

        该函数通过输入第二步得到的经纬度数据,输出省-市-区的标准地址。

  1.  
    def crawl_address(lng, lat): # 逆向地理编码:坐标-> 标准地址
  2.  
    url = f'https://api.map.百度.com/reverse_geocoding/v3/?ak=ifGL3rtNxiQ8ZwPp2NnNCThbxumfDklx&output=json&coordtype=wgs84ll&location={lat},{lng}'
  3.  
    response = requests.get(url)
  4.  
    info_dict = json.loads(response.text)
  5.  
    if info_dict['status']==0:
  6.  
    province = info_dict['result']['addressComponent']['province']
  7.  
    city = info_dict['result']['addressComponent']['city']
  8.  
    district = info_dict['result']['addressComponent']['district']
  9.  
    else: # 如有报错,返回报错状态
  10.  
    print(info_dict['status'])
  11.  
    return province, city, district

        通过get_df_address函数即可得到存放所有标准化地址的Dataframe。

  1.  
    def get_df_address(df_lnglat): # 输入上面得到的经纬度df, 输出标准化地址
  2.  
    province_list, city_list, district_list = [],[],[]
  3.  
    for i, j in zip(df_lnglat['lng'],df_lnglat['lat']):
  4.  
    province, city, district = crawl_address(i,j)
  5.  
    if city == '':
  6.  
    city = district
  7.  
    province_list.append(province)
  8.  
    city_list.append(city)
  9.  
    district_list.append(district)
  10.  
    df_address = pd.DataFrame({'province':province_list, 'city':city_list, 'district':district_list})
  11.  
    return df_address

 主函数

        标准化后的地址数据最终存在df_total变量里,输出结果如文章开头所示。

  1.  
    if __name__ =='__main__':
  2.  
    df = pd.read_excel('地址数据.xlsx')
  3.  
    df_lnglat = get_df_lnglat('起始城市') # 得到经纬度信息
  4.  
    df_address = get_df_address(df_lnglat) # 地址标准化
  5.  
    df_total = pd.concat([df_address, df_lnglat], axis=1)

        地址标准化主要对地址数据进行预处理,将数据转化为后续模型或算法可以使用的标准化数据,大家在机器学习的数据预处理阶段可以参考本文的代码~

        感谢大家的支持!

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcjfee
系列文章
更多 icon
同类精品
更多 icon
继续加载