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


戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg

技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!


作者:小F

转载:法纳斯特


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


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


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


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


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


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


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


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


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



/ 01 / 获取分析


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


640?wx_fmt=png


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


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


640?wx_fmt=png


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



/ 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()


最后成功获取数据。


640?wx_fmt=png


包含换乘站数据,一共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)


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


640?wx_fmt=png


一共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=[025], visual_text_color="#fff", symbol_size=15)
    geo.render("已开通地铁城市分布情况.html")


def create_line(df):
    """
    生成城市地铁线路数量分布情况
    """

    title_len = df['line']
    bins = [0510152025]
    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)


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


640?wx_fmt=png


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


城市分布情况。


640?wx_fmt=png


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


线路数量分布情况。


640?wx_fmt=png


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


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


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


640?wx_fmt=png


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


640?wx_fmt=png

640?wx_fmt=png


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


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


去除重复换乘站数据。


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


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


减少了近400个地铁站。


640?wx_fmt=png


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


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


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


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


640?wx_fmt=png


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


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)


词云图如下。


640?wx_fmt=png


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


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[0for j in word_message]
    v1 = [j[1for 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)


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


640?wx_fmt=png


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


不信往下看。


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


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


640?wx_fmt=png


选取包含路的地铁站。


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


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


640?wx_fmt=png


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


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


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


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


# 选取武汉的地铁站
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个。


640?wx_fmt=png

640?wx_fmt=png


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


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个城市,地铁站名包含门。


640?wx_fmt=png


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


640?wx_fmt=png


具体的地铁站名数据。


# 选取北京的地铁站
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)


输出如下。


640?wx_fmt=png

640?wx_fmt=png



/ 03 / 总结


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


这里摘一段新周刊的话。


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


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


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


640?wx_fmt=png


福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


推荐阅读:

  • 太形象了!什么是边缘计算?最有趣的解释没有之一!

  • 互联网出海十年

  • 华为员工年薪 200 万!真相让人心酸!

  • 天才程序员:25 岁进贝尔实验室,32 岁创建信息论  琥珀  极客宝宝  5天前

  • 安全顾问反水成黑客, 靠瞎猜盗得5000万美元的以太币, 一个区块链大盗的另类传奇

  • 人造器官新突破!美国科学家3D打印出会“呼吸”的肺 | Science


640?wx_fmt=png真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建Git仓库的三种形式

创建Git仓库的三种形式: 2种本地创建和远程拉取 文章目录1. 在idea中初始化仓库1.1. 进入目录,初始化仓库1.2. git init 目录名1.3.1 远程拉取1. 在idea中初始化仓库 1.1. 进入目录,初始化仓库 进入目录git init 创建test1目录,…

C++中常用字符串相关的编程题

索引 找出字符串中的数字,字母和符号,并分别存储 找出字符串中所有不重复的字符,并输出 统计字符串中每个字符的个数,并输出 编译环境 以下所用的开发环境是vs2010,创建的都为控制台输出程序。下面只贴出创建项目后修改了的c…

刷了一个半月算法题,我薪资终于Double了

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!前言很多人感觉大公司都是要手写算法,那刷题是必不可少了,你技…

创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史&#…

mac上用qt调用自己生成的qt动态库,该动态库又依赖第三方库

qt下依赖于第三方库生成的动态库的调用概述基于声网的sdk如何在自己的动态库中使用使用基于第三方库的动态库下面看pro文件中的设置概述 初次使用mac上的qtCreator生成动态库,该动态库编写时调用了第三方库,基于生成的该动态库,编写测试程序…

版本回退

现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: i am gblfy i am yuxin然后,【工作区】-【暂存区】-【本地仓库】尝试提交: 修改…

Docker精华问答 | 数据库为什么不适合放在 Docker 中运行?

戳蓝字“CSDN云计算”关注我们哦!Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。今天就让我们一起看看关于Docker …

Mac下使用macdeployqt打包qt程序:

概述 初次在Mac上使用qt的macdeployqt来打包生成的可执行程序,这里记录下。由于我的程序是调用之前生成的qt动态库,而动态库又依赖于第三方库,相对于没有库文件依赖的程序,这里有一些需要注意的点,下面是打包的步骤。…

路透社:谷歌已停止与华为部分合作;联想否认断供华为PC;微软计划直供Linux内核;谷歌无人机快递Wing进军芬兰……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 阿里巴巴联合欧莱雅发布移动…

管理修改

现在,假定你已经完全掌握了暂存区的概念。下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。 你会问,什么是修改? 比如你新增了一行&#x…

npm install安装依赖报错——常见报错解决方案

小伙伴在开发前端项目过程中,执行npm install安装项目依赖时,往往会遇到各种各样的报错,接下来建仔给大家总结一下几种常见报错解决方案! 第一种报错:无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 报错详…

AWS CEO Andy Jassy 专访:我们一直思考的是未来 2-5 年的事 | 人物志

戳蓝字“CSDN云计算”关注我们哦!人物志:观云、盘点、对话英雄。以云计算风云人物为核心,聚焦个人成长、技术创新、产业发展,还原真实与鲜活!本文来源:Siliconangle《Exclusive interview: How CEO Andy Ja…

撤销修改

自然,你是不会犯错的。不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行: Im writing a report.在你准备提交前,一杯咖啡起了作用,你猛然发现了stupid boss可能会让你丢掉这个月的奖金…

QtCreator下使用c++标准输入cin输出cout没有阻塞等待输入

引言 在QtCreator中编写c程序,其中需要从控制台输入,就用了c的cout和cin,本应该等待控制台输入文本,但是却没有。下面是具体的案例。 案例 本文基于QtCreator创建的qt控制台输出程序,创建时选择如下图所示的选项&am…

Docker 系列学习文章 | 什么是容器云?

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!作者:宝哥devops运维转自:云加社区腾小云导读:容器…

删除文件

在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交: echo "test del file" >> test.txt git add test.txt git commit -m "add del test.txt"一般情况下,…

mvc设计模式的简单领悟

引言 mvc设计模式,是将数据模型与视图分离,通过控制器来建立起数据模型与视图之间的联系,当数据模型变化自动更新视图。其中M-数据模型,V-视图,C-控制器。下面是一个简单的对于MVC设计模式的使用。 示例 开发环境是…

添加远程库

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得…

微服务精华问答 | 什么是金丝雀释放?

戳蓝字“CSDN云计算”关注我们哦!微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。今天,就让我们来看看关于微服务更加有深度的问题吧。1Q:什么是金丝雀释放?A:Canary Rele…

Git 远程配置

Git 配置篇02_远程配置 git 远程配置 2种方案 码云 Github 案例演示 码云 Github更改用户名和邮箱即可 任选1种 第1步:生成SSH key 输入下边命令一直回车(4次回车) ## 码云配置方案: ssh-keygen -t rsa -C "13396492261163…