在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']
脚本优化建议
避免重复实例化地理编码器
每次调用extract_location都新建Nominatim实例会浪费资源,建议全局实例化一次:# 移到函数外部,全局仅初始化一次 geolocator = Nominatim(user_agent="geoapi")优化地址解析逻辑
直接通过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]添加重试机制
当前超时后直接返回空值,可增加重试逻辑提升成功率: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万条数据逐条调用apply效率偏低,且Nominatim有请求频率限制,建议添加延迟控制请求间隔:import time def extract_location(POSTAL_CODE, retry_count=2): time.sleep(1) # 控制请求间隔,避免被限制 # ... 原有逻辑 ...规范用户代理设置
Nominatim要求用户代理能识别你的应用,建议设置更具体的名称,比如"PowerBI-Geocoding-EmployeeDataApp",降低被限流的概率。
内容的提问来源于stack exchange,提问作者LogicAndArt
相关产品推荐
相关产品推荐

