大学の分布を表示するには、まず全国の大学の位置データを取得する必要があります。この記事のデータは Palm College Adopting Examing Network
から取得したもので、2022 年 6 月にこの記事を執筆した時点で、合計 2,822 の大学の情報が取得されました。データを確認すると、いくつかの null 値を除いて、データ全体が非常に完全であり、使用には影響しません。データには合計 44 のフィールドがあります。この記事ではいくつかのフィールドのみを使用します。フィールドを処理する必要はなく、使用時にオンデマンドで取得できます。
データ取得方法の紹介 (クローラーの基礎知識):
1. パーム大学入学試験に登録してログインします。通信網。 ページですべての学校を選択します。
2. F12 キーを押して、[ネットワーク] > [Fetch/XHR] をクリックし、 ページで と をクリックします。 , アクセスしたAPIやその他の情報がXHRページに表示されます。
3. 比較のためにページをめくるたびに API をコピーします。ページがめくるたびに変化するパラメータが 2 つあることがわかります: page と Signsafe です。Page は現在のページ数です。 md5 値を逆に解くことはできませんが、以前の値を保存して後でランダムに使用することはできます。この情報をもとに、訪問ページ数とサインセーフ値を常に変更することで、学校の全データを取得することができます。
レスポンスの numFound パラメータ値は、学校の総数です。各ページに表示される学校の数で割ると、総ページ数が得られます。 をクリックすることもできます。ページの総ページ数を表示するには、次のようにします: 訪問数が決定されます。
4. Webサイトを利用するにはログインが必要なので、アクセス時のリクエストメソッド(今回はPOSTを使用)やUser-Agentなどのヘッダーも取得する必要があります。 。
5. 上記の情報を使用して、すべてのページの URL をループアウトし、リクエストを使用してすべての大学のデータを取得するリクエストを送信し、パンダを使用してデータを Excel に書き込みます。
注意事項: データを取得するときは、Web サイトの関連する記述に従う必要があります。クローラ コードには一定の時間間隔を設定するようにしてください。ピーク時にはクローラ コードを実行しないでください。アクセス期間。
パーム大学入試ネットワークは、大学入学試験のボランティア活動を記入するための Web サイトです。取得されたデータには 44 のフィールドがありますが、学校の緯度と経度が含まれています。地図上で大学の位置をより適切に表示するには、学校の住所に基づいて対応する経度と緯度を取得する必要があります。
この記事では、Baidu Map のオープン プラットフォームを使用しています: https://lbsyun.baidu.com/apiconsole/center#/home. Baidu Map のオープン インターフェイスを使用して、経度と緯度を取得できます。地理的な場所のこと。
手順は次のとおりです:
1. Baidu アカウントに登録してログインします。このアカウントは、Baidu エコシステム全体の共通アカウント (たとえば、ネットワーク ディスク、ライブラリなどはユニバーサルです)。
2. Baidu Map Open Platform にログインし、クリックして に入り、 の をクリックし、次に アプリケーションを作成します。アプリケーション名をカスタマイズし、プロンプトおよび要求に応じてその他の情報を入力し、実名認証を実行して個人開発者になります。
3. アプリケーションを作成した後、アプリケーションの
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の呼び出しに成功したら、すべての大学の位置を読み取り、上記の関数を順番に呼び出して、すべての大学の経度と緯度を取得し、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')
最終的なデータ結果は次のとおりです:
個人開発者は、Baidu Map オープン プラットフォームを使用する際に注意する必要があります。1 日の割り当てがあります。制限があるため、最初にコードをデバッグするときは、すべてのデータを使用せず、最初にデモを実行してください。そうでない場合は、1 日待つか、クレジットを購入する必要があります。
データが準備できたので、地図上に表示してみましょう。
この記事では、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')
From採点結果 大学は主に海岸沿い、中部、東部に位置しており、西部、特に標高の高い地域には比較的少ないようです。
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')
## ヒート マップから、大学と大学の分布の場所がわかります。大学は主に沿岸地域、北部、上海、広州、長江、黄河流域に集中しており、西部の地域は四川省と重慶のみです。
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高校的分布情况
筛选出211和985的高校数据,再绘制一次。(代码不重复粘贴,只需要加一行筛选代码即可)
以上がPython を使用して全国の大学の分布を表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。