183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

大数据 数据分析
最近看了新周刊的一篇推送,有关地铁名字的分析。于是乎也想着自己去获取数据,然后进行分析一番。当然分析水平不可能和他们的相比,毕竟文笔摆在那里,也就那点水平。

最近看了新周刊的一篇推送,有关地铁名字的分析。于是乎也想着自己去获取数据,然后进行分析一番。

当然分析水平不可能和他们的相比,毕竟文笔摆在那里,也就那点水平。

大家看着乐呵就好,能提高的估摸着也就只有数据的准确性啦。

文中所用到的地铁站数据并没有去重,对于换乘站,含有大量重复。

即使作者一直在强调换乘站占比很小,影响不是很大。

但于我而言,去除重复数据还是比较简单的。

然后照着人家的路子去分析,多学习一下。

一、获取分析

地铁信息获取从高德地图上获取。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

上面主要获取城市的「id」,「cityname」及「名称」。

用于拼接请求网址,进而获取地铁线路的具体信息。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

找到请求信息,获取各个城市的地铁线路以及线路中站点详情。

二、数据获取

具体代码如下。

  1. import json 
  2. import requests 
  3. from bs4 import BeautifulSoup 
  4.  
  5. headers = {'user-agent''Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
  6.  
  7.  
  8. def get_message(ID, cityname, name): 
  9.     ""
  10.     地铁线路信息获取 
  11.     ""
  12.     url = 'http://map.amap.com/service/subway?_1555502190153&srhdata=' + ID + '_drw_' + cityname + '.json' 
  13.     response = requests.get(url=url, headers=headers) 
  14.     html = response.text 
  15.     result = json.loads(html) 
  16.     for i in result['l']: 
  17.         for j in i['st']: 
  18.             # 判断是否含有地铁分线 
  19.             if len(i['la']) > 0: 
  20.                 print(name, i['ln'] + '(' + i['la'] + ')', j['n']) 
  21.                 with open('subway.csv''a+', encoding='gbk'as f: 
  22.                     f.write(name + ',' + i['ln'] + '(' + i['la'] + ')' + ',' + j['n'] + '\n'
  23.             else
  24.                 print(name, i['ln'], j['n']) 
  25.                 with open('subway.csv''a+', encoding='gbk'as f: 
  26.                     f.write(name + ',' + i['ln'] + ',' + j['n'] + '\n'
  27.  
  28.  
  29. def get_city(): 
  30.     ""
  31.     城市信息获取 
  32.     ""
  33.     url = 'http://map.amap.com/subway/index.html?&1100' 
  34.     response = requests.get(url=url, headers=headers) 
  35.     html = response.text 
  36.     # 编码 
  37.     html = html.encode('ISO-8859-1'
  38.     html = html.decode('utf-8'
  39.     soup = BeautifulSoup(html, 'lxml'
  40.     # 城市列表 
  41.     res1 = soup.find_all(class_="city-list fl")[0] 
  42.     res2 = soup.find_all(class_="more-city-list")[0] 
  43.     for i in res1.find_all('a'): 
  44.         # 城市ID值 
  45.         ID = i['id'
  46.         # 城市拼音名 
  47.         cityname = i['cityname'
  48.         # 城市名 
  49.         name = i.get_text() 
  50.         get_message(ID, cityname, name
  51.     for i in res2.find_all('a'): 
  52.         # 城市ID值 
  53.         ID = i['id'
  54.         # 城市拼音名 
  55.         cityname = i['cityname'
  56.         # 城市名 
  57.         name = i.get_text() 
  58.         get_message(ID, cityname, name
  59.  
  60.  
  61. if __name__ == '__main__'
  62.     get_city() 

***成功获取数据。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

包含换乘站数据,一共3541个地铁站点。

二、数据可视化

先对数据进行清洗,去除重复的换乘站信息。

  1. from wordcloud import WordCloud, ImageColorGenerator 
  2. from pyecharts import Line, Bar 
  3. import matplotlib.pyplot as plt 
  4. import pandas as pd 
  5. import numpy as np 
  6. import jieba 
  7.  
  8. # 设置列名与数据对齐 
  9. pd.set_option('display.unicode.ambiguous_as_wide'True
  10. pd.set_option('display.unicode.east_asian_width'True
  11. # 显示10行 
  12. pd.set_option('display.max_rows', 10) 
  13. # 读取数据 
  14. df = pd.read_csv('subway.csv', header=None, names=['city''line''station'], encoding='gbk'
  15. # 各个城市地铁线路情况 
  16. df_line = df.groupby(['city''line']).count().reset_index() 
  17. print(df_line) 

通过城市及地铁线路进行分组,得到全国地铁线路总数。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

一共183条地铁线路。

  1. def create_map(df): 
  2.     # 绘制地图 
  3.     value = [i for i in df['line']] 
  4.     attr = [i for i in df['city']] 
  5.     geo = Geo("已开通地铁城市分布情况", title_pos='center', title_top='0', width=800, height=400, title_color="#fff", background_color="#404a59", ) 
  6.     geo.add("", attr, value, is_visualmap=True, visual_range=[0, 25], visual_text_color="#fff", symbol_size=15) 
  7.     geo.render("已开通地铁城市分布情况.html"
  8.  
  9.  
  10. def create_line(df): 
  11.     ""
  12.     生成城市地铁线路数量分布情况 
  13.     ""
  14.     title_len = df['line'
  15.     bins = [0, 5, 10, 15, 20, 25] 
  16.     level = ['0-5''5-10''10-15''15-20''20以上'
  17.     len_stage = pd.cut(title_len, bins=bins, labels=level).value_counts().sort_index() 
  18.     # 生成柱状图 
  19.     attr = len_stage.index 
  20.     v1 = len_stage.values 
  21.     bar = Bar("各城市地铁线路数量分布", title_pos='center', title_top='18', width=800, height=400) 
  22.     bar.add("", attr, v1, is_stack=True, is_label_show=True
  23.     bar.render("各城市地铁线路数量分布.html"
  24.  
  25.  
  26. # 各个城市地铁线路数 
  27. df_city = df_line.groupby(['city']).count().reset_index().sort_values(by='line', ascending=False
  28. print(df_city) 
  29. create_map(df_city) 
  30. create_line(df_city) 

已经开通地铁的城市数据,还有各个城市的地铁线路数。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

一共32个城市开通地铁,其中北京、上海线路已经超过了20条。

城市分布情况。

[[263955]]

大部分都是省会城市,还有个别经济实力强的城市。

线路数量分布情况。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

可以看到大部分还是在「0-5」这个阶段的,当然最少为1条线。

  1. # 哪个城市哪条线路地铁站最多 
  2. print(df_line.sort_values(by='station', ascending=False)) 

探索一下哪个城市哪条线路地铁站最多。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

北京10号线***,重庆3号线第二。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

还是蛮怀念北京1张票,2块钱地铁随便做的时候。

可惜好日子一去不复返了。

去除重复换乘站数据。

  1. # 去除重复换乘站的地铁数据 
  2. df_station = df.groupby(['city''station']).count().reset_index() 
  3. print(df_station) 

一共包含3034个地铁站,相较新周刊中3447个地铁站数据。

减少了近400个地铁站。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

接下来看一下哪个城市地铁站最多。

  1. # 统计每个城市包含地铁站数(已去除重复换乘站) 
  2. print(df_station.groupby(['city']).count().reset_index().sort_values(by='station', ascending=False)) 

32个城市,上海***,北京第二。

没想到的是,武汉居然有那么多地铁站。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

现在来实现一下新周刊中的操作,生成地铁名词云。

  1. def create_wordcloud(df): 
  2.     ""
  3.     生成地铁名词云 
  4.     ""
  5.     # 分词 
  6.     text = '' 
  7.     for line in df['station']: 
  8.         text += ' '.join(jieba.cut(line, cut_all=False)) 
  9.         text += ' ' 
  10.     backgroud_Image = plt.imread('rocket.jpg'
  11.     wc = WordCloud( 
  12.         background_color='white'
  13.         mask=backgroud_Image, 
  14.         font_path='C:\Windows\Fonts\华康俪金黑W8.TTF'
  15.         max_words=1000, 
  16.         max_font_size=150, 
  17.         min_font_size=15, 
  18.         prefer_horizontal=1, 
  19.         random_state=50, 
  20.     ) 
  21.     wc.generate_from_text(text) 
  22.     img_colors = ImageColorGenerator(backgroud_Image) 
  23.     wc.recolor(color_func=img_colors) 
  24.     # 看看词频高的有哪些 
  25.     process_word = WordCloud.process_text(wc, text) 
  26.     sort = sorted(process_word.items(), key=lambda e: e[1], reverse=True
  27.     print(sort[:50]) 
  28.     plt.imshow(wc) 
  29.     plt.axis('off'
  30.     wc.to_file("地铁名词云.jpg"
  31.     print('生成词云成功!'
  32.  
  33.  
  34. create_wordcloud(df_station) 

词云图如下。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

广场、大道、公园占了前三,和新周刊的图片一样,说明分析有效。

  1. words = [] 
  2. for line in df['station']: 
  3.     for i in line: 
  4.         # 将字符串输出一个个中文 
  5.         words.append(i) 
  6.  
  7.  
  8. def all_np(arr): 
  9.     ""
  10.     统计单字频率 
  11.     ""
  12.     arr = np.array(arr) 
  13.     key = np.unique(arr) 
  14.     result = {} 
  15.     for k in key
  16.         mask = (arr == k) 
  17.         arr_new = arr[mask] 
  18.         v = arr_new.size 
  19.         result[k] = v 
  20.     return result 
  21.  
  22.  
  23. def create_word(word_message): 
  24.     ""
  25.     生成柱状图 
  26.     ""
  27.     attr = [j[0] for j in word_message] 
  28.     v1 = [j[1] for j in word_message] 
  29.     bar = Bar("中国地铁站***用的字", title_pos='center', title_top='18', width=800, height=400) 
  30.     bar.add("", attr, v1, is_stack=True, is_label_show=True
  31.     bar.render("中国地铁站***用的字.html"
  32.  
  33.  
  34. word = all_np(words) 
  35. word_message = sorted(word.items(), key=lambda x: x[1], reverse=True)[:10] 
  36. create_word(word_message) 

统计一下,大家最喜欢用什么字来命名地铁。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

路最多,在此之中上海的占比很大。

不信往下看。

  1. # 选取上海的地铁站 
  2. df1 = df_station[df_station['city'] == '上海'
  3. print(df1) 

统计上海所有的地铁站,一共345个。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

选取包含路的地铁站。

  1. # 选取上海地铁站名字包含路的数据 
  2. df2 = df1[df1['station'].str.contains('路')] 
  3. print(df2) 

有210个,约占上海地铁的三分之二,路的七分之二。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

看来上海对路是情有独钟的。

具体缘由这里就不解释了,详情见新周刊的推送,里面还是讲解蛮详细的。

武汉和重庆则是对家这个词特别喜欢。

标志着那片土地开拓者们的籍贯与姓氏。

  1. # 选取武汉的地铁站 
  2. df1 = df_station[df_station['city'] == '武汉'
  3. print(df1) 
  4. # 选取武汉地铁站名字包含家的数据 
  5. df2 = df1[df1['station'].str.contains('家')] 
  6. print(df2) 
  7.  
  8. # 选取重庆的地铁站 
  9. df1 = df_station[df_station['city'] == '重庆'
  10. print(df1) 
  11. # 选取重庆地铁站名字包含家的数据 
  12. df2 = df1[df1['station'].str.contains('家')] 
  13. print(df2) 

武汉共有17个,重庆共有20个。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

看完家之后,再来看一下名字包含门的地铁站。

  1. def create_door(door): 
  2.     ""
  3.     生成柱状图 
  4.     ""
  5.     attr = [j for j in door['city'][:3]] 
  6.     v1 = [j for j in door['line'][:3]] 
  7.     bar = Bar("地铁站***用“门”命名的城市", title_pos='center', title_top='18', width=800, height=400) 
  8.     bar.add("", attr, v1, is_stack=True, is_label_show=True, yaxis_max=40) 
  9.     bar.render("地铁站***用门命名的城市.html"
  10.  
  11.  
  12. # 选取地铁站名字包含门的数据 
  13. df1 = df_station[df_station['station'].str.contains('门')] 
  14. # 对数据进行分组计数 
  15. df2 = df1.groupby(['city']).count().reset_index().sort_values(by='line', ascending=False
  16. print(df2) 
  17. create_door(df2) 

一共有21个城市,地铁站名包含门。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

其中北京,南京,西安作为多朝古都,占去了大部分。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

具体的地铁站名数据。

  1. # 选取北京的地铁站 
  2. df1 = df_station[df_station['city'] == '北京'
  3. # 选取北京地铁站名字包含门的数据 
  4. df2 = df1[df1['station'].str.contains('门')] 
  5. print(df2) 
  6.  
  7. # 选取南京的地铁站 
  8. df1 = df_station[df_station['city'] == '南京'
  9. # 选取南京地铁站名字包含门的数据 
  10. df2 = df1[df1['station'].str.contains('门')] 
  11. print(df2) 
  12.  
  13. # 选取西安的地铁站 
  14. df1 = df_station[df_station['city'] == '西安'
  15. # 选取西安地铁站名字包含门的数据 
  16. df2 = df1[df1['station'].str.contains('门')] 
  17. print(df2) 

输出如下。

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密

三、总结

源码及相关文件已上传GitHub,点击阅读原文即可获取。

这里摘一段新周刊的话。

可以说,一个小小的地铁名就是一座城市风貌的一部分。

它反映着不同地方的水土,也承载着各个城市的文化和历史。

确实如此,靠山的城市地铁名多“山”,靠水的城市地铁名“含水量”则是杠杠的。

责任编辑:未丽燕 来源: 法纳斯特
相关推荐

2022-07-31 15:46:30

Web自动智能停车

2016-07-05 17:47:53

华为

2014-07-18 09:10:56

免费Wi-Fi

2012-12-29 16:38:41

搜狗地图

2016-01-27 14:47:02

云监控华为

2024-10-08 15:16:23

SQL地铁换乘数据库

2016-06-08 14:47:17

高德

2019-06-24 15:55:59

地铁线路拥挤

2014-12-17 09:16:33

漏洞北京地铁系统

2012-07-09 09:54:57

Wi-Fi伦敦奥运

2017-12-07 08:03:54

华为

2017-09-07 16:37:11

华为

2021-02-22 19:06:17

数字人民币数字货币区块链

2014-01-23 10:59:54

地铁通

2015-06-25 17:26:52

京港地铁华为

2017-09-21 12:12:45

2016-10-19 09:17:15

HTML5Javascript可视化

2017-07-11 10:31:17

OPPO 手机

2012-08-13 14:17:35

算法代码

2016-09-08 13:16:51

锐捷
点赞
收藏

51CTO技术栈公众号