作者 | 小F

来源 | 法纳斯特

最近看了新周刊的一篇推送,有关地铁名字的分析,链接如下。

我们分析了3447个地铁站,发现了中国城市地名的秘密

于是乎也想着自己去获取数据,然后进行分析一番。

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

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

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

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

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

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

/ 01 / 获取分析

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

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

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

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

/ 02 / 数据获取

具体代码如下。

import json
import requests
from bs4 import BeautifulSoup

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'}

def get_message(ID, cityname, name):
    """
    地铁线路信息获取
    """
    url = 'http://map.amap.com/service/subway?_1555502190153&srhdata=' + ID + '_drw_' + cityname + '.json'
    response = requests.get(url=url, headers=headers)
    html = response.text
    result = json.loads(html)
    for i in result['l']:
        for j in i['st']:
            # 判断是否含有地铁分线
            if len(i['la']) > 0:
                print(name, i['ln'] + '(' + i['la'] + ')', j['n'])
                with open('subway.csv', 'a+', encoding='gbk') as f:
                    f.write(name + ',' + i['ln'] + '(' + i['la'] + ')' + ',' + j['n'] + '\n')
            else:
                print(name, i['ln'], j['n'])
                with open('subway.csv', 'a+', encoding='gbk') as f:
                    f.write(name + ',' + i['ln'] + ',' + j['n'] + '\n')

def get_city():
    """
    城市信息获取
    """
    url = 'http://map.amap.com/subway/index.html?&1100'
    response = requests.get(url=url, headers=headers)
    html = response.text
    # 编码
    html = html.encode('ISO-8859-1')
    html = html.decode('utf-8')
    soup = BeautifulSoup(html, 'lxml')
    # 城市列表
    res1 = soup.find_all(class_="city-list fl")[0]
    res2 = soup.find_all(class_="more-city-list")[0]
    for i in res1.find_all('a'):
        # 城市ID值
        ID = i['id']
        # 城市拼音名
        cityname = i['cityname']
        # 城市名
        name = i.get_text()
        get_message(ID, cityname, name)
    for i in res2.find_all('a'):
        # 城市ID值
        ID = i['id']
        # 城市拼音名
        cityname = i['cityname']
        # 城市名
        name = i.get_text()
        get_message(ID, cityname, name)

if __name__ == '__main__':
    get_city()

最后成功获取数据。

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

/ 03 /  数据可视化

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

from wordcloud import WordCloud, ImageColorGenerator
from pyecharts import Line, Bar
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import jieba

# 设置列名与数据对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
# 显示10行
pd.set_option('display.max_rows', 10)
# 读取数据
df = pd.read_csv('subway.csv', header=None, names=['city', 'line', 'station'], encoding='gbk')
# 各个城市地铁线路情况
df_line = df.groupby(['city', 'line']).count().reset_index()
print(df_line)

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

一共183条地铁线路。

def create_map(df):
    # 绘制地图
    value = [i for i in df['line']]
    attr = [i for i in df['city']]
    geo = Geo("已开通地铁城市分布情况", title_pos='center', title_top='0', width=800, height=400, title_color="#fff", background_color="#404a59", )
    geo.add("", attr, value, is_visualmap=True, visual_range=[0, 25], visual_text_color="#fff", symbol_size=15)
    geo.render("已开通地铁城市分布情况.html")

def create_line(df):
    """
    生成城市地铁线路数量分布情况
    """
    title_len = df['line']
    bins = [0, 5, 10, 15, 20, 25]
    level = ['0-5', '5-10', '10-15', '15-20', '20以上']
    len_stage = pd.cut(title_len, bins=bins, labels=level).value_counts().sort_index()
    # 生成柱状图
    attr = len_stage.index
    v1 = len_stage.values
    bar = Bar("各城市地铁线路数量分布", title_pos='center', title_top='18', width=800, height=400)
    bar.add("", attr, v1, is_stack=True, is_label_show=True)
    bar.render("各城市地铁线路数量分布.html")

# 各个城市地铁线路数
df_city = df_line.groupby(['city']).count().reset_index().sort_values(by='line', ascending=False)
print(df_city)
create_map(df_city)
create_line(df_city)

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

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

城市分布情况。

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

线路数量分布情况。

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

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

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

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

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

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

去除重复换乘站数据。

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

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

减少了近400个地铁站。

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

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

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

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

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

def create_wordcloud(df):
    """
    生成地铁名词云
    """
    # 分词
    text = ''
    for line in df['station']:
        text += ' '.join(jieba.cut(line, cut_all=False))
        text += ' '
    backgroud_Image = plt.imread('rocket.jpg')
    wc = WordCloud(
        background_color='white',
        mask=backgroud_Image,
        font_path='C:\Windows\Fonts\华康俪金黑W8.TTF',
        max_words=1000,
        max_font_size=150,
        min_font_size=15,
        prefer_horizontal=1,
        random_state=50,
    )
    wc.generate_from_text(text)
    img_colors = ImageColorGenerator(backgroud_Image)
    wc.recolor(color_func=img_colors)
    # 看看词频高的有哪些
    process_word = WordCloud.process_text(wc, text)
    sort = sorted(process_word.items(), key=lambda e: e[1], reverse=True)
    print(sort[:50])
    plt.imshow(wc)
    plt.axis('off')
    wc.to_file("地铁名词云.jpg")
    print('生成词云成功!')

create_wordcloud(df_station)

词云图如下。

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

words = []
for line in df['station']:
    for i in line:
        # 将字符串输出一个个中文
        words.append(i)

def all_np(arr):
    """
    统计单字频率
    """
    arr = np.array(arr)
    key = np.unique(arr)
    result = {}
    for k in key:
        mask = (arr == k)
        arr_new = arr[mask]
        v = arr_new.size
        result[k] = v
    return result

def create_word(word_message):
    """
    生成柱状图
    """
    attr = [j[0] for j in word_message]
    v1 = [j[1] for j in word_message]
    bar = Bar("中国地铁站最爱用的字", title_pos='center', title_top='18', width=800, height=400)
    bar.add("", attr, v1, is_stack=True, is_label_show=True)
    bar.render("中国地铁站最爱用的字.html")

word = all_np(words)
word_message = sorted(word.items(), key=lambda x: x[1], reverse=True)[:10]
create_word(word_message)

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

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

不信往下看。

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

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

选取包含路的地铁站。

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

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

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

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

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

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

# 选取武汉的地铁站
df1 = df_station[df_station['city'] == '武汉']
print(df1)
# 选取武汉地铁站名字包含家的数据
df2 = df1[df1['station'].str.contains('家')]
print(df2)

# 选取重庆的地铁站
df1 = df_station[df_station['city'] == '重庆']
print(df1)
# 选取重庆地铁站名字包含家的数据
df2 = df1[df1['station'].str.contains('家')]
print(df2)

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

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

def create_door(door):
    """
    生成柱状图
    """
    attr = [j for j in door['city'][:3]]
    v1 = [j for j in door['line'][:3]]
    bar = Bar("地铁站最爱用“门”命名的城市", title_pos='center', title_top='18', width=800, height=400)
    bar.add("", attr, v1, is_stack=True, is_label_show=True, yaxis_max=40)
    bar.render("地铁站最爱用门命名的城市.html")

# 选取地铁站名字包含门的数据
df1 = df_station[df_station['station'].str.contains('门')]
# 对数据进行分组计数
df2 = df1.groupby(['city']).count().reset_index().sort_values(by='line', ascending=False)
print(df2)
create_door(df2)

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

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

具体的地铁站名数据。

# 选取北京的地铁站
df1 = df_station[df_station['city'] == '北京']
# 选取北京地铁站名字包含门的数据
df2 = df1[df1['station'].str.contains('门')]
print(df2)

# 选取南京的地铁站
df1 = df_station[df_station['city'] == '南京']
# 选取南京地铁站名字包含门的数据
df2 = df1[df1['station'].str.contains('门')]
print(df2)

# 选取西安的地铁站
df1 = df_station[df_station['city'] == '西安']
# 选取西安地铁站名字包含门的数据
df2 = df1[df1['station'].str.contains('门')]
print(df2)

输出如下。

这里摘一段新周刊的话。

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

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

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

后台回复“地铁”可以获取本文代码,

万水千山总是情,点个「在看」行不行。

留言打卡 DAY 26

今日的留言话题是聊聊你身边有趣的地名或者地铁、火车站名,关于留言打卡的规则可以参考,请按照昵称+天数(请以自己实际连续打卡的天数为准,如day1 or day2 or day3)+ 留言内容(不少于15字)的方式留言

◆ ◆ ◆  ◆ ◆

长按二维码关注我们


数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:

猜你喜欢

183条地铁线路,3034个地铁站,发现中国地铁名字的秘密。相关推荐

  1. python地铁车票_Python分析3034个地铁站,发现中国地铁名字的秘密。

    原标题:Python分析3034个地铁站,发现中国地铁名字的秘密. 最近看了新周刊的一篇推送,有关地铁名字的分析,链接如下. 我们分析了3447个地铁站,发现了中国城市地名的秘密 于是乎也想着自己去获 ...

  2. 发现中国地铁名字的秘密

    一个小小的地铁名,就是一座城市风貌的一部分,它反映着不同地方的水土,也承载着各个城市的文化和历史. 本文试图从地铁站名出发,一探这一个个名字能否反映出每一寸土地的性格,文化. 参考文章:183条地铁线 ...

  3. 基于C++实现广州地铁线路查询【100010817】

    广州地铁线路查询 一.实验目的 百度地图.高德地图等软件在导航时,如果选择出行方式为地铁,通常将提供从起点站到终点站的最短路径或者是多条规划路径的具体线路名称.本次实验旨在实现一个以广州地铁为基础数据 ...

  4. 如何使用Python获取高德地图中的地铁线路数据(geojson版本)

    目录 数据来源 文件管理 引用的库 获取文件夹名称 读取文件 提取转化为线文件 提取转化为点文件 主程序 最终成果 数据来源 通过在高德地图搜索框直接搜索地铁线路,地图上会高亮显示地铁线路.通过尝试发 ...

  5. 苏州地铁线路查询接口 地铁线路实时详细信息

    苏州地铁线路查询接口将返回具体地铁线路实时详细信息,包括列车站台编号.位置描述.站台名称.列车编号.列车首班车.列车末班车.纬度.经度.距离当前位置.是否靠近地铁口.列车到站情况等等,调用非常方便. ...

  6. ylbtech-SubwayNav(地铁线路导航)-数据库设计

    ylbtech-DatabaseDesgin:ylbtech-SubwayNav(地铁线路导航)-数据库设计 DatabaseName:SubwayNav(地铁线路导航) Type:线路导航 1.A, ...

  7. Python爬虫实战,pyecharts模块,Python实现中国地铁数据可视化

    前言 利用Python实现中国地铁数据可视化.废话不多说. 让我们愉快地开始吧~ 开发工具 Python 版本:3.6.4 相关模块: requests模块; wordcloud模块; 熊猫模块; n ...

  8. 2022-2028年中国地铁广告行业研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国地铁广告行业市场行业相关概述.中国地铁广 ...

  9. 官宣|深圳新增6条新建地铁线路和100个站点

    深圳市规划和自然资源局近日发布了<深圳市轨道交通四期车站选址方案>新增6条新建地铁线路和100个站点正式官宣. 本次规划涉及6号线支线.12号线.13号线.14号线.16号线.20号线一期 ...

最新文章

  1. 包package,权限修饰符
  2. 2018 re:Invent回顾篇:前线开发者眼中AWS的创新版图
  3. 尘埃落定!苹果 10 亿美元入局 5G,Intel 挥别 9 年基带业务
  4. python 2/3 joblib.dump() 和 joblib.load()
  5. Oralce数据库数据迁移到另一个数据
  6. (整理)ubuntu10.10安装低版本的编译器(低版本)(gcc)(ubuntu)
  7. 20应用统计考研复试要点(part13)--应用多元分析
  8. java t9 字母组合_太赞了!美团T9终于整理出Java架构之完美设计实战开源文档
  9. 【高并发解决方案】1、高并发解决方案汇总
  10. NanoPC-T4 RK3399和PC局域网络传输摄像头视频python
  11. Python3实现的m3u8批量下载器 解密合并多线程
  12. PDF软件最新版本功能介绍
  13. 从Flyme 1到Flyme 6 看魅族如何打造最懂你的OS
  14. Excel 如何排序与多关键字排序
  15. Settings搜索栏界面绘制
  16. CAT6219-330TDGT3芯片介绍 (2.3V~5.5V转3.3V输出 500 mA 输出CMOS LDO 低功耗稳压器)
  17. PLC实验:十字路口交通灯控制
  18. 如何查看计算机组策略,如何查看哪些组策略应用于您的PC和用户帐户 | MOS86
  19. 【设计模式笔记】单例模式Singleton Pattern
  20. Android cec设备,Android HDMI CEC控制服务

热门文章

  1. 肝完这篇 TCP/IP ,我就去面试去。
  2. 故障:不能连接到共享打印机
  3. 众安保险 x StarRocks | 全新实时分析能力开启数字化经营新局面
  4. 快来学学爱用建站新功能【Light Press】微单页,超级实用
  5. 两个小可爱的结对作业(司佳宇,雷镓)
  6. 2021用友YonSuite与创新企业共舞
  7. 什么是mysql 中级工程师的理解
  8. Oracle 11g重建控制文件——控制文件全部丢失,从零开始
  9. 视角的本质能给我们带来什么?
  10. 心理危机干预系统简介