Pyechartsの「視覚化大画面」、「2020年東京オリンピック」を追体験し、生放送を見ずにすべてを知ってください!

この記事を他人が複製することは禁止されており、違反者は責任を問われます。

コンテンツ

  1.プロジェクト
  の背景2.クロールオリンピック関連情報
   ①関連ライブラリのインポート②クローラーコードの
   完全な説明3.データ前処理①データ置換②データグループ化③中国語と英語の名前マッピング変換4.ビジュアル表示①2020東京オリンピック金メダル分布図②2020年東京オリンピックメダルリスト詳細積み上げ縦棒グラフ③東京2020オリンピックメダルリストトップ10④東京2020東京オリンピック金メダルリストトップ10中国人選手が1日あたりに獲得したメダル数の線グラフ
  
   
   
   
  
   
   
   
   
   
   
   
   
   

全体のアイデア

ここに画像の説明を挿入

1.プロジェクトの背景

オリンピックが終わったばかりですが、2020年の東京オリンピックを見たことがありますか?この記事では、オリンピックの関連情報をクロールし、大きなビジュアル画面を使用してオリンピックの詳細を表示します。オリンピックに注意を払っていない友人に、オリンピックを数秒で理解させましょう。

この記事を学んだ後、次の大画面の視覚化を行う方法を学びます。
ここに画像の説明を挿入

2.オリンピックに関連するクロール情報

  • クロールフィールド:国、国ID、ランキング、金メダルの数、銀メダルの数、銅メダルの数、メダルの総数、プロジェクト名、選手、賞の種類、賞の時間。
  • クロール手順: 2つのインターフェース[json形式のデータ]のデータクロールに基づいて、関連するデータがキーと値のペアを使用して直接取得されます。
  • 使用したツール:パンダ+リクエスト

この記事は两个接口、比較的簡単なデータクロールに基づいています。

# 这个链接主要展示:各国的金银铜牌及其总数!
https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609

# 这个链接主要展示:每个参赛队员的参赛项目和获得的奖牌情况!
https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609

①関連ライブラリをインポートする

import requests
import pandas as pd
from pprint import pprint
  • requestsライブラリは、Webページ要求を開始し、Webページのソースコードを取得するために使用されます。
  • pandasライブラリは、取得した情報を保存および読み取るために使用されます。
  • pprintライブラリはかなり印刷されており、json形式のデータの場合、構造を非常によく表示できます。これは、解析に便利です。

②爬虫類の説明

url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
data = requests.get(url).json()
pprint(data)

Webページのソースコードは3行のコードで取得できます。pprintライブラリを使用すると、json構造を明確に表示できるため、データの解析に非常に役立ちます。
ここに画像の説明を挿入
この図から、必要なデータがbodyキーの下のallMedalDataキーに存在することがはっきりとわかります。allMedalDataキーの値はリストであり、辞書で構成されるキーと値のペアの情報が多数含まれています。これがデータです。クロールしたい。

キーを使用して、対応する値情報を直接取得します。コードは次のとおりです。

df1 = pd.DataFrame()
for info in data1['body']['allMedalData']:
    name = info['countryName']
    name_id = info['countryId']
    rank = info['rank']
    gold = info['goldMedalNum']
    silver = info['silverMedalNum']
    bronze = info['bronzeMedalNum']
    total = info['totalMedalNum']
    # 组织数据
    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    # 然后追加df
    df1 = df1.append(orangized_data)
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
df1

結果は次のとおり
ここに画像の説明を挿入
です。別のWebページでも同じことを行います。

url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
data2 = requests.get(url).json()
pprint(data2)

結果は次のとおりです
ここに画像の説明を挿入
。構造は今より明確に感じられますか?

df2 = pd.DataFrame()
for info in data2['body']['medalTableDetail']:
    english_name = info['countryName']
    name_id = info['countryId']
    award_time = info['awardTime']
    item_name = info['bigItemName']
    sports_name = info['sportsName']
    medal_type = info['medalType']
    # 组织数据
    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    # 然后追加df
    df2 = df2.append(orangized_data)
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
df2

結果は次のとおりです。
ここに画像の説明を挿入

3.データの前処理

クロールされたデータの場合、問題が発生することがよくあります。その後の視覚的な表示を容易にするために、事前にデータを前処理する必要があります。

①データ置換

上記のクロールされたデータに対して、データフィルターを実行します。

df1 = pd.read_excel("各国奖牌数.xlsx")
df1[df1["名称"].str.contains("中国")]

結果は次のとおりです。
ここに画像の説明を挿入
香港、中国、台湾、中国はどちらもオリンピックに単独で参加しましたが、いずれも中国に属しています。IDを中国に、IDを26に変更しました。

df1["名称"].replace(["中国台北","中国香港"],"中国",inplace=True)
df1["ID"].replace([31,38],26,inplace=True)
df1[df1["名称"].str.contains("中国")]

結果は次のとおりです。
ここに画像の説明を挿入

②データのグループ化

上記の処理の後、中国は3つのデータを持つことに相当します。名称+IDこれを結合フィールドとして使用し、グループ化してから、合計して3つのデータを結合します。最後に、フィールドに基づいて、金牌降順で並べ替えます。

df2 = df1.groupby(["名称","ID"])[["金牌","银牌","铜牌","奖牌总数"]].sum().reset_index().sort_values(by="金牌",axis=0,ascending=False)
df2.head(10)

結果は次のとおりです。
ここに画像の説明を挿入

③中国語と英語の名前マッピング変換

pyechartsを使用して世界地図を描画する場合、名前は英語である必要があるため、中文名称ここではとしてマップする必要があります英文名称そこで、インターネットで次のファイルを見つけました。
ここに画像の説明を挿入
必要なのは、それをテーブル内のデータと組み合わせて作成することだけ映射转换です。最初にExcelファイルに変換して、後で直接使用できるようにします。

with open("国家名中英文对照表.txt","r",encoding="utf-8") as f:
    x = f.read()

df3 = pd.DataFrame()
for i in x.split("\n"):
    x = i.split(":")[0].strip()
    y = i.split(":")[1].strip()
    orangined_data = [[x,y]]
    df3 = df3.append(orangined_data)
df3.columns = ["名称","英文名称"]
df3.to_excel("国家名中英文对照表.xlsx",index=None)

次に、上記のdf2テーブルを使用して1つ実行します左连接

df4 = pd.merge(df2,df3,on="名称",how="left")
df4

結果は次のとおりです。
ここに画像の説明を挿入

4.ビジュアルディスプレイ

視覚化部分については、pyechartsライブラリを使用します。このパートは、次の8つのトピックに分かれています。

  • ①2020年東京オリンピックの各国のメダル分布図。
  • ②2020年東京オリンピックのメダル順位の詳細。
  • ③2020年東京オリンピックのメダル順位トップ10。
  • ④2020年東京オリンピックの金メダルリストのトップ10。
  • ⑤2020年東京オリンピックでの各中国イベントの賞の詳細。
  • ✧中国のプレーヤーが毎日獲得したメダルの数。
  • ✧中国のプレーヤーが毎日獲得した金メダルの数。
  • ⑧金メダルを獲得した中国人選手の詳細データ。

①2020年東京オリンピックの国別金メダルの分布図

ここに画像の説明を挿入

②2020年東京オリンピックのメダル順位の詳細

ここに画像の説明を挿入

③2020年東京オリンピックメダル順位トップ10

ここに画像の説明を挿入

④2020年東京オリンピック金メダルリストトップ10

ここに画像の説明を挿入

⑤2020年東京オリンピック中国の受賞歴のある詳細

ここに画像の説明を挿入

✧中国の選手が獲得したメダルの1日あたりの数

ここに画像の説明を挿入

✧中国の選手が獲得した金メダルの1日あたりの数

ここに画像の説明を挿入

⑧中国人選手が金メダルを獲得した詳細データ

ここに画像の説明を挿入

⑨大きなビジュアル画面への組み合わせ

ここに画像の説明を挿入
注:ここでは結果の分析は行いません。上の写真から、2020年の東京オリンピックを見たことがなくても、誰もが明確に理解できるはずだと思います。

おすすめ

転載: blog.csdn.net/weixin_41261833/article/details/119762965