Python を使用して全国の大学の分布を表示する

王林
リリース: 2023-04-11 20:04:25
転載
1562 人が閲覧しました

Python を使用して全国の大学の分布を表示する

データの取得

大学の分布を表示するには、まず全国の大学の位置データを取得する必要があります。この記事のデータは、パーム大学入学試験ネットワーク (https://www.okao.cn/school/search) から取得しています。

Python を使用して全国の大学の分布を表示する

#この記事を書いている2022年6月時点では、合計2,822の大学情報を取得しました。データを確認すると、いくつかの null 値を除いて、データ全体が非常に完全であり、使用には影響しません。データには合計 44 のフィールドがあります。この記事ではいくつかのフィールドのみを使用します。フィールドを処理する必要はなく、使用時にオンデマンドで取得できます。

Python を使用して全国の大学の分布を表示する

データ取得方法の紹介 (クローラの基礎知識):


1. パーム大学入学試験ネットワークに登録してログインします。

ページですべての学校を選択します。

2. F12 キーを押して、[ネットワーク] > [フェッチ/XHR] をクリックし、

、## をクリックします。 #ボタンを数回押すと、アクセスしたAPI等の情報がXHRページに表示されます。
3. ページをめくるたびに API をコピーして比較してみると、ページをめくるたびに変化するパラメータが 2 つあることがわかります。 : page と signedsafe.、page は現在訪問しているページの数、signsafe は md5 値であり、デコードできませんが、以前の値を保存して後でランダムに使用できます。この情報をもとに、訪問ページ数とサインセーフ値を常に変更することで、学校の全データを取得することができます。

レスポンスの numFound パラメータ値は、学校の総数です。各ページに表示される学校の数で割ると、ページの総数が得られます。# を直接クリックすることもできます。ページ上の ## をクリックすると、合計ページ数が表示され、訪問数が決まります。


4. Webサイトを利用するにはログインが必要なため、アクセス時のリクエストメソッド(今回は POST)、User -Agent など。


5. 上記の情報を使用して、すべてのページの URL の結合をループし、リクエストを使用してすべてのページのデータを取得するリクエストを送信します。次に、パンダを使用してデータを Excel に書き込みます。


注意: データを取得するときは、Web サイトの関連する記述に従う必要があります。一定の時間間隔を設定するようにしてください。クローラー コードを定期的に実行してください。アクセスのピーク時には使用しないでください。

追加説明:

人民日報電子版の最新発表: 国内の一般大学の数は 2,759 校. この記事はポケット大学受験ネットワークからのものです 得られた2822校の差は63で、主に一部の学校の分校の統計方法の違いによるものです。この記事で示しているのは分布であり、この違いはほとんど影響しません。

Python を使用して全国の大学の分布を表示する

緯度と経度を取得する

# # パーム大学受験ネットワーク は大学受験ボランティアサービスを提供するサイトで、取得したデータは44項目ありますが、学校の経度・緯度は含まれていません。地図上で大学の位置をより適切に表示するには、学校の住所に基づいて対応する経度と緯度を取得する必要があります。

この記事では、Baidu Maps オープン プラットフォームを使用しています: https://lbsyun.baidu.com/apiconsole/center#/home、Baidu を使用できます。マップ 地理的位置の緯度と経度を取得するためのオープンインターフェイス。

手順は次のとおりです:

1. Baidu アカウントに登録してログインします。このアカウントは、Baidu エコシステム全体の共通アカウントにすることができます (ネットワーク ディスク、ライブラリなどのアカウントが共通です)。

2. Baidu Map Open Platform にログインし、クリックして を入力し、次に の をクリックして、 アプリケーションの作成をクリックします。アプリケーション名をカスタマイズし、プロンプトおよび要求に応じてその他の情報を入力し、実名認証を実行して個人開発者になります。

Python を使用して全国の大学の分布を表示する


3. アプリケーションを作成すると、アプリケーションが表示されます。 、この AK 値を使用して Baidu の 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. Baidu Map API の呼び出しに成功したら、すべての大学の位置を読み取り、上記の関数を順番に呼び出して、すべての大学の経度と緯度を取得します。それをエクセルに書き換えます。

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 を使用して全国の大学の分布を表示する

個人開発者は Baidu Map Open を使用する必要があります。プラットフォーム 1 日の割り当て制限があるため、コードをデバッグするときは、最初にすべてのデータを使用せず、最初にデモを使用してください。そうしないと、1 日待つか、割り当てを購入する必要があります。

Python を使用して全国の大学の分布を表示する

大学の所在地の表示

#データの準備ができたので、地図上に表示します。


この記事では、Baidu のオープン ソース データ視覚化ツール Echarts を使用します。Echarts は、非常に使いやすい Python 言語用の pyecharts ライブラリを提供します。


#インストール コマンド:

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")
ログイン後にコピー

省分布密度マップから、多くの大学がある省が国の中部と東部、特に北京と上海に近いいくつかの省に集中していることがわかります。

Python を使用して全国の大学の分布を表示する

4. 211 および 985 の大学の分布

211 および 985 の大学のデータをフィルタリングして、大学に行って、もう一度描きます。 (コードを繰り返し貼り付ける必要はありません。フィルター コードの行を追加するだけです)


以上が記事の内容全体です。 Python を使用して全国の大学の分布を表示する

以上がPython を使用して全国の大学の分布を表示するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート