手把手教你完成一個(gè)數(shù)據(jù)科學(xué)小項(xiàng)目(6):城市提取與可視化

前言

請(qǐng)先閱讀《“中國(guó)年輕人正帶領(lǐng)國(guó)家走向危機(jī)”,這鍋背是不背? 》 一文,以對(duì)“手把手教你完成一個(gè)數(shù)據(jù)科學(xué)小項(xiàng)目”系列有個(gè)全局性的了解。

代碼統(tǒng)一開(kāi)源在 GitHub:DesertsX/gulius-projects ,感興趣的朋友可以先行 star 哈。

截至目前我們已經(jīng)完成了數(shù)據(jù)爬取、數(shù)據(jù)提取與IP查詢、數(shù)據(jù)異常與清洗、評(píng)論數(shù)變化情況分析、省份提取與可視化,本文將提取城市數(shù)據(jù),并用 pyecharts 完成地圖可視化。

讀取數(shù)據(jù)

前面幾步都在上一篇文章里講過(guò)了,因?yàn)闋砍对S多相關(guān)的操作,所以很快的過(guò)一遍。

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

統(tǒng)計(jì) 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)

數(shù)據(jù)處理思路

首先再次明確下這次的目的是提取出省份和城市信息,且由于數(shù)據(jù)量不大,所以后續(xù)只在中國(guó)地圖上進(jìn)行可視化,因而海外地理信息統(tǒng)一可以篩選出去,實(shí)現(xiàn)的方式是按照國(guó)家名手動(dòng)構(gòu)建一個(gè)unchina的列表,用來(lái)存儲(chǔ)本次數(shù)據(jù)里出現(xiàn)的海外國(guó)家,然后遍歷所有的337條area_name元素,包含這些國(guó)家名的就添加到drop列表里,然后根據(jù)其他國(guó)內(nèi)的地理信息的長(zhǎng)度分別打印出來(lái),這樣數(shù)據(jù)就清晰多了!過(guò)程中可能有些會(huì)被誤分,需要核查一遍。

area_len_2 = []
area_len_3 = []
area_len_4 = []
area_len_5 = []
unchina = ['英國(guó)','美國(guó)','日本','瑞士','法國(guó)','瑞典','越南','泰國(guó)',
           '意大利','加拿大','菲律賓','新加坡','新西蘭','伊拉克','愛(ài)爾蘭','安哥拉',
           '澳大利亞', '大韓民國(guó)', '馬來(lái)西亞']
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) # 我國(guó)共有34個(gè)省級(jí)行政區(qū)域,包括23個(gè)省,5個(gè)自治區(qū),4個(gè)直轄市,2個(gè)特別行政區(qū)。
    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)

省份匯總

根據(jù)百度百科詞條里的內(nèi)容:省份 - 百科我國(guó)共有34個(gè)省級(jí)行政區(qū)域,包括23個(gè)省,5個(gè)自治區(qū),4個(gè)直轄市,2個(gè)特別行政區(qū)。

復(fù)制過(guò)來(lái)所有省份,先手動(dòng)去掉自治區(qū)和行政區(qū)的后綴文字,再用代碼去掉無(wú)關(guān)的文字與字符。

prolist = '北京市,天津市,上海市,重慶市,河北省,山西省,遼寧省,吉林省,江蘇省,浙江省,安徽省,福建省,\
江西省,山東省,河南省,湖北省,湖南省,廣東省,海南省,四川省,貴州省,云南省,陜西省,甘肅省,\
青海省,臺(tái)灣省,廣西,西藏,寧夏,新疆,香港,澳門,內(nèi)蒙古,黑龍江省'
prolist = prolist.replace('市', '').replace('省', '').split(',')
print(len(prolist), prolist)

34個(gè)省份

['北京', '天津', '上海', '重慶', '河北', '山西', '遼寧', '吉林', '江蘇', '浙江', '安徽', '福建', '江西', '山東', '河南', '湖北', '湖南', '廣東', '海南', '四川', '貴州', '云南', '陜西', '甘肅', '青海', '臺(tái)灣', '廣西', '西藏', '寧夏', '新疆', '香港', '澳門', '內(nèi)蒙古', '黑龍江']

城市提取

上面相關(guān)代碼過(guò)一遍后,接下來(lái)就是本文的重點(diǎn),提取城市數(shù)據(jù)并進(jìn)行可視化了。

根據(jù)以前的經(jīng)驗(yàn)可知,個(gè)別點(diǎn)的經(jīng)緯度數(shù)據(jù)可能沒(méi)有內(nèi)置,所以調(diào)用地圖時(shí),會(huì)無(wú)法顯示并報(bào)錯(cuò)。所以先要確定哪些數(shù)據(jù)可用,哪些不可用,但到底 ECharts 或 pyecharts 里內(nèi)置了哪些數(shù)據(jù)目前還沒(méi)了解過(guò)。望知曉的朋友可以告知。

本次采取的方式是:從 ECharts 官網(wǎng)的effectScatter-bmap示例中提取出城市列表,便于篩選。當(dāng)然事先并不知道這里的數(shù)據(jù)和本次評(píng)論的數(shù)據(jù)的匹配度多高,只能“實(shí)踐出真知”。

geoCoordMap = {'海門':[121.15,31.89],'鄂爾多斯':[109.781327,39.608266],'招遠(yuǎn)':[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],'太倉(cāng)':[121.1,31.45],'曲靖':[103.79,25.51],'煙臺(tái)':[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],'陽(yáng)泉':[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],'揭陽(yáng)':[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],'營(yíng)口':[122.18,40.65],'惠州':[114.4,23.09],'江陰':[120.26,31.91],'蓬萊':[120.75,37.8],'韶關(guān)':[113.62,24.84],'嘉峪關(guān)':[98.289152,39.77313],'廣州':[113.23,23.16],'延安':[109.47,36.6],'太原':[112.53,37.87],'清遠(yuǎn)':[113.01,23.7],'中山':[113.38,22.52],'昆明':[102.73,25.04],'壽光':[118.73,36.86],'盤(pán)錦':[122.070714,41.119997],'長(zhǎng)治':[113.08,36.18],'深圳':[114.07,22.62],'珠海':[113.52,22.3],'宿遷':[118.3,33.96],'咸陽(yáng)':[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],'沈陽(yáng)':[123.38,41.8],'蘇州':[120.62,31.32],'茂名':[110.88,21.68],'嘉興':[120.76,30.77],'長(zhǎng)春':[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],'陽(yáng)江':[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],'鎮(zhèn)江':[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],'東營(yíng)':[118.49,37.46],'牡丹江':[129.58,44.6],'遵義':[106.9,27.7],'紹興':[120.58,30.01],'揚(yáng)州':[119.42,32.39],'常州':[119.95,31.79],'濰坊':[119.1,36.62],'重慶':[106.54,29.59],'臺(tái)州':[121.420757,28.656386],'南京':[118.78,32.04],'濱州':[118.03,37.36],'貴陽(yáng)':[106.71,26.57],'無(wú)錫':[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],'綿陽(yáng)':[104.73,31.48],'烏魯木齊':[87.68,43.77],'棗莊':[117.57,34.86],'杭州':[120.19,30.26],'淄博':[118.05,36.78],'鞍山':[122.85,41.12],'溧陽(yáng)':[119.48,31.43],'庫(kù)爾勒':[86.06,41.68],'安陽(yáng)':[114.35,36.1],'開(kāi)封':[114.35,34.79],'濟(jì)南':[117,36.65],'德陽(yáng)':[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],'富陽(yáng)':[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],'邢臺(tái)':[114.48,37.05],'德州':[116.29,37.45],'濟(jì)寧':[116.59,35.38],'荊州':[112.239741,30.335165],'宜昌':[111.3,30.7],'義烏':[120.06,29.32],'麗水':[119.92,28.45],'洛陽(yáng)':[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],'岳陽(yáng)':[113.09,29.37],'長(zhǎng)沙':[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)

創(chuàng)建 city 列

創(chuàng)建city列,如果area里包含這些城市,就返回這些城市;如果只有省份而無(wú)具體城市信息的,則返回'pro'(其中:'北京', '天津', '上海', '重慶'這些感覺(jué)也能算法城市里,糾結(jié)...),其中;如果是包含海外國(guó)家的則返回'unchina';剩下的返回'unknown'

def get_city(area):
    citys = ['海門', '鄂爾多斯', '招遠(yuǎn)', '舟山', '齊齊哈爾', '鹽城', '赤峰', '青島', '乳山', '金昌', '泉州', '萊西', '日照', '膠南', '南通', '拉薩', '云浮', '梅州', '文登', '上海', '攀枝花', '威海', '承德', '廈門', '汕尾', '潮州', '丹東', '太倉(cāng)', '曲靖', '煙臺(tái)', '福州', '瓦房店', '即墨', '撫順', '玉溪', '張家口', '陽(yáng)泉', '萊州', '湖州', '汕頭', '昆山', '寧波', '湛江', '揭陽(yáng)', '榮成', '連云港', '葫蘆島', '常熟', '東莞', '河源', '淮安', '泰州', '南寧', '營(yíng)口', '惠州', '江陰', '蓬萊', '韶關(guān)', '嘉峪關(guān)', '廣州', '延安', '太原', '清遠(yuǎn)', '中山', '昆明', '壽光', '盤(pán)錦', '長(zhǎng)治', '深圳', '珠海', '宿遷', '咸陽(yáng)', '銅川', '平度', '佛山', '海口', '江門', '章丘', '肇慶', '大連', '臨汾', '吳江', '石嘴山', '沈陽(yáng)', '蘇州', '茂名', '嘉興', '長(zhǎng)春', '膠州', '銀川', '張家港', '三門峽', '錦州', '南昌', '柳州', '三亞', '自貢', '吉林', '陽(yáng)江', '瀘州', '西寧', '宜賓', '呼和浩特', '成都', '大同', '鎮(zhèn)江', '桂林', '張家界', '宜興', '北海', '西安', '金壇', '東營(yíng)', '牡丹江', '遵義', '紹興', '揚(yáng)州', '常州', '濰坊', '重慶', '臺(tái)州', '南京', '濱州', '貴陽(yáng)', '無(wú)錫', '本溪', '克拉瑪依', '渭南', '馬鞍山', '寶雞', '焦作', '句容', '北京', '徐州', '衡水', '包頭', '綿陽(yáng)', '烏魯木齊', '棗莊', '杭州', '淄博', '鞍山', '溧陽(yáng)', '庫(kù)爾勒', '安陽(yáng)', '開(kāi)封', '濟(jì)南', '德陽(yáng)', '溫州', '九江', '邯鄲', '臨安', '蘭州', '滄州', '臨沂', '南充', '天津', '富陽(yáng)', '泰安', '諸暨', '鄭州', '哈爾濱', '聊城', '蕪湖', '唐山', '平頂山', '邢臺(tái)', '德州', '濟(jì)寧', '荊州', '宜昌', '義烏', '麗水', '洛陽(yáng)', '秦皇島', '株洲', '石家莊', '萊蕪', '常德', '保定', '湘潭', '金華', '岳陽(yáng)', '長(zhǎng)沙', '衢州', '廊坊', '菏澤', '合肥', '武漢', '大慶']
    prolist_less = [ '河北', '山西', '遼寧', '吉林', '江蘇', '浙江', '安徽', '福建', '江西', '山東', '河南', '湖北', '湖南', '廣東', '海南', '四川', '貴州', '云南', '陜西', '甘肅', '青海', '廣西', '西藏', '寧夏', '新疆', '香港', '澳門', '臺(tái)灣', '內(nèi)蒙古', '黑龍江']
    # 此處 prolist_less 個(gè)人喜歡,所以不包含:'北京', '天津', '上海', '重慶' ...
    unchinas = ['英國(guó)','美國(guó)','日本','瑞士','法國(guó)','瑞典','越南','泰國(guó)','意大利','加拿大','菲律賓','新加坡','新西蘭','伊拉克','愛(ài)爾蘭','安哥拉','澳大利亞', '大韓民國(guó)', '馬來(lái)西亞']
    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 = [ '河北', '山西', '遼寧', '吉林', '江蘇', '浙江', '安徽', '福建', '江西', '山東', '河南', '湖北', '湖南', '廣東', '海南', '四川', '貴州', '云南', '陜西', '甘肅', '青海', '廣西', '西藏', '寧夏', '新疆', '香港', '澳門', '內(nèi)蒙古', '黑龍江']
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自治州的都手動(dòng)去掉后綴,然后將unkwnscitys合并到一起,all_citys就是我們要統(tǒng)計(jì)和進(jìn)行地圖可視化的所有城市數(shù)據(jù)了。以上就是完成了城市數(shù)據(jù)的提取,讀者可自行按照自己的思路去實(shí)現(xiàn),不必局限于我的方法。

citys = ['海門', '鄂爾多斯', '招遠(yuǎn)', '舟山', '齊齊哈爾', '鹽城', '赤峰', '青島', '乳山', '金昌', '泉州', '萊西', '日照', '膠南', '南通', '拉薩', '云浮', '梅州', '文登', '上海', '攀枝花', '威海', '承德', '廈門', '汕尾', '潮州', '丹東', '太倉(cāng)', '曲靖', '煙臺(tái)', '福州', '瓦房店', '即墨', '撫順', '玉溪', '張家口', '陽(yáng)泉', '萊州', '湖州', '汕頭', '昆山', '寧波', '湛江', '揭陽(yáng)', '榮成', '連云港', '葫蘆島', '常熟', '東莞', '河源', '淮安', '泰州', '南寧', '營(yíng)口', '惠州', '江陰', '蓬萊', '韶關(guān)', '嘉峪關(guān)', '廣州', '延安', '太原', '清遠(yuǎn)', '中山', '昆明', '壽光', '盤(pán)錦', '長(zhǎng)治', '深圳', '珠海', '宿遷', '咸陽(yáng)', '銅川', '平度', '佛山', '???, '江門', '章丘', '肇慶', '大連', '臨汾', '吳江', '石嘴山', '沈陽(yáng)', '蘇州', '茂名', '嘉興', '長(zhǎng)春', '膠州', '銀川', '張家港', '三門峽', '錦州', '南昌', '柳州', '三亞', '自貢', '吉林', '陽(yáng)江', '瀘州', '西寧', '宜賓', '呼和浩特', '成都', '大同', '鎮(zhèn)江', '桂林', '張家界', '宜興', '北海', '西安', '金壇', '東營(yíng)', '牡丹江', '遵義', '紹興', '揚(yáng)州', '常州', '濰坊', '重慶', '臺(tái)州', '南京', '濱州', '貴陽(yáng)', '無(wú)錫', '本溪', '克拉瑪依', '渭南', '馬鞍山', '寶雞', '焦作', '句容', '北京', '徐州', '衡水', '包頭', '綿陽(yáng)', '烏魯木齊', '棗莊', '杭州', '淄博', '鞍山', '溧陽(yáng)', '庫(kù)爾勒', '安陽(yáng)', '開(kāi)封', '濟(jì)南', '德陽(yáng)', '溫州', '九江', '邯鄲', '臨安', '蘭州', '滄州', '臨沂', '南充', '天津', '富陽(yáng)', '泰安', '諸暨', '鄭州', '哈爾濱', '聊城', '蕪湖', '唐山', '平頂山', '邢臺(tái)', '德州', '濟(jì)寧', '荊州', '宜昌', '義烏', '麗水', '洛陽(yáng)', '秦皇島', '株洲', '石家莊', '萊蕪', '常德', '保定', '湘潭', '金華', '岳陽(yáng)', '長(zhǎng)沙', '衢州', '廊坊', '菏澤', '合肥', '武漢', '大慶']
unkwns = ['眉山', '漯河', '滁州', '景德鎮(zhèn)', '隨州', '遂寧', '三明', '烏蘭察布', '呂梁', '莆田', '河池', '定西', '信陽(yáng)', '阜新', '廣元', '漢中', '遼陽(yáng)', '邵陽(yáng)', '萍鄉(xiāng)', '晉中', '商洛', '樂(lè)山', '石河子', '白銀', '池州', '內(nèi)江', '恩施', '益陽(yáng)', '伊犁', '張掖', '運(yùn)城', '綏化', '崇左', '南陽(yáng)', '達(dá)州', '海東', '伊春', '黃石', '龍巖', '蚌埠', '上饒', '駐馬店', '保山', '呼倫貝爾', '安慶', '淮北', '周口', '孝感', '臨滄', '固原', '欽州', '漳州', '巴音郭楞', '宜春', '朝陽(yáng)', '鷹潭', '婁底', '雅安', '青海', '懷化', '郴州', '許昌', '紅河', '贛州', '朔州', '普洱', '吳忠', '新鄉(xiāng)', '資陽(yáng)', '雞西', '昌吉', '荊門', '六安', '黃山', '商丘', '武威', '撫州', '湘西', '怒江', '鐵嶺', '百色', '淮南', '廣安', '銅陵', '濮陽(yáng)', '天水', '襄陽(yáng)', '南平', '阜陽(yáng)', '鶴壁', '塔城', '寧德', '大理', '梧州', '衡陽(yáng)', '晉城', '昭通', '黃岡', '永州', '畢節(jié)', '通遼', '玉林', '興安盟', '咸寧']
all_citys = citys + unkwns

更新 city 列

更新下數(shù)據(jù)里的city列,含有這些城市的就返回對(duì)應(yīng)城市,否則不論國(guó)外還是省份都統(tǒng)一用others表示:

def get_city(area):
    all_citys = ['海門', '鄂爾多斯', '招遠(yuǎn)', '舟山', '齊齊哈爾', '鹽城', '赤峰', '青島', '乳山', '金昌', '泉州', '萊西', 
                 '日照', '膠南', '南通', '拉薩', '云浮', '梅州', '文登', '上海', '攀枝花', '威海', '承德', '廈門', '汕尾', 
                 '潮州', '丹東', '太倉(cāng)', '曲靖', '煙臺(tái)', '福州', '瓦房店', '即墨', '撫順', '玉溪', '張家口', '陽(yáng)泉', '萊州',
                 '湖州', '汕頭', '昆山', '寧波', '湛江', '揭陽(yáng)', '榮成', '連云港', '葫蘆島', '常熟', '東莞', '河源', '淮安', 
                 '泰州', '南寧', '營(yíng)口', '惠州', '江陰', '蓬萊', '韶關(guān)', '嘉峪關(guān)', '廣州', '延安', '太原', '清遠(yuǎn)', '中山', 
                 '昆明', '壽光', '盤(pán)錦', '長(zhǎng)治', '深圳', '珠海', '宿遷', '咸陽(yáng)', '銅川', '平度', '佛山', '???, '江門', 
                 '章丘', '肇慶', '大連', '臨汾', '吳江', '石嘴山', '沈陽(yáng)', '蘇州', '茂名', '嘉興', '長(zhǎng)春', '膠州', '銀川', 
                 '張家港', '三門峽', '錦州', '南昌', '柳州', '三亞', '自貢', '吉林', '陽(yáng)江', '瀘州', '西寧', '宜賓',
                 '呼和浩特', '成都', '大同', '鎮(zhèn)江', '桂林', '張家界', '宜興', '北海', '西安', '金壇', '東營(yíng)', '牡丹江', 
                 '遵義', '紹興', '揚(yáng)州', '常州', '濰坊', '重慶', '臺(tái)州', '南京', '濱州', '貴陽(yáng)', '無(wú)錫', '本溪', '克拉瑪依', 
                 '渭南', '馬鞍山', '寶雞', '焦作', '句容', '北京', '徐州', '衡水', '包頭', '綿陽(yáng)', '烏魯木齊', '棗莊', 
                 '杭州', '淄博', '鞍山', '溧陽(yáng)', '庫(kù)爾勒', '安陽(yáng)', '開(kāi)封', '濟(jì)南', '德陽(yáng)', '溫州', '九江', '邯鄲', '臨安', 
                 '蘭州', '滄州', '臨沂', '南充', '天津', '富陽(yáng)', '泰安', '諸暨', '鄭州', '哈爾濱', '聊城', '蕪湖', '唐山', 
                 '平頂山', '邢臺(tái)', '德州', '濟(jì)寧', '荊州', '宜昌', '義烏', '麗水', '洛陽(yáng)', '秦皇島', '株洲', '石家莊', 
                 '萊蕪', '常德', '保定', '湘潭', '金華', '岳陽(yáng)', '長(zhǎng)沙', '衢州', '廊坊', '菏澤', '合肥', '武漢', '大慶', 
                 '眉山', '漯河', '滁州', '景德鎮(zhèn)', '隨州', '遂寧', '三明', '烏蘭察布', '呂梁', '莆田', '河池', '定西', 
                 '信陽(yáng)', '阜新', '廣元', '漢中', '遼陽(yáng)', '邵陽(yáng)', '萍鄉(xiāng)', '晉中', '商洛', '樂(lè)山', '石河子', '白銀', '池州', 
                 '內(nèi)江', '恩施', '益陽(yáng)', '伊犁', '張掖', '運(yùn)城', '綏化', '崇左', '南陽(yáng)', '達(dá)州', '海東', '伊春', '黃石', 
                 '龍巖', '蚌埠', '上饒', '駐馬店', '保山', '呼倫貝爾', '安慶', '淮北', '周口', '孝感', '臨滄', '固原', '欽州', 
                 '漳州', '巴音郭楞', '宜春', '朝陽(yáng)', '鷹潭', '婁底', '雅安', '青海', '懷化', '郴州', '許昌', '紅河', '贛州', 
                 '朔州', '普洱', '吳忠', '新鄉(xiāng)', '資陽(yáng)', '雞西', '昌吉', '荊門', '六安', '黃山', '商丘', '武威', '撫州', 
                 '湘西', '怒江', '鐵嶺', '百色', '淮南', '廣安', '銅陵', '濮陽(yáng)', '天水', '襄陽(yáng)', '南平', '阜陽(yáng)', '鶴壁', 
                 '塔城', '寧德', '大理', '梧州', '衡陽(yáng)', '晉城', '昭通', '黃岡', '永州', '畢節(jié)', '通遼', '玉林', '興安盟', 
                 '咸寧']
    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

組合成元組,方便后面地圖可視化時(shí)傳入數(shù)據(jù):

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

一些城市的經(jīng)緯度數(shù)據(jù)沒(méi)有內(nèi)置到地圖里:


報(bào)錯(cuò)信息說(shuō)明 pyecharts 里沒(méi)有other的經(jīng)緯度信息。

創(chuàng)建nocoor_list列表,用于存儲(chǔ)所有報(bào)錯(cuò)的城市,反復(fù)運(yùn)行下面兩個(gè) cell 的代碼,根據(jù)地圖報(bào)錯(cuò)提醒,不斷添加城市到nocoor_list列表中,就能得到全部的無(wú)經(jīng)緯度的城市。并將剩下沒(méi)報(bào)錯(cuò)的都存儲(chǔ)到city_data 列表中。

city_data = []
nocoor_list = [
    'other','青海','達(dá)州','崇左','巴音郭楞','普洱','池州','湘西','伊犁','烏蘭察布','臨滄','海東','眉山',
    '怒江','固原','廣安'
             ]
for item in zip(city_count.index, city_count.values):
    if item[0] in nocoor_list:
        continue  # 跳出循環(huán):即遇到不存在經(jīng)緯度的城市就跳過(guò),不用存儲(chǔ)到 city_data 里
    city_data.append(item)
city_data

pyecharts 之城市分布地圖

順利繪制出城市分布地圖。

大家一定要自己梳理下整個(gè)城市提取和可視化的過(guò)程。最開(kāi)始也是古柳根據(jù)以往實(shí)踐的經(jīng)驗(yàn),在不知道 pyecharts 都支持哪些城市(可自行搜索看看有沒(méi)有官方說(shuō)明)的情況下,選擇去官網(wǎng)復(fù)制了那一堆城市數(shù)據(jù),然后一步步完成了下來(lái),相對(duì)比較順利。

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

小結(jié)

篇幅所限,后面動(dòng)態(tài)地圖可視化內(nèi)容放到下一篇文章里。先給點(diǎn)提醒用的是WEB 服務(wù)API - 百度地圖獲取area列地理位置的經(jīng)緯度(經(jīng)過(guò)之前文章的學(xué)習(xí),想象大家已經(jīng)能夠輕松自如的實(shí)現(xiàn)這些步驟了),然后導(dǎo)出包含經(jīng)緯度兩列的完整數(shù)據(jù)到 csv,再根據(jù)(送福利)BDP繪制微博轉(zhuǎn)發(fā)動(dòng)態(tài)熱力圖一文,輕松實(shí)現(xiàn)預(yù)期效果。

本系列項(xiàng)目將全面涉及從爬蟲(chóng)、數(shù)據(jù)提取與準(zhǔn)備、數(shù)據(jù)異常發(fā)現(xiàn)與清洗、分析與可視化等細(xì)節(jié),并將代碼統(tǒng)一開(kāi)源在GitHub:DesertsX/gulius-projects ,感興趣的朋友可以先行 star 哈。

本系列文章:
“中國(guó)年輕人正帶領(lǐng)國(guó)家走向危機(jī)”,這鍋背是不背?
手把手教你完成一個(gè)數(shù)據(jù)科學(xué)小項(xiàng)目(1):數(shù)據(jù)爬取
手把手教你完成一個(gè)數(shù)據(jù)科學(xué)小項(xiàng)目(2):數(shù)據(jù)提取、IP 查詢
手把手教你完成一個(gè)數(shù)據(jù)科學(xué)小項(xiàng)目(3):數(shù)據(jù)異常與清洗
手把手教你完成一個(gè)數(shù)據(jù)科學(xué)小項(xiàng)目(4):評(píng)論數(shù)變化情況
手把手教你完成一個(gè)數(shù)據(jù)科學(xué)小項(xiàng)目(5):省份提取與可視化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,442評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,835評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,581評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,922評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,096評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,374評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,591評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,789評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,196評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,524評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,322評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,554評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容