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

前言

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

代码统一开源在 GitHub:DesertsX/gulius-projects ,感兴趣的朋友可以先行 star 哈。(注:jupyter notebook 里的图片有些无法显示,因为打算更新完本系列后再统一上传,建议参照文章内容和实际代码运行结果进行理解)

截至目前我们已经完成了数据爬取数据提取与IP查询数据异常与清洗评论数变化情况分析,本文继续对地理信息进行处理,并分别提取出省份和城市数据,从而可以用 pyecharts 进行地图可视化。

读取数据

import pandas as pd
df = pd.read_csv('Sina_Finance_Comments_All_20180811_Cleaned.csv',encoding='utf-8')
df.head()

经过之前的文章的洗礼,相信你对数据已经非常熟悉了吧:


本文只对'area'列进行处理,'ip_loc'列读者可自行探索,比如提取并分析下移动、电信、联通等的占比
等。

df[['area','ip_loc']]
5-area.jpg

统计 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)

这里展示area_count部分数据:

337 337
area
北京              319
上海              281
广东广州            176
四川成都            136
广东深圳            131
湖北武汉            113
重庆               96
江苏南京             96
浙江杭州             87
陕西西安             73
福建福州             73
浙江               68
江苏苏州             64
安徽合肥             52
天津               44
山东济南             44
江苏徐州             42
江苏无锡             42
辽宁沈阳             40
山东青岛             40

全部3000多条评论数据里,地理信息area_name共337个唯一值,为了分别对省份和城市进行统计和可视化,需要从area_name里找出可以分离出省份和城市的提取方法,以便apply应用到area列上。

读者可在此处暂停思考下,自己的思路是什么?该如何实现?

print(area_name)

全部337条地理信息汇总如下:

['北京', '上海', '广东广州', '四川成都', '广东深圳', '湖北武汉', '重庆', '江苏南京', '浙江杭州', '陕西西安', '福建福州', '浙江', '江苏苏州', '安徽合肥', '天津', '山东济南', '江苏徐州', '江苏无锡', '辽宁沈阳', '山东青岛', '江西南昌', '河南郑州', '香港', '广东佛山', '广东', '湖南长沙', '云南昆明', '北京海淀', '山西太原', '广西南宁', '广东东莞', '甘肃兰州', '澳大利亚', '内蒙古呼和浩特', '河南开封', '福建', '辽宁大连', '河北', '河北石家庄', '江苏南通', '黑龙江哈尔滨', '湖南', '浙江绍兴', '云南', '山东', '日本', '吉林', '吉林长春', '辽宁盘锦', '浙江宁波', '福建厦门', '河南', '贵州贵阳', '浙江金华', '贵州', '山西晋城', '浙江温州', '山东临沂', '四川', '江苏常州', '河南洛阳', '新疆乌鲁木齐', '广东汕头', '江苏扬州', '山东淄博', '四川内江', '江苏泰州', '福建泉州', '广东中山', '山东烟台', '英国英格兰', '浙江嘉兴', '内蒙古包头', '广西', '湖北宜昌', '浙江湖州', '山东济宁', '河北保定', '海南海口', '广东惠州', '河北廊坊', '江苏连云港', '新加坡', '辽宁', '山东潍坊', '安徽淮北', '山西大同', '广西柳州', '湖北襄阳', '浙江台州', '四川绵阳', '河北邯郸', '江西九江', '河南周口', '安徽芜湖', '浙江丽水', '美国', '宁夏银川', '河南南阳', '河北承德', '河北唐山', '江苏盐城', '陕西宝鸡', '青海西宁', '广东揭阳', '河北秦皇岛', '天津塘沽', '河北沧州', '山西长治', '广东韶关', '湖北', '江西上饶', '广西桂林', '江西宜春', '辽宁朝阳', '黑龙江', '湖南常德', '辽宁营口', '湖北黄冈', '辽宁鞍山', '贵州遵义', '山东聊城', '山西', '河南安阳', '安徽六安', '山西运城', '山东德州', '山东东营', '河北衡水', '江西赣州', '美国加利福尼亚州', '辽宁抚顺', '安徽淮南', '陕西咸阳', '四川宜宾', '云南曲靖', '海南三亚', '湖北荆州', '内蒙古赤峰', '四川南充', '福建龙岩', '美国纽约州', '广西河池', '美国伊利诺伊州', '广西梧州', '广东清远', '江苏宿迁', '广西玉林', '广西北海', '广东阳江', '福建莆田', '广东茂名', '江苏', '广东湛江', '新疆昌吉回族自治州', '湖北咸宁', '广东江门', '安徽滁州', '内蒙古', '青海海南藏族自治州', '四川自贡', '大韩民国', '陕西延安', '宁夏', '辽宁锦州', '英国', '安徽阜阳', '山东日照', '江苏镇江', '山西临汾', '山西吕梁', '山西晋中', '福建宁德', '黑龙江齐齐哈尔', '法国', '河南驻马店', '河南新乡', '河南许昌', '湖南益阳', '河南漯河', '湖南衡阳', '甘肃武威', '湖南邵阳', '湖南株洲', '湖南湘潭', '辽宁阜新', '安徽黄山', '河南濮阳', '安徽池州', '辽宁辽阳', '山东威海', '福建南平', '山东枣庄', '河南鹤壁', '辽宁本溪', '湖南湘西土家族苗族自治州', '河南平顶山', '河南三门峡', '贵州毕节', '湖南郴州', '山西阳泉', '安徽安庆', '福建三明', '美国马里兰州', '加拿大安大略', '上海徐汇', '云南保山', '云南普洱', '湖北恩施土家族苗族自治州', '内蒙古兴安盟', '黑龙江大庆', '浙江衢州', '内蒙古通辽', '内蒙古鄂尔多斯', '加拿大不列颠哥伦比亚', '浙江舟山', '泰国', '北京朝阳', '陕西铜川', '湖北黄石', '四川德阳', '四川泸州', '陕西汉中', '四川资阳', '四川雅安', '湖南岳阳', '宁夏吴忠', '英国苏格兰', '山东泰安', '新疆', '福建漳州', '广西崇左', '美国康乃狄克州', '甘肃', '美国德克萨斯州', '美国俄亥俄州', '河北张家口', '美国佛罗里达州', '广东珠海', '瑞典', '江西鹰潭', '广西钦州', '江西', '新疆巴音郭楞蒙古自治州', '澳门', '江西萍乡', '江苏淮安', '湖北随州', '四川广安', '美国俄勒冈州', '马来西亚', '陕西渭南', '湖北荆门', '江西景德镇', '吉林松原', '新西兰', '四川广元', '吉林白山', '新疆石河子', '吉林通化', '日本和歌山县', '青海海东', '青海', '四川乐山', '北京东城', '加拿大', '加拿大艾伯塔', '日本岐阜县', '上海黄浦', '黑龙江绥化', '云南临沧', '云南大理白族自治州', '云南怒江傈僳族自治州', '黑龙江牡丹江', '云南昭通', '甘肃白银', '云南红河哈尼族彝族自治州', '伊拉克', '海南', '内蒙古乌兰察布', '美国乔治亚', '甘肃张掖', '内蒙古呼伦贝尔', '黑龙江伊春', '黑龙江鸡西', '新疆塔城地区', '江西抚州', '四川眉山', '美国路易斯安那州', '湖南娄底', '新疆伊犁哈萨克自治州', '辽宁葫芦岛', '广东肇庆', '广东潮州', '河南商丘', '山东莱芜', '山东菏泽', '辽宁丹东', '爱尔兰', '美国新泽西州', '河南信阳', '越南胡志明市', '广东河源', '广东汕尾', '山西朔州', '湖北孝感', '西藏拉萨', '广东梅州', '菲律宾西米沙鄢', '菲律宾', '澳大利亚澳大利亚首都领地', '广东云浮', '瑞士', '美国弗吉尼亚州', '辽宁铁岭', '安哥拉', '四川达州', '四川遂宁', '河北邢台', '湖南怀化', '陕西商洛', '美国宾夕法尼亚州', '意大利皮埃蒙特', '宁夏固原', '意大利托斯卡纳', '意大利', '美国密苏里州', '广西百色', '甘肃定西', '甘肃天水', '湖南永州', '美国密歇根州', '安徽蚌埠', '安徽铜陵', '河南焦作', '安徽马鞍山', '美国田纳西州']

地理信息的处理,算是本系列文章的一大亮点,面对这样略显杂乱的数据,新手小白或许会和古柳一样有些头大,(今天你头大了吗?),回想当初做《爬取张佳玮138w+知乎关注者:数据可视化》项目时,筛选了张佳玮的138万关注中自身100+关注的全部4万多知乎用户后,打算分析和可视化时,看到数据的脏乱程度也是一言难尽,为了给大家一个直观的感受,特意翻出数据来展示下,不知道能否得清:

鬼知道古柳当初是怎么统计的呢!


现在看来,这回的数据真的算好的了,地理信息都是真实的,不会有用户自定义、瞎填的情况出现;格式较为统一,而且数据量也小,再不济,哪怕手动提取省份和城市也不是不可以...(手动是不可能手动的,这辈子都不可能再手动的)



但有个背景需要交代,古柳在完成这个项目时是全部一起做的,也就是说在一个 jupyter notebook 里一步步从爬虫测试与数据爬取、IP 查询与数据提取、评论数变化情况分析和可视化、BUG 遭遇战与异常处理、以及后续文章将涉及的 emoji 提取、评论内容分析、词云展示、情感分析,还有本文的地理信息处理、经纬度查询、用 BDP 实现评论动态热力图等等。“工作量”也不小,虽说现在写成了系列文章的形式,一个 notebook 掰成了八九瓣,读者可能觉察不到,但“如人饮水,冷暖自知”,推进到这一步,确认过地理信息后,“糟糕,是心肌梗塞的感觉”。好了,扯完犊子,还是开始讲下古柳的处理思路吧。

数据处理思路

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

Talk is cheap, show you the code.

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

提取省份

area列提取出相应省份,非国内的则统一用海外表示:

def get_pro(area):
    prolist = ['北京', '天津', '上海', '重庆', '河北', '山西', '辽宁', '吉林', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '广西', '西藏', '宁夏', '新疆', '香港', '澳门', '内蒙古', '黑龙江']
    for pro in prolist:
        if pro in area:
            return pro
    return "海外"
df['pro'] = df.area.apply(get_pro)
df[['area','pro']]

统计数据

pro_count = df.groupby('pro')['pro'].count().sort_values(ascending=False)
pro_count

具体数值看柱状图就行。

pyecharts

pyecharts 自定义主题

先安装主题插件
pip install echarts-themes-pypkg

省份分布柱形图

from pyecharts import Bar
bar = Bar("省份分布")
bar.use_theme("macarons") # 换主题
bar.add("省份", pro_count.index, pro_count.values,is_label_show=True,xaxis_interval=0,xaxis_rotate=-45)
bar

省份分布地图

from pyecharts import Map
mapp = Map("省份分布情况", width=1000, height=600)
#mapp.use_theme("macarons") # 换主题
mapp.add("", pro_count.index, pro_count.values, maptype='china', is_visualmap=True,
         visual_range=[0, 480], is_map_symbol_show=False, visual_text_color='#000', is_label_show=True)
mapp

小结

省份提取相对比较简单,只要网上搜下具体有哪些省份(暴露了古柳是地理小白),拿到省份名单之后就好办了。不过之前对地理信息数据的分组划分,以便更清晰的了解数据和避免后续出错的步骤倒是小小闪光点吧。逃...

下一篇文章将涉及提取城市数据,调用百度地图 API 查询经纬度,然后用 BDP 绘制动态热力图。非常建议读者自行尝试实现,应该有不一样的实现方法,古柳的方法感觉还是麻烦了,不要被我的方法所限制!具体内容请看下文。未完待,续...



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

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

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

推荐阅读更多精彩内容

  • 以前的人生是那么曲折,不能用言语表达,希望我的下一个春天会阳光明媚,温暖无比!
    小夕的春天阅读 130评论 0 0
  • 亲爱的自己: 你在这个世界上真真切切地生活了38年。 你从没有想过,生命可以那么灿烂。 昨天,朋友们悄悄地组织了一...
    周洋_图乐园阅读 423评论 5 13
  • 有人说:世界这么大,我想去看看 有人说:身体和心灵一定要有一个在路上 很多人都给旅行下着各种各样的定义,而我说:...
    DINGZI阅读 127评论 0 0
  • 不喜欢在颐指气使的语气中,感受你的个性,这样的人不会真正得到别人的尊重,真正的牛逼是,你平和叙事,然而别人在你的言...
    张文雁阅读 181评论 0 0