Python爬虫实战,pyecharts模块,Python实

「这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战」。

前言

利用Python实现中国地铁数据可视化。废话不多说。

让我们愉快地开始吧~

开发工具

Python版本: 3.6.4

相关模块:

requests模块;

wordcloud模块;

pandas模块;

numpy模块;

jieba模块;

pyecharts模块;

matplotlib模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

本次通过对地铁线路数据的获取,对城市分布情况数据进行可视化分析。

分析获取

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

1.jpg

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

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

2.jpg

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

获取数据

部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
python复制代码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')

获取数据结果展示

3.jpg

3541个地铁站点

数据可视化

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
python复制代码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)

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

4.png

183条地铁线路

1
2
3
4
5
6
7
python复制代码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")

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

5.png

32个城市开通地铁

城市分布情况

6.jpg

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

线路数量分布情况

7.png

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

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

哪个城市哪条线路地铁站最多

8.png

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

9.png

10.png

去除重复换乘站数据

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

包含3034个地铁站

减少了近400个地铁站

11.png

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

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

武汉居然有那么多地铁站

12.png

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
python复制代码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)

展示词云图

13.jpg

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%