[pandas] 19. 複数のwebページからTable を取得しデータを集計する

Pandas

はじめに

pandasで複数のWebページから複数のTableを取得し、そのTableの一部のデータを集計する方法について紹介する。ここでは、例として、2019シーズンのサッカーくじtotoの結果を利用する。

解説

モジュールのインポート

webページからTableを読み込む

urlに読み込みたいTableが存在するwebページのurlを記載する。Tableの読み込みは、pd.read_html(url)でできる。DataFrameのリストが返ってくるので、リストをスライスして希望のTableを取得する。ここで取得したTableは下記のようになる。

開催日 競技場 予想チーム
開催日 競技場 No ホーム 試合結果 アウェイ くじ結果
0 12/07 埼玉 1 浦和 2-3 G大阪 2
1 12/07 アイスタ 2 清水 1-0 鳥栖 1
2 12/07 豊田ス 3 名古屋 0-1 鹿島 2
3 12/07 札幌ド 4 札幌 1-2 川崎 2
4 12/07 Eスタ 5 広島 1-0 仙台 1
5 12/07 ノエスタ 6 神戸 4-1 磐田 1
6 12/07 日産ス 7 横浜M 3-0 F東京 1
7 12/07 サンアル 8 松本 1-1 湘南 0
8 12/07 昭和電ド 9 大分 0-2 C大阪 2
9 12/08 とうスタ 10 福島 1-2 群馬 2
10 12/08 藤枝サ 11 藤枝 1-0 北九州 1
11 12/08 いわスタ 12 岩手 1-1 讃岐 0
12 12/08 長野U 13 長野 1-0 熊本 1

くじ結果の集計

くじ結果は一番右の列のデータなので、ilocを使ってそのデータをSeriesとして取得する。ilocによるデータの取得については下記で解説した。

[pandas] 4. DataFrameにおけるデータの選択(loc, iloc)
DataFrameにおいて、loc, ilocを用いてデータを選択する方法について説明する。

ここでは、得られたSeriesに対して、value_countsを用いて要素のカウントを行った。

得られたSeriesはマルチインデックスをもつSeriesであり、このままDataFrameにするとデータの選択に苦労するので、今のうちにカラム名を変更する。変更は、r_1141.rename(‘1141’)のようにすることでできる。
Seriesであるr_1141をpd.DataFrame(r_1141)でDataFrameに変換すると下記のようになる。
ちなみに、0が引き分けで1がホームチームの勝ち、2がアウェイチームの勝ちを意味する。

1141
1 6
2 5
0 2

for文による繰り返しによるデータの取得

上記のデータは1141回目のtotoの結果だったが、次は、2019シーズンの他の回のtotoの結果を取得する。

回数に該当する部分を+str(i)+として異なるwebページを選択する。
上記の方法で取得したデータをpd.concat([r_1141, df_result], axis=1)のようにすることでデータを追加していく。
concatによるデータの追加については下記で説明した。

[pandas] 14. Series, DataFrameの連結(.concat())
Series, DataFrameを連結することのできる.concat()について説明する。

最終的に得られるTableは下記のようになる。縦長グラフになるように.Tで転置したDataFrameを表示している。

0 1 2
1141 2.0 6.0 5.0
1140 2.0 8.0 3.0
1139 4.0 6.0 3.0
1137 1.0 3.0 9.0
1135 3.0 8.0 2.0
1134 2.0 6.0 5.0
1133 4.0 7.0 2.0
1131 3.0 6.0 4.0
1126 3.0 5.0 5.0
1125 7.0 3.0 3.0
1121 3.0 8.0 2.0
1119 5.0 6.0 2.0
1117 4.0 7.0 2.0
1115 4.0 3.0 6.0
1113 4.0 4.0 5.0
1111 4.0 5.0 4.0
1110 4.0 8.0 1.0
1108 1.0 7.0 5.0
1107 4.0 6.0 3.0
1106 NaN 6.0 7.0
1105 4.0 8.0 1.0
1104 5.0 6.0 2.0
1103 1.0 5.0 7.0
1101 2.0 8.0 3.0
1099 4.0 6.0 3.0
1098 4.0 6.0 3.0
1097 5.0 6.0 2.0
1096 2.0 7.0 4.0
1094 4.0 5.0 4.0
1092 2.0 8.0 3.0
1090 2.0 8.0 3.0
1088 5.0 4.0 4.0
1086 2.0 8.0 3.0
1084 4.0 2.0 7.0
1082 3.0 7.0 3.0
1079 4.0 3.0 6.0
1078 5.0 2.0 6.0
1077 1.0 7.0 5.0
1075 1.0 4.0 8.0
1073 1.0 6.0 6.0
1071 7.0 3.0 3.0

データの集計

.sum(axis=1)で0,1,2それぞれの合計値を取得することができる。

結果の表示

参考

pandas.Series.value_counts — pandas 2.2.3 documentation
pandas.concat — pandas 2.2.3 documentation
コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

コメント