You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PowerBI中通过Python从邮政编码提取城市、州及国家信息

PowerBI中用Python从邮政编码提取地址信息的实现方案

当然可以在PowerBI内通过Python脚本实现从邮政编码提取城市、州和国家名称的需求,你的思路是可行的,但现有脚本还有不少可以优化的地方,下面具体说明:

你的当前实现

1. 数据获取

通过ODBC连接数据库,执行以下SQL从EMPLOYEE_DATA表获取49445条数据:

SELECT
ID,
POSTAL_CODE
FROM EMPLOYEE_DATA;

2. Python脚本实现

你编写的PowerBI内嵌Python脚本(已翻译注释):

# 'dataset' 为脚本的输入数据

# 导入所需库
from geopy.geocoders import Nominatim
from geopy.exc import GeocoderTimedOut

# 从邮政编码提取城市、州、国家的函数
def extract_location(POSTAL_CODE):
    geolocator = Nominatim(user_agent="geoapi")
    try:
        location = geolocator.geocode(POSTAL_CODE, timeout=10)  # 可按需调整超时时间
        if location:
            return location.address.split(", ")[-3:]
        else:
            return ["", "", ""]  # 未找到位置时返回空字符串
    except GeocoderTimedOut:
        return ["", "", ""]  # 地理编码超时返回空字符串


output = dataset.apply(lambda row: extract_location(row['POSTAL_CODE']), axis=1, result_type='expand')

# 重命名输出列
output.columns = ['City', 'State', 'Country']

脚本优化建议

  1. 避免重复实例化地理编码器
    每次调用extract_location都新建Nominatim实例会浪费资源,建议全局实例化一次:

    # 移到函数外部,全局仅初始化一次
    geolocator = Nominatim(user_agent="geoapi")
    
  2. 优化地址解析逻辑
    直接通过split(", ")取最后三个元素的方式不稳定,不同国家地址格式差异极大(比如部分国家无州级行政区)。建议利用location.raw的结构化数据解析:

    if location:
        address_components = location.raw.get('address', {})
        # 兼容不同地区的城市字段命名
        city = address_components.get('city', address_components.get('town', address_components.get('village', '')))
        state = address_components.get('state', address_components.get('province', ''))
        country = address_components.get('country', '')
        return [city, state, country]
    
  3. 添加重试机制
    当前超时后直接返回空值,可增加重试逻辑提升成功率:

    def extract_location(POSTAL_CODE, retry_count=2):
        try:
            location = geolocator.geocode(POSTAL_CODE, timeout=10)
            # ... 上面的结构化解析逻辑 ...
        except GeocoderTimedOut:
            if retry_count > 0:
                return extract_location(POSTAL_CODE, retry_count-1)
            else:
                return ["", "", ""]
    
  4. 处理批量数据性能与请求限制
    4万条数据逐条调用apply效率偏低,且Nominatim有请求频率限制,建议添加延迟控制请求间隔:

    import time
    
    def extract_location(POSTAL_CODE, retry_count=2):
        time.sleep(1)  # 控制请求间隔,避免被限制
        # ... 原有逻辑 ...
    
  5. 规范用户代理设置
    Nominatim要求用户代理能识别你的应用,建议设置更具体的名称,比如"PowerBI-Geocoding-EmployeeDataApp",降低被限流的概率。


内容的提问来源于stack exchange,提问作者LogicAndArt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:13:10