引言
在一次建模比赛中,我手头里的原始数据中有一个“地址描述”地段,如下:
地址描述 |
---|
广州国际采购中心1401 |
上海市长宁区金钟路658弄5号楼5楼 |
徐汇区虹漕路461号58号楼5楼 |
济南市历下区和平路34号轻骑院内东二层山东朵拉 |
这样的地址描述字段过于随意,很难使用,但是看这些字符串的样子似乎又可以提取出其所在的省、市和区,即使只能够提取出区或者市,如果我们有一个省、市和区的归属数据库的话,应该也能够将剩下的信息映射出来,如果自己写的话肯定很麻烦,还要去网上找数据库,于是我做了一个可以复用的python模块,一条命令就可以将上面的“地址描述”字段转换成如下的样子:
省 | 市 | 区 |
---|---|---|
广东省 | 广州市 | |
上海市 | 上海市 | 长宁区 |
上海市 | 上海市 | 徐汇区 |
山东省 | 济南市 | 历下区 |
模块安装
目前支持python3
pip install cpca
常见安装问题:
在 windows 上可能会出现类似如下问题
Building wheel for pyahocorasick (setup.py) ... error
先去下载 Microsoft Visual C++ Build Tools,安装完成后,再重新使用 pip install cpca 安装,即可解决问题
Github地址
更详细的模块介绍见Github上的README
https://github.com/DQinYuan/chinese_province_city_area_mapper
如果觉得这个模块对你有帮助的话,请给个star啊
基本功能
本模块中最主要的方法是cpca.transform
,该方法可以输入任意的可迭代类型(如list,pandas的Series类型等),然后将其转换为一个DataFrame,下面演示一个最为简单的使用方法:
location_str = ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区", "北京朝阳区北苑华贸城"]
import cpca
df = cpca.transform(location_str)
df
输出的结果为:
省 市 区 地址 adcode
0 上海市 上海市 徐汇区 虹漕路461号58号楼5楼 310104
1 福建省 泉州市 洛江区 万安塘西工业区 350504
2 北京市 市辖区 朝阳区 北苑华贸城 110105
如果你想获知程序是从字符串的哪个位置提取出省市区名的,可以添加一个pos_sensitive=True
参数:
location_str = ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区", "北京朝阳区北苑华贸城"]
import cpca
df = cpca.transform(location_str, pos_sensitive=True)
df
输出如下:
省 市 区 地址 adcode 省_pos 市_pos 区_pos
0 上海市 上海市 徐汇区 虹漕路461号58号楼5楼 310104 -1 -1 0
1 福建省 泉州市 洛江区 万安塘西工业区 350504 -1 0 3
2 北京市 市辖区 朝阳区 北苑华贸城 110105 -1 -1 0
其中省_pos
,市_pos
和区_pos
三列大于-1的部分就代表提取的位置。-1则表明这个字段是靠程序推断出来的,抑或没能提取出来。
中国的区级行政单位非常的多,经常有重名的情况,比如“北京市朝阳区”和“吉林省长春市朝阳区”,当有上级地址信息的时候,cpca 能够根据上级地址 推断出这是哪个区,但是如果没有上级地址信息,单纯只有一个区名的时候, cpca 就没法推断了,只能随便选一个了, 通过 umap 参数你可以指定这种情况下该选择哪一个:
import cpca
cpca.transform(["朝阳区汉庭酒店大山子店"])
# 省 市 区 地址 adcode
#0 吉林省 长春市 朝阳区 汉庭酒店大山子店 220104
cpca.transform(["朝阳区汉庭酒店大山子店"],umap={"朝阳区":"110105"})
# 省 市 区 地址 adcode
#0 北京市 市辖区 朝阳区 汉庭酒店大山子店 110105
从例子可以看出,umap 字典的 key 是区名,value 是区的 adcode,这里 110105
就是北京市朝阳区的 adcode,具体的 adcode 可以去 全国行政区划查询平台 上查询。
从大段文本中提取多个地址(0.5.5版本新功能):
import cpca
df = cpca.transform_text_with_addrs("分店位于徐汇区虹漕路461号58号楼5楼和泉州市洛江区万安塘西工业区以及南京鼓楼区")
df
结果为(注意 transform_text_with_addrs 获得的数据,“地址”列都是空的):
省 市 区 地址 adcode
0 上海市 市辖区 徐汇区 310104
1 福建省 泉州市 洛江区 350504
2 江苏省 南京市 鼓楼区 320106
transform_text_with_addrs 还支持和 transform 类似的 index, pos_sensitive 以及 umap 参数
地图绘制
模块中还自带一些简单绘图工具,可以在地图上将上面输出的数据以热力图的形式画出来.
这个工具依赖folium,为了减小本模块的体积,所以并不会预装这个依赖,在使用之前请使用pip install folium
.
代码如下:
from cpca import drawer
#df为上一段代码输出的df
drawer.draw_locations(df[cpca._ADCODE], "df.html")
这一段代码运行结束后会在运行代码的当前目录下生成一个df.html文件,用浏览器打开即可看到
绘制好的地图(如果某条数据'省','市'或'区'字段有缺,则会忽略该条数据不进行绘制),速度会比较慢,需要耐心等待,绘制的图像如下:
还有更多的绘图工具请参考Github上的README中大标题为“示例与测试用例”的部分。