前言
请先阅读“中国年轻人正带领国家走向危机”,这锅背是不背? 一文,以对“手把手教你完成一个数据科学小项目”系列有个全局性的了解。
代码统一开源在 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
先安装主题插件
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):评论数变化情况
网友评论