首頁  >  文章  >  後端開發  >  用Python展示全國大學的分佈狀況

用Python展示全國大學的分佈狀況

王林
王林轉載
2023-04-11 20:04:251540瀏覽

用Python展示全國大學的分佈狀況

資料取得

要展示大學的分佈情況,就得先取得全國大學的位置資料。本文的資料來自於掌上高考網(https://www.gaokao.cn/school/search)。

用Python展示全國大學的分佈狀況

在2022年6月寫本文時,共獲取了2822所高校的資訊。檢查了數據,除了極個別空值外,整個數據是非常完整的,不影響使用。資料一共有44個字段,本文只會用幾個字段,可以不做處理,使用時按需獲取即可。

用Python展示全國大學的分佈狀況

資料獲取方法介紹(基礎爬蟲知識):

#1.註冊登入掌上高考網。在頁面選擇全部學校。

2.按F12鍵,點選到Network > Fetch/XHR,然後點選幾次頁面的、按鈕,在XHR的頁面會顯示所存取的API等資訊。

3.將每次翻頁時的API複製出來進行對比,發現翻頁時變化的參數有兩個:page和signsafe ,page為目前存取的頁數,signsafe是一個md5值,沒法反解,但可以把前面幾次的值保存下來,後面隨機變化使用。有了這個訊息,不斷改變訪問的頁數和signsafe值,就可以獲得所有的學校數據。

Response中的numFound參數值是學校總數,除以每頁顯示的學校個數可以得到總頁數,也可以直接點擊頁面的查看總頁數,這樣就確定了訪問的次數。

4.因為網站需要登入才能使用,所以也要取得造訪時的Headers,如Request Method(此次用POST)、User -Agent等。

5.有了上面的信息,循環拼接出所有頁面的url,用requests發送請求即可獲取到所有高校的數據,然後用pandas將資料寫到excel。

溫馨提示:取得資料時需遵守網站的相關聲明,爬蟲程式碼盡量設定一定的時間間隔,不要在造訪高峰期運行爬蟲代碼。

補充說明:

人民網最新公佈:全國的普通高校數是2759所,與本文從掌上高考網所獲得的2822所相差63所,主要是部分學校的分校統計方式不同所造成的差異。本文所展示的是分佈情況,而這個差異的影響不大。

用Python展示全國大學的分佈狀況


#經緯度取得

掌上高考網是為高考填志工服務的網站,雖然取得的資料有44個字段,但裡面並沒有學校的經緯度。為了更好地在地圖上顯示高校位置, 需要根據學校的地址取得對應的經緯度。

本文使用百度地圖開放平台:https://lbsyun.baidu.com/apiconsole/center#/home,可以用百度地圖的開放介面取得地理位置的經緯度。

使用步驟為:

#

1.註冊登入百度帳號,這個帳號可以是整個百度生態通用的帳號(如網盤、文庫等的帳號是通用的)。

2.登入百度地圖開放平台,點擊進入,然後在中點擊,再點擊建立一個應用程式。套用名稱自訂,其他資訊依提示和要求填寫完整,並進行實名認證,成為個人開發者。

用Python展示全國大學的分佈狀況


#3.已建立應用程式完成後,會得到一個應用的,用這個AK值可以呼叫百度的API,參考程式碼如下。

import requests


def baidu_api(addr):
url = "http://api.map.baidu.com/geocoding/v3/?"
params = {
"address": addr,
"output": "json",
"ak": "复制你创建的应用AK到此"
}
req = requests.get(url, params)
res = req.json()
if len(res["result"]) > 0:
loc = res["result"]["location"]
return loc
else:
print("获取{}经纬度失败".format(addr))
return {'lng': '', 'lat': ''}

4.成功呼叫百度地圖API後,讀取所有高校的位置,依序呼叫上面的函數,取得所有高校的經緯度,重新寫入excel。

import pandas as pd
import numpy as np


def get_lng_lat():
df = pd.read_excel('school.xlsx')
lng_lat = []
for row_index, row_data in df.iterrows():
addr = row_data['address']
if addr is np.nan:
addr = row_data['city_name'] + row_data['county_name']
# print(addr)
loc = baidu_api(addr.split(',')[0])
lng_lat.append(loc)
df['经纬度'] = lng_lat
df['经度'] = df['经纬度'].apply(lambda x: x['lng'])
df['纬度'] = df['经纬度'].apply(lambda x: x['lat'])
df.to_excel('school_lng_lat.xlsx')

最終資料結果如下圖:

用Python展示全國大學的分佈狀況

#個人開發者使用百度地圖開放平台時需注意,每天有額度限制,所以調試程式碼時先不要​​用所有數據,先用demo跑通,否則得等一天或購買額度。

用Python展示全國大學的分佈狀況

# 大學位置展示



#數據準備好了,接下來將他們展示到地圖上。

本文使用百度開源的資料視覺化工具Echarts,Echarts為Python語言提供了pyecharts函式庫,使用很方便。

用Python展示全國大學的分佈狀況安裝指令:

pip install pyecharts

1.標註高校的位置

from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType
import pandas as pd

def multi_location_mark():
"""批量标注点"""
geo = Geo(init_opts=opts.InitOpts(bg_color='black', width='1600px', height='900px'))
df = pd.read_excel('school_lng_lat.xlsx')
for row_index, row_data in df.iterrows():
geo.add_coordinate(row_data['name'], row_data['经度'], row_data['纬度'])
data_pair = [(name, 2) for name in df['name']]
geo.add_schema(
maptype='china', is_roam=True, itemstyle_opts=opts.ItemStyleOpts(color='#323c48', border_color='#408080')
).add(
'', data_pair=data_pair, type_=GeoType.SCATTER, symbol='pin', symbol_size=16, color='#CC3300'
).set_series_opts(
label_opts=opts.LabelOpts(is_show=False)
).set_global_opts(
title_opts=opts.TitleOpts(title='全国高校位置标注图', pos_left='650', pos_top='20',
title_textstyle_opts=opts.TextStyleOpts(color='white', font_size=16))
).render('high_school_mark.html')

用Python展示全國大學的分佈狀況從標註結果來看,大學主要分佈沿海、中部和東部,西部尤其是高海拔地區分佈相對較少。

2.繪製高校分佈熱力圖

#
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import ChartType
import pandas as pd

def draw_location_heatmap():
"""绘制热力图"""
geo = Geo(init_opts=opts.InitOpts(bg_color='black', width='1600px', height='900px'))
df = pd.read_excel('school_lng_lat.xlsx')
for row_index, row_data in df.iterrows():
geo.add_coordinate(row_data['name'], row_data['经度'], row_data['纬度'])
data_pair = [(name, 2) for name in df['name']]
geo.add_schema(
maptype='china', is_roam=True, itemstyle_opts=opts.ItemStyleOpts(color='#323c48', border_color='#408080')
).add(
'', data_pair=data_pair, type_=ChartType.HEATMAP
).set_series_opts(
label_opts=opts.LabelOpts(is_show=False)
).set_global_opts(
title_opts=opts.TitleOpts(title='全国高校分布热力图', pos_left='650', pos_top='20',
title_textstyle_opts=opts.TextStyleOpts(color='white', font_size=16)),
visualmap_opts=opts.VisualMapOpts()
).render('high_school_heatmap.html')

從熱力圖看,大學分佈較集中的地方主要是沿海、北上廣、長江黃河流域,西部較多的地方只有川渝。

用Python展示全國大學的分佈狀況

3.繪製按省劃分的分佈密度圖

from pyecharts.charts import Map
from pyecharts import options as opts
import pandas as pd


def draw_location_density_map():
"""绘制各省高校分布密度图"""
map = Map(init_opts=opts.InitOpts(bg_color='black', width='1200px', height='700px'))
df = pd.read_excel('school_lng_lat.xlsx')
s = df['province_name'].value_counts()
data_pair = [[province, int(s[province])] for province in s.index]
map.add(
'', data_pair=data_pair, maptype="china"
).set_global_opts(
title_opts=opts.TitleOpts(title='全国高校按省分布密度图', pos_left='500', pos_top='70',
title_textstyle_opts=opts.TextStyleOpts(color='white', font_size=16)),
visualmap_opts=opts.VisualMapOpts(max_=200, is_piecewise=True, pos_left='100', pos_bottom='100',textstyle_opts=opts.TextStyleOpts(color='white', font_size=16))
).render("high_school_density.html")

從省級分佈密度圖可以看出,高校數量多的省份集中在中部和東部,尤其是北京和上海附近的幾個省。

4.211和985高校的分佈情況

用Python展示全國大學的分佈狀況

篩選出211和985的高校數據,再繪製一次。 (程式碼不重複貼上,只需要加一行篩選程式碼即可)

########################以上就是本文的全部內容。 ######

以上是用Python展示全國大學的分佈狀況的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除