手把手教你完成一个数据科学小项目(6):城市提取与可视化

前言

请先阅读《“中国年轻人正带领国家走向危机”,这锅背是不背? 》 一文,以对“手把手教你完成一个数据科学小项目”系列有个全局性的了解。

代码统一开源在 GitHub:DesertsX/gulius-projects ,感兴趣的朋友可以先行 star 哈。

截至目前我们已经完成了数据爬取数据提取与IP查询数据异常与清洗评论数变化情况分析省份提取与可视化,本文将提取城市数据,并用 pyecharts 完成地图可视化。

读取数据

前面几步都在上一篇文章里讲过了,因为牵扯许多相关的操作,所以很快的过一遍。

import pandas as pd
df = pd.read_csv('Sina_Finance_Comments_All_20180811_Cleaned.csv',encoding='utf-8')
df[['area','ip_loc']]

统计 area

看看area列有多少种情况。

area_count = df.groupby('area')['area'].count().sort_values(ascending=False)
area_name = list(area_count.index)
area_values = area_count.values
print(len(area_name),len(area_values))
print(area_count)

数据处理思路

首先再次明确下这次的目的是提取出省份和城市信息,且由于数据量不大,所以后续只在中国地图上进行可视化,因而海外地理信息统一可以筛选出去,实现的方式是按照国家名手动构建一个unchina的列表,用来存储本次数据里出现的海外国家,然后遍历所有的337条area_name元素,包含这些国家名的就添加到drop列表里,然后根据其他国内的地理信息的长度分别打印出来,这样数据就清晰多了!过程中可能有些会被误分,需要核查一遍。

area_len_2 = []
area_len_3 = []
area_len_4 = []
area_len_5 = []
unchina = ['英国','美国','日本','瑞士','法国','瑞典','越南','泰国',
           '意大利','加拿大','菲律宾','新加坡','新西兰','伊拉克','爱尔兰','安哥拉',
           '澳大利亚', '大韩民国', '马来西亚']
droped = []
for area in area_name:
    for unarea in unchina:
        if unarea in area: 
            droped.append(area)
    if len(area)==2 and area not in droped: area_len_2.append(area) # 我国共有34个省级行政区域,包括23个省,5个自治区,4个直辖市,2个特别行政区。
    if len(area)==3 and area not in droped: area_len_3.append(area)
    if len(area)==4 and area not in droped: area_len_4.append(area)
    if len(area)>=5 and area not in droped: area_len_5.append(area)
print(len(droped),'\n', droped)
print(len(area_len_2),'\n', area_len_2)
print(len(area_len_3),'\n', area_len_3)
print(len(area_len_4),'\n', area_len_4)
print(len(area_len_5),'\n', area_len_5)

省份汇总

根据百度百科词条里的内容:省份 - 百科我国共有34个省级行政区域,包括23个省,5个自治区,4个直辖市,2个特别行政区。

复制过来所有省份,先手动去掉自治区和行政区的后缀文字,再用代码去掉无关的文字与字符。

prolist = '北京市,天津市,上海市,重庆市,河北省,山西省,辽宁省,吉林省,江苏省,浙江省,安徽省,福建省,\
江西省,山东省,河南省,湖北省,湖南省,广东省,海南省,四川省,贵州省,云南省,陕西省,甘肃省,\
青海省,台湾省,广西,西藏,宁夏,新疆,香港,澳门,内蒙古,黑龙江省'
prolist = prolist.replace('市', '').replace('省', '').split(',')
print(len(prolist), prolist)

34个省份

['北京', '天津', '上海', '重庆', '河北', '山西', '辽宁', '吉林', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '广西', '西藏', '宁夏', '新疆', '香港', '澳门', '内蒙古', '黑龙江']

城市提取

上面相关代码过一遍后,接下来就是本文的重点,提取城市数据并进行可视化了。

根据以前的经验可知,个别点的经纬度数据可能没有内置,所以调用地图时,会无法显示并报错。所以先要确定哪些数据可用,哪些不可用,但到底 ECharts 或 pyecharts 里内置了哪些数据目前还没了解过。望知晓的朋友可以告知。

本次采取的方式是:从 ECharts 官网的effectScatter-bmap示例中提取出城市列表,便于筛选。当然事先并不知道这里的数据和本次评论的数据的匹配度多高,只能“实践出真知”。

geoCoordMap = {'海门':[121.15,31.89],'鄂尔多斯':[109.781327,39.608266],'招远':[120.38,37.35],'舟山':[122.207216,29.985295],'齐齐哈尔':[123.97,47.33],'盐城':[120.13,33.38],'赤峰':[118.87,42.28],'青岛':[120.33,36.07],'乳山':[121.52,36.89],'金昌':[102.188043,38.520089],'泉州':[118.58,24.93],'莱西':[120.53,36.86],'日照':[119.46,35.42],'胶南':[119.97,35.88],'南通':[121.05,32.08],'拉萨':[91.11,29.97],'云浮':[112.02,22.93],'梅州':[116.1,24.55],'文登':[122.05,37.2],'上海':[121.48,31.22],'攀枝花':[101.718637,26.582347],'威海':[122.1,37.5],'承德':[117.93,40.97],'厦门':[118.1,24.46],'汕尾':[115.375279,22.786211],'潮州':[116.63,23.68],'丹东':[124.37,40.13],'太仓':[121.1,31.45],'曲靖':[103.79,25.51],'烟台':[121.39,37.52],'福州':[119.3,26.08],'瓦房店':[121.979603,39.627114],'即墨':[120.45,36.38],'抚顺':[123.97,41.97],'玉溪':[102.52,24.35],'张家口':[114.87,40.82],'阳泉':[113.57,37.85],'莱州':[119.942327,37.177017],'湖州':[120.1,30.86],'汕头':[116.69,23.39],'昆山':[120.95,31.39],'宁波':[121.56,29.86],'湛江':[110.359377,21.270708],'揭阳':[116.35,23.55],'荣成':[122.41,37.16],'连云港':[119.16,34.59],'葫芦岛':[120.836932,40.711052],'常熟':[120.74,31.64],'东莞':[113.75,23.04],'河源':[114.68,23.73],'淮安':[119.15,33.5],'泰州':[119.9,32.49],'南宁':[108.33,22.84],'营口':[122.18,40.65],'惠州':[114.4,23.09],'江阴':[120.26,31.91],'蓬莱':[120.75,37.8],'韶关':[113.62,24.84],'嘉峪关':[98.289152,39.77313],'广州':[113.23,23.16],'延安':[109.47,36.6],'太原':[112.53,37.87],'清远':[113.01,23.7],'中山':[113.38,22.52],'昆明':[102.73,25.04],'寿光':[118.73,36.86],'盘锦':[122.070714,41.119997],'长治':[113.08,36.18],'深圳':[114.07,22.62],'珠海':[113.52,22.3],'宿迁':[118.3,33.96],'咸阳':[108.72,34.36],'铜川':[109.11,35.09],'平度':[119.97,36.77],'佛山':[113.11,23.05],'海口':[110.35,20.02],'江门':[113.06,22.61],'章丘':[117.53,36.72],'肇庆':[112.44,23.05],'大连':[121.62,38.92],'临汾':[111.5,36.08],'吴江':[120.63,31.16],'石嘴山':[106.39,39.04],'沈阳':[123.38,41.8],'苏州':[120.62,31.32],'茂名':[110.88,21.68],'嘉兴':[120.76,30.77],'长春':[125.35,43.88],'胶州':[120.03336,36.264622],'银川':[106.27,38.47],'张家港':[120.555821,31.875428],'三门峡':[111.19,34.76],'锦州':[121.15,41.13],'南昌':[115.89,28.68],'柳州':[109.4,24.33],'三亚':[109.511909,18.252847],'自贡':[104.778442,29.33903],'吉林':[126.57,43.87],'阳江':[111.95,21.85],'泸州':[105.39,28.91],'西宁':[101.74,36.56],'宜宾':[104.56,29.77],'呼和浩特':[111.65,40.82],'成都':[104.06,30.67],'大同':[113.3,40.12],'镇江':[119.44,32.2],'桂林':[110.28,25.29],'张家界':[110.479191,29.117096],'宜兴':[119.82,31.36],'北海':[109.12,21.49],'西安':[108.95,34.27],'金坛':[119.56,31.74],'东营':[118.49,37.46],'牡丹江':[129.58,44.6],'遵义':[106.9,27.7],'绍兴':[120.58,30.01],'扬州':[119.42,32.39],'常州':[119.95,31.79],'潍坊':[119.1,36.62],'重庆':[106.54,29.59],'台州':[121.420757,28.656386],'南京':[118.78,32.04],'滨州':[118.03,37.36],'贵阳':[106.71,26.57],'无锡':[120.29,31.59],'本溪':[123.73,41.3],'克拉玛依':[84.77,45.59],'渭南':[109.5,34.52],'马鞍山':[118.48,31.56],'宝鸡':[107.15,34.38],'焦作':[113.21,35.24],'句容':[119.16,31.95],'北京':[116.46,39.92],'徐州':[117.2,34.26],'衡水':[115.72,37.72],'包头':[110,40.58],'绵阳':[104.73,31.48],'乌鲁木齐':[87.68,43.77],'枣庄':[117.57,34.86],'杭州':[120.19,30.26],'淄博':[118.05,36.78],'鞍山':[122.85,41.12],'溧阳':[119.48,31.43],'库尔勒':[86.06,41.68],'安阳':[114.35,36.1],'开封':[114.35,34.79],'济南':[117,36.65],'德阳':[104.37,31.13],'温州':[120.65,28.01],'九江':[115.97,29.71],'邯郸':[114.47,36.6],'临安':[119.72,30.23],'兰州':[103.73,36.03],'沧州':[116.83,38.33],'临沂':[118.35,35.05],'南充':[106.110698,30.837793],'天津':[117.2,39.13],'富阳':[119.95,30.07],'泰安':[117.13,36.18],'诸暨':[120.23,29.71],'郑州':[113.65,34.76],'哈尔滨':[126.63,45.75],'聊城':[115.97,36.45],'芜湖':[118.38,31.33],'唐山':[118.02,39.63],'平顶山':[113.29,33.75],'邢台':[114.48,37.05],'德州':[116.29,37.45],'济宁':[116.59,35.38],'荆州':[112.239741,30.335165],'宜昌':[111.3,30.7],'义乌':[120.06,29.32],'丽水':[119.92,28.45],'洛阳':[112.44,34.7],'秦皇岛':[119.57,39.95],'株洲':[113.16,27.83],'石家庄':[114.48,38.03],'莱芜':[117.67,36.19],'常德':[111.69,29.05],'保定':[115.48,38.85],'湘潭':[112.91,27.87],'金华':[119.64,29.12],'岳阳':[113.09,29.37],'长沙':[113,28.21],'衢州':[118.88,28.97],'廊坊':[116.7,39.53],'菏泽':[115.480656,35.23375],'合肥':[117.27,31.86],'武汉':[114.31,30.52],'大庆':[125.03,46.58]};
citys = list(geoCoordMap.keys())
print(citys)

创建 city 列

创建city列,如果area里包含这些城市,就返回这些城市;如果只有省份而无具体城市信息的,则返回'pro'(其中:'北京', '天津', '上海', '重庆'这些感觉也能算法城市里,纠结...),其中;如果是包含海外国家的则返回'unchina';剩下的返回'unknown'

def get_city(area):
    citys = ['海门', '鄂尔多斯', '招远', '舟山', '齐齐哈尔', '盐城', '赤峰', '青岛', '乳山', '金昌', '泉州', '莱西', '日照', '胶南', '南通', '拉萨', '云浮', '梅州', '文登', '上海', '攀枝花', '威海', '承德', '厦门', '汕尾', '潮州', '丹东', '太仓', '曲靖', '烟台', '福州', '瓦房店', '即墨', '抚顺', '玉溪', '张家口', '阳泉', '莱州', '湖州', '汕头', '昆山', '宁波', '湛江', '揭阳', '荣成', '连云港', '葫芦岛', '常熟', '东莞', '河源', '淮安', '泰州', '南宁', '营口', '惠州', '江阴', '蓬莱', '韶关', '嘉峪关', '广州', '延安', '太原', '清远', '中山', '昆明', '寿光', '盘锦', '长治', '深圳', '珠海', '宿迁', '咸阳', '铜川', '平度', '佛山', '海口', '江门', '章丘', '肇庆', '大连', '临汾', '吴江', '石嘴山', '沈阳', '苏州', '茂名', '嘉兴', '长春', '胶州', '银川', '张家港', '三门峡', '锦州', '南昌', '柳州', '三亚', '自贡', '吉林', '阳江', '泸州', '西宁', '宜宾', '呼和浩特', '成都', '大同', '镇江', '桂林', '张家界', '宜兴', '北海', '西安', '金坛', '东营', '牡丹江', '遵义', '绍兴', '扬州', '常州', '潍坊', '重庆', '台州', '南京', '滨州', '贵阳', '无锡', '本溪', '克拉玛依', '渭南', '马鞍山', '宝鸡', '焦作', '句容', '北京', '徐州', '衡水', '包头', '绵阳', '乌鲁木齐', '枣庄', '杭州', '淄博', '鞍山', '溧阳', '库尔勒', '安阳', '开封', '济南', '德阳', '温州', '九江', '邯郸', '临安', '兰州', '沧州', '临沂', '南充', '天津', '富阳', '泰安', '诸暨', '郑州', '哈尔滨', '聊城', '芜湖', '唐山', '平顶山', '邢台', '德州', '济宁', '荆州', '宜昌', '义乌', '丽水', '洛阳', '秦皇岛', '株洲', '石家庄', '莱芜', '常德', '保定', '湘潭', '金华', '岳阳', '长沙', '衢州', '廊坊', '菏泽', '合肥', '武汉', '大庆']
    prolist_less = [ '河北', '山西', '辽宁', '吉林', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '广西', '西藏', '宁夏', '新疆', '香港', '澳门', '台湾', '内蒙古', '黑龙江']
    # 此处 prolist_less 个人喜欢,所以不包含:'北京', '天津', '上海', '重庆' ...
    unchinas = ['英国','美国','日本','瑞士','法国','瑞典','越南','泰国','意大利','加拿大','菲律宾','新加坡','新西兰','伊拉克','爱尔兰','安哥拉','澳大利亚', '大韩民国', '马来西亚']
    for city in citys:
        if city in area:
            return city
    for pro in prolist_less:
        if pro == area:
            return "pro"
    for unchina in unchinas:
        if unchina in area:
            return "unchina"
    return "unknown"
df['city'] = df.area.apply(get_city)
df[['area','city']]


查看所有 unknown 的地理信息

df_unknown = df[['area','city']][df['city']=='unknown']
print(df_unknown.shape)
unknown_city = list(set(df_unknown.area.values.tolist()))
print(len(unknown_city),unknown_city)

以下这些是,即非海外,也不是省份,而且不包含 ECharts 那些城市。但几乎都是省份+城市的格式,所以提取城市比较方便。


遍历unknown_city,并去掉省份的前缀,然后加到unkwns列表中:

prolist_less = [ '河北', '山西', '辽宁', '吉林', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '广西', '西藏', '宁夏', '新疆', '香港', '澳门', '内蒙古', '黑龙江']
unkwns = []
others = []
for unkwn in unknown_city:
    for pro in prolist_less:
        if pro in unkwn: #  '青海海南藏族自治州'
            unkwn = unkwn.replace(pro, '')
            unkwns.append(unkwn)
    if unkwn not in unkwns:
        others.append(unkwn)
print(len(unkwns))
print(unkwns) # '青海藏族自治州', '藏族自治州'
print(len(others))
print(others)

汇总所有城市

unkwns里面含有xxx自治州的都手动去掉后缀,然后将unkwnscitys合并到一起,all_citys就是我们要统计和进行地图可视化的所有城市数据了。以上就是完成了城市数据的提取,读者可自行按照自己的思路去实现,不必局限于我的方法。

citys = ['海门', '鄂尔多斯', '招远', '舟山', '齐齐哈尔', '盐城', '赤峰', '青岛', '乳山', '金昌', '泉州', '莱西', '日照', '胶南', '南通', '拉萨', '云浮', '梅州', '文登', '上海', '攀枝花', '威海', '承德', '厦门', '汕尾', '潮州', '丹东', '太仓', '曲靖', '烟台', '福州', '瓦房店', '即墨', '抚顺', '玉溪', '张家口', '阳泉', '莱州', '湖州', '汕头', '昆山', '宁波', '湛江', '揭阳', '荣成', '连云港', '葫芦岛', '常熟', '东莞', '河源', '淮安', '泰州', '南宁', '营口', '惠州', '江阴', '蓬莱', '韶关', '嘉峪关', '广州', '延安', '太原', '清远', '中山', '昆明', '寿光', '盘锦', '长治', '深圳', '珠海', '宿迁', '咸阳', '铜川', '平度', '佛山', '海口', '江门', '章丘', '肇庆', '大连', '临汾', '吴江', '石嘴山', '沈阳', '苏州', '茂名', '嘉兴', '长春', '胶州', '银川', '张家港', '三门峡', '锦州', '南昌', '柳州', '三亚', '自贡', '吉林', '阳江', '泸州', '西宁', '宜宾', '呼和浩特', '成都', '大同', '镇江', '桂林', '张家界', '宜兴', '北海', '西安', '金坛', '东营', '牡丹江', '遵义', '绍兴', '扬州', '常州', '潍坊', '重庆', '台州', '南京', '滨州', '贵阳', '无锡', '本溪', '克拉玛依', '渭南', '马鞍山', '宝鸡', '焦作', '句容', '北京', '徐州', '衡水', '包头', '绵阳', '乌鲁木齐', '枣庄', '杭州', '淄博', '鞍山', '溧阳', '库尔勒', '安阳', '开封', '济南', '德阳', '温州', '九江', '邯郸', '临安', '兰州', '沧州', '临沂', '南充', '天津', '富阳', '泰安', '诸暨', '郑州', '哈尔滨', '聊城', '芜湖', '唐山', '平顶山', '邢台', '德州', '济宁', '荆州', '宜昌', '义乌', '丽水', '洛阳', '秦皇岛', '株洲', '石家庄', '莱芜', '常德', '保定', '湘潭', '金华', '岳阳', '长沙', '衢州', '廊坊', '菏泽', '合肥', '武汉', '大庆']
unkwns = ['眉山', '漯河', '滁州', '景德镇', '随州', '遂宁', '三明', '乌兰察布', '吕梁', '莆田', '河池', '定西', '信阳', '阜新', '广元', '汉中', '辽阳', '邵阳', '萍乡', '晋中', '商洛', '乐山', '石河子', '白银', '池州', '内江', '恩施', '益阳', '伊犁', '张掖', '运城', '绥化', '崇左', '南阳', '达州', '海东', '伊春', '黄石', '龙岩', '蚌埠', '上饶', '驻马店', '保山', '呼伦贝尔', '安庆', '淮北', '周口', '孝感', '临沧', '固原', '钦州', '漳州', '巴音郭楞', '宜春', '朝阳', '鹰潭', '娄底', '雅安', '青海', '怀化', '郴州', '许昌', '红河', '赣州', '朔州', '普洱', '吴忠', '新乡', '资阳', '鸡西', '昌吉', '荆门', '六安', '黄山', '商丘', '武威', '抚州', '湘西', '怒江', '铁岭', '百色', '淮南', '广安', '铜陵', '濮阳', '天水', '襄阳', '南平', '阜阳', '鹤壁', '塔城', '宁德', '大理', '梧州', '衡阳', '晋城', '昭通', '黄冈', '永州', '毕节', '通辽', '玉林', '兴安盟', '咸宁']
all_citys = citys + unkwns

更新 city 列

更新下数据里的city列,含有这些城市的就返回对应城市,否则不论国外还是省份都统一用others表示:

def get_city(area):
    all_citys = ['海门', '鄂尔多斯', '招远', '舟山', '齐齐哈尔', '盐城', '赤峰', '青岛', '乳山', '金昌', '泉州', '莱西', 
                 '日照', '胶南', '南通', '拉萨', '云浮', '梅州', '文登', '上海', '攀枝花', '威海', '承德', '厦门', '汕尾', 
                 '潮州', '丹东', '太仓', '曲靖', '烟台', '福州', '瓦房店', '即墨', '抚顺', '玉溪', '张家口', '阳泉', '莱州',
                 '湖州', '汕头', '昆山', '宁波', '湛江', '揭阳', '荣成', '连云港', '葫芦岛', '常熟', '东莞', '河源', '淮安', 
                 '泰州', '南宁', '营口', '惠州', '江阴', '蓬莱', '韶关', '嘉峪关', '广州', '延安', '太原', '清远', '中山', 
                 '昆明', '寿光', '盘锦', '长治', '深圳', '珠海', '宿迁', '咸阳', '铜川', '平度', '佛山', '海口', '江门', 
                 '章丘', '肇庆', '大连', '临汾', '吴江', '石嘴山', '沈阳', '苏州', '茂名', '嘉兴', '长春', '胶州', '银川', 
                 '张家港', '三门峡', '锦州', '南昌', '柳州', '三亚', '自贡', '吉林', '阳江', '泸州', '西宁', '宜宾',
                 '呼和浩特', '成都', '大同', '镇江', '桂林', '张家界', '宜兴', '北海', '西安', '金坛', '东营', '牡丹江', 
                 '遵义', '绍兴', '扬州', '常州', '潍坊', '重庆', '台州', '南京', '滨州', '贵阳', '无锡', '本溪', '克拉玛依', 
                 '渭南', '马鞍山', '宝鸡', '焦作', '句容', '北京', '徐州', '衡水', '包头', '绵阳', '乌鲁木齐', '枣庄', 
                 '杭州', '淄博', '鞍山', '溧阳', '库尔勒', '安阳', '开封', '济南', '德阳', '温州', '九江', '邯郸', '临安', 
                 '兰州', '沧州', '临沂', '南充', '天津', '富阳', '泰安', '诸暨', '郑州', '哈尔滨', '聊城', '芜湖', '唐山', 
                 '平顶山', '邢台', '德州', '济宁', '荆州', '宜昌', '义乌', '丽水', '洛阳', '秦皇岛', '株洲', '石家庄', 
                 '莱芜', '常德', '保定', '湘潭', '金华', '岳阳', '长沙', '衢州', '廊坊', '菏泽', '合肥', '武汉', '大庆', 
                 '眉山', '漯河', '滁州', '景德镇', '随州', '遂宁', '三明', '乌兰察布', '吕梁', '莆田', '河池', '定西', 
                 '信阳', '阜新', '广元', '汉中', '辽阳', '邵阳', '萍乡', '晋中', '商洛', '乐山', '石河子', '白银', '池州', 
                 '内江', '恩施', '益阳', '伊犁', '张掖', '运城', '绥化', '崇左', '南阳', '达州', '海东', '伊春', '黄石', 
                 '龙岩', '蚌埠', '上饶', '驻马店', '保山', '呼伦贝尔', '安庆', '淮北', '周口', '孝感', '临沧', '固原', '钦州', 
                 '漳州', '巴音郭楞', '宜春', '朝阳', '鹰潭', '娄底', '雅安', '青海', '怀化', '郴州', '许昌', '红河', '赣州', 
                 '朔州', '普洱', '吴忠', '新乡', '资阳', '鸡西', '昌吉', '荆门', '六安', '黄山', '商丘', '武威', '抚州', 
                 '湘西', '怒江', '铁岭', '百色', '淮南', '广安', '铜陵', '濮阳', '天水', '襄阳', '南平', '阜阳', '鹤壁', 
                 '塔城', '宁德', '大理', '梧州', '衡阳', '晋城', '昭通', '黄冈', '永州', '毕节', '通辽', '玉林', '兴安盟', 
                 '咸宁']
    for city in all_citys:
        if city in area:
            return city
    return "other"
df['city'] = df.area.apply(get_city)
df[['area','city']]

城市分布

city_count = df.groupby('city')['city'].count().sort_values(ascending=False)
city_count

城市分布情况之柱形图:

from pyecharts import Bar
#bar.use_theme("macarons")
bar = Bar("城市分布")
bar.add("城市", city_count.index[:30], city_count.values[:30],is_label_show=True,xaxis_interval=0,xaxis_rotate=-45)
bar

组合成元组,方便后面地图可视化时传入数据:

city_data = list(zip(city_count.index, city_count.values))
city_data

城市分布地图异常

from pyecharts import Geo

geo = Geo("城市分布情况", "data from SinaNews", title_color="#fff",
          title_pos="center", width=800,
          height=600, background_color='#404a59')
attr, value = geo.cast(city_data)
geo.add("城市分布情况", attr, value, visual_range=[0, 360], visual_text_color="#fff",
        symbol_size=10, is_visualmap=True)
geo

一些城市的经纬度数据没有内置到地图里:


报错信息说明 pyecharts 里没有other的经纬度信息。

创建nocoor_list列表,用于存储所有报错的城市,反复运行下面两个 cell 的代码,根据地图报错提醒,不断添加城市到nocoor_list列表中,就能得到全部的无经纬度的城市。并将剩下没报错的都存储到city_data 列表中。

city_data = []
nocoor_list = [
    'other','青海','达州','崇左','巴音郭楞','普洱','池州','湘西','伊犁','乌兰察布','临沧','海东','眉山',
    '怒江','固原','广安'
             ]
for item in zip(city_count.index, city_count.values):
    if item[0] in nocoor_list:
        continue  # 跳出循环:即遇到不存在经纬度的城市就跳过,不用存储到 city_data 里
    city_data.append(item)
city_data

pyecharts 之城市分布地图

顺利绘制出城市分布地图。

大家一定要自己梳理下整个城市提取和可视化的过程。最开始也是古柳根据以往实践的经验,在不知道 pyecharts 都支持哪些城市(可自行搜索看看有没有官方说明)的情况下,选择去官网复制了那一堆城市数据,然后一步步完成了下来,相对比较顺利。

from pyecharts import Geo
geo = Geo("城市分布情况", "data from SinaNews", title_color="#fff",
          title_pos="center", width=800,
          height=600, background_color='#404a59')
attr, value = geo.cast(city_data)
geo.add("", attr, value, visual_range=[0, 360], visual_text_color="#fff",
        symbol_size=10, is_visualmap=True)
geo

小结

篇幅所限,后面动态地图可视化内容放到下一篇文章里。先给点提醒用的是WEB 服务API - 百度地图获取area列地理位置的经纬度(经过之前文章的学习,想象大家已经能够轻松自如的实现这些步骤了),然后导出包含经纬度两列的完整数据到 csv,再根据(送福利)BDP绘制微博转发动态热力图一文,轻松实现预期效果。

本系列项目将全面涉及从爬虫、数据提取与准备、数据异常发现与清洗、分析与可视化等细节,并将代码统一开源在GitHub:DesertsX/gulius-projects ,感兴趣的朋友可以先行 star 哈。

本系列文章:
“中国年轻人正带领国家走向危机”,这锅背是不背?
手把手教你完成一个数据科学小项目(1):数据爬取
手把手教你完成一个数据科学小项目(2):数据提取、IP 查询
手把手教你完成一个数据科学小项目(3):数据异常与清洗
手把手教你完成一个数据科学小项目(4):评论数变化情况
手把手教你完成一个数据科学小项目(5):省份提取与可视化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容