Supplement 1 Webスクレイピングの一括処理

140 Views

March 06, 25

スライド概要

「#33 Section 2 URLからデータを読み込む」、「#34 Section 3 データの修正・保存」に関しては、URLからひとつづつExcelファイルを読み込み・修正・保存していきましたが、forループを用いて一括で処理することができます。

レベルが高くなりますが、このような処理はよく遭遇しますので、チャレンジしていきましょう。

コードセルに多くの行のコードが並ぶと、ちょっとビビってしまいますね。

はじめから、このようなコードを書ける人はいないのでご安心を!

みんな、先輩から教わったり、WEBやGitHubで見つけたコードをコピペして必要な修正を加えて、少しづつ慣れて、理解し、コードが描けるようになります。

見ただけで難しいと判断して放り出さず、解説の文章だけでも読んでみてください。同じような処理をすることがあったら思い出すことがあると思います。若干の修正を施し、「ctrl」+「enter」でコードが走った時には、爽快感とともに、あなたの実力もアップしているはずです。

profile-image

すべてのビジネスパーソンが意思決定プロセスにデータを活用する思考を身につけ、ブルシットジョブをこの世からなくしていきましょう!

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

1 3rd STEP 応用編 医療 Supplement 1 Webスクレイピングの一括処理 95 for k, v in data.items(): 96 f”文字列1 {変数} 文字列2”

2.

2 「#33 Section 2 URLからデータを読み込む」、「#34 Section 3 データの修正・ 保存」に関しては、URLからひとつづつExcelファイルを読み込み・修正・保存していきま したが、forループを用いて一括で処理することができます。 レベルが高くなりますが、このような処理はよく遭遇しますので、チャレンジしていきましょう。 コードセルに多くの行のコードが並ぶと、ちょっとビビってしまいますね。 はじめから、このようなコードを書ける人はいないのでご安心を! みんな、先輩から教わったり、WEBやGitHubで見つけたコード をコピペして必要な修正を加えて、少しづつ慣れて、理解し、 コードが書けるようになります。 見ただけで難しいと判断して放り出さず、解説の文章だけ でも読んでみてください。同じような処理をすることがあったら 思い出すことがあると思います。若干の修正を施し、 「ctrl」+「enter」でコードが走った時には、爽快感と ともに、あなたの実力もアップしているはずです。

3.
[beta]
3
Supplement 1 Webスクレイピングの一括処理

Webスクレイピングの一括処理の全プログラム

(1)前半 処理の対象(イテラブルオブジェクト)の部分
data = {
"H26": [
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000139842.xlsx", "内服外来院内"),
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000139844.xlsx", "内服外来院外"),
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000139846.xlsx", "内服入院"),
],
………………………………….

"H27": [
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000177288.xlsx", "内服外来院外"),
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000177290.xlsx", "内服外来院内"),
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000177292.xlsx", "内服入院"),
],
"R3": [
("https://www.mhlw.go.jp/content/12400000/001122627.xlsx", "内服外来院外"),
("https://www.mhlw.go.jp/content/12400000/001122629.xlsx", "内服外来院内"),
("https://www.mhlw.go.jp/content/12400000/001122631.xlsx", "内服入院"),
],
}

※ プログラムを書く時は、フォント「Ricty Diminished」が見やすいですね!

4.

4 Supplement 1 Webスクレイピングの一括処理 URL一覧 「薬剤」→「都道府県別薬効分類別数量」→「内服薬」のExcelファイルが格納してあるURL 一覧は、下記のようになります。 このURL一覧は、下記からダウンロードできます。 https://docs.google.com/spreadsheets/d/12LcE067zroTxUihek7xO2qjrylyRQNVe /edit?usp=drive_link&ouid=1 06292536926943509337&rtpof=true&sd=true 回数/年度 第1回 H26 第2回 H27 第3回 H28 第4回 H29 第5回 H30 第6回 H31 第7回 R2 第8回 R3 期間 平成26年4月~平成 27年3月診療分 平成27年4月~平成 28年3月診療分 平成28年4月~平成 29年3月診療分 平成29年4月~平成 30年3月診療分 平成30年4月~平成 31年3月診療分 データ名 令和3年4月~令和4 年3月診療分 ファイル名 https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000139842.xlsx H26_内服外来院内 内服 外来(院外)都道府県別薬効分類別数量[1,007KB] https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000139844.xlsx H26_内服外来院外 内服 入院 都道府県別薬効分類別数量[874KB] https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000139846.xlsx H26_内服入院 内服 外来(院外)_都道府県別薬効分類別数量[2,210KB] https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000177288.xlsx H27_内服外来院外 内服 外来(院内)_都道府県別薬効分類別数量[2,050KB] https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000177290.xlsx H27_内服外来院内 内服 入院_都道府県別薬効分類別数量[1,808KB] https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000177292.xlsx H27_内服入院 内服 外来(院外)_都道府県別薬効分類別数量[2,096KB] https://www.mhlw.go.jp/content/12400000/000347791.xlsx H28_内服外来院外 内服 外来(院内)_都道府県別薬効分類別数量[1,912KB] https://www.mhlw.go.jp/content/12400000/000347793.xlsx H28_内服外来院内 内服 入院_都道府県別薬効分類別数量[1,703KB] https://www.mhlw.go.jp/content/12400000/000347795.xlsx H28_内服入院 内服 外来(院外)_都道府県別薬効分類別数量 [2,079KB] https://www.mhlw.go.jp/content/12400000/000730486.xlsx H29_内服外来院外 内服 外来(院内)_都道府県別薬効分類別数量 [1,889KB] https://www.mhlw.go.jp/content/12400000/000730489.xlsx H29_内服外来院内 内服 入院_都道府県別薬効分類別数量 [1,688KB] https://www.mhlw.go.jp/content/12400000/000730491.xlsx H29_内服入院 内服 外来(院外)_都道府県別薬効分類別数量 [2,117KB] https://www.mhlw.go.jp/content/12400000/000560109.xlsx H30_内服外来院外 内服 外来(院内)_都道府県別薬効分類別数量 [1,921KB] https://www.mhlw.go.jp/content/12400000/000560111.xlsx H30_内服外来院内 内服 入院_都道府県別薬効分類別数量 [1,719KB] https://www.mhlw.go.jp/content/12400000/000560113.xlsx H30_内服入院 内服 外来(院外)_都道府県別薬効分類別数量 [2,105KB] https://www.mhlw.go.jp/content/12400000/000821761.xlsx H31_内服外来院外 https://www.mhlw.go.jp/content/12400000/000821765.xlsx H31_内服外来院内 https://www.mhlw.go.jp/content/12400000/000821767.xlsx H31_内服入院 内服 外来(院外)_都道府県別薬効分類別数量 [2,070KB] https://www.mhlw.go.jp/content/12400000/000987610.xlsx R2_内服外来院外 内服 外来(院内)_都道府県別薬効分類別数量 [1,849KB] https://www.mhlw.go.jp/content/12400000/000987613.xlsx R2_内服外来院内 内服 入院_都道府県別薬効分類別数量 [1,672KB] https://www.mhlw.go.jp/content/12400000/000987615.xlsx R2_内服入院 内服 外来(院外)_都道府県別薬効分類別数量 [1MB] https://www.mhlw.go.jp/content/12400000/001122627.xlsx R3_内服外来院外 内服 外来(院内)_都道府県別薬効分類別数量 [1MB] https://www.mhlw.go.jp/content/12400000/001122629.xlsx R3_内服外来院内 内服 入院_都道府県別薬効分類別数量 [1MB] https://www.mhlw.go.jp/content/12400000/001122631.xlsx R3_内服入院 平成31年4月~ 令和 内服 外来(院内)_都道府県別薬効分類別数量 [1,908KB] 2年3月診療分 内服 入院_都道府県別薬効分類別数量 [1,718KB] 令和2年4月~令和3 年3月診療分 データ名 内服 外来(院内) 都道府県別薬効分類別数量[948KB]

5.
[beta]
5
Supplement 1 Webスクレイピングの一括処理

Webスクレイピングの一括処理の全プログラム
(2)後半

forループの部分

for year, urls in data.items():
for url, location_type in urls:
df = pd.read_excel(url, skiprows=[0, 1, 3]
, dtype={"薬効\n分類": "object", "医薬品\nコード": "object"
, "後発品\n区分": "object"})
df[["薬効\n分類", "薬効分類名称"]] = df[["薬効\n分類", "薬効分類名称"]].fillna(method="ffill")
df = df.rename(columns={"薬効\n分類": "薬効分類", "医薬品\nコード": "医薬品コード"
, "薬価基準収載\n医薬品コード": "薬価基準収載医薬品コード"
, "後発品\n区分": "後発品区分"})
df[["年度", "剤型_場所"]] = [year, location_type]
file_path = f'/content/drive/MyDrive/Colab Notebooks/医療/データ2/{year}_{location_type}.csv'
df.to_csv(file_path, index=False)

6.

6 Supplement 1 Webスクレイピングの一括処理 Webスクレイピングの一括処理の全プログラム (3)フォルダーとノートブックの作成 分析に使ったデータ「naihuku.csv」と今回作 成していくデータ「naihuku_new.csv」を比 較して同じものかどうか確かめたいと思います。 そのため、一括処理で作成した中間データを 保管しておくフォルダー「データ2」を右記のよう に作成しておきます。 また、今回のコードを書いていくノートブックも新 しく作ります。「Supplement」と名付けましょ う。

7.

7 Supplement 1 Webスクレイピングの一括処理 1.forループを使った一括処理の概要 今回の一括処理は、 「#35 Section 4 データの結合」で説明した「forループ」を2回 使います。 要素を逐次受け取る変数で、通常「i」を用いますが、 今回は、変数が2つあるのでそれぞれに適当な名前を 付けておきます。 87 for イテレーター in イテラブルオブジェクト : 処理1 処理2 ・・・ 要素を1つずつ取り出して処理できるような オブジェクトで、リスト、辞書、タプルなどを 指します。 今回は、各年度ごとに対応するExcelファイルの URLとファイル名の辞書を使います。

8.
[beta]
8
Supplement 1 Webスクレイピングの一括処理

2.イテラブルオブジェクトを作成
まずは、イテラブルオブジェクトとして、各年度ごとに対応するExcelファイルのURLとファイ
ル名(「内服外来院外」、「内服外来院内」、「内服入院」)の辞書を使います。
この際、「年度」と「ファイル名」は文字型ですので「” ”」で囲います。

data = {
"H26": [
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000139842.xlsx", "内服外来院内"),
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000139844.xlsx", "内服外来院外"),
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000139846.xlsx", "内服入院"),
],
"H27": [
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000177288.xlsx", "内服外来院外"),
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000177290.xlsx", "内服外来院内"),
("https://www.mhlw.go.jp/file/06-Seisakujouhou-12400000-Hokenkyoku/0000177292.xlsx", "内服入院"),
],
"R3": [
("https://www.mhlw.go.jp/content/12400000/001122627.xlsx", "内服外来院外"),
("https://www.mhlw.go.jp/content/12400000/001122629.xlsx", "内服外来院内"),
("https://www.mhlw.go.jp/content/12400000/001122631.xlsx", "内服入院"),
],
}

9.

9 Supplement 1 Webスクレイピングの一括処理 プログラム解説1 辞書を使ったforループ 辞書は data = {キー1 : 値1, キー2 : 値2, キー3 : 値3, … } というような構造をしていますが、イテラブルオブジェクトが辞書の場合、forループで取り出 す要素は、次の3パターンになります。 ① キーのみを取り出す for k in data.keys(): もしくはfor k in data: ② 値のみを取り出す for v in data.values(): ③ キーと値の両方を取り出す 95 for k, v in data.items(): 今回は③を使います。

10.

10 Supplement 1 Webスクレイピングの一括処理 3.forループを作成(1) ① for year, urls in data.items(): ② for url, location_type in urls: ①を外側のループ、②を内側のループと呼びます。このように、for文を複数使うことを多重 ループと呼び、外側のループが一回まわるごとに、内側のループが全部回るというルールに 従って実行されていきます。 ① 外側のループは、2で作成した辞書「data」をイテラブルオブジェクトとし、キーと値の両 方を取り出しループに渡すために「.items()」を使います。 ② 内側のループは、 ①の外側のループから、特定の年に関連するurlsのリストを繰り返 し処理するものです。

11.

11 Supplement 1 Webスクレイピングの一括処理 4.処理1 Excelファイルの読み込み df = pd.read_excel(url, skiprows=[0, 1, 3] , dtype={"薬効\n分類“ : ”object” , ”医薬品\nコード” : ”object” , ”後発品\n区分” : ” object”}) 処理1は、各URLにあるExcelファイルを読み込み、dfというDataFrameを作成します。 その際、「skiprows」を使って各Excel ファイルの 1 行目、2 行目、4 行目をスキップ、 「dtype」を使って特定の列のデータ型を指定します。

12.

12 Supplement 1 Webスクレイピングの一括処理 5.処理2 欠損値を埋める df[["薬効\n分類", "薬効分類名称"]] = df[["薬効\n分類", "薬効分類名称"]].fillna(method="ffill") 処理2は、2つの列( 「薬効\n分類」 、「薬効分類名称」)の欠損値を埋めます。 その際、83を使います。 83 データ名["薬効分類"].fillna(method='ffill’) 「fillna(method=「ffill」) 」は、欠損値をその要素のすぐ前の値に置き換えます。

13.

13 Supplement 1 Webスクレイピングの一括処理 6.処理3 列名の変更 df = df.rename(columns={"薬効\n分類": "薬効分類“ , "医薬品\nコード": "医薬品コード“ , "薬価基準収載\n医薬品コード": "薬価基準収載医薬品コード“ , "後発品\n区分": "後発品区分"}) 処理3は、 DataFrame「df」のカラム名を変更します。 82 df.rename(columns={古い列名1:新しい列名1, ・・・) 改行文字「\n」の入ったカラム名を、意味のある名前に置き換えています。例えば、 「薬効\n分類」は 「薬効分類 」となります。

14.

14 Supplement 1 Webスクレイピングの一括処理 7.処理4 列を追加 df[["年度", "剤型_場所"]] = [year, location_type] 処理4は、DataFrameに2つの新しい列を追加する処理をしています。 「年度」と「剤型_場所」は、外側のループに出てきた「year」、内側のループに出てきた 「location_type」を列名としてわかりやすく置き換えた用語にしています。

15.

15 Supplement 1 Webスクレイピングの一括処理 プログラム解説1 f文字列(フォーマット文字列) f文字列を使うと直感的に変数や数値を埋め込むことが可能です。 96 f”文字列1 {変数} 文字列2”

16.

16 Supplement 1 Webスクレイピングの一括処理 8.処理5 ファイルの保管場所(パス)を指示、保管 ① ② ①は、ファイルの保管場所(パス)を指示しています。 保管場所の最後はファイル名となりますが、それはf文字列を使い「year」+「_(アンダーバー)」 +「location_type」と指示します。処理4で、「year」は「年度」に、「location_type」は「剤型 _場所」に置き換えていますので、ループを回すとファイル名も「年度_剤型_場所」 になります。 ②は、①で作成したファイルの保管場所にCSV ファイルを保存します。その際、「index=False」で DataFrameのインデックスがCSVファイルに保存されないように指定しておきます。これは、複数の 処理でインデックスがごちゃごちゃになっているからです。

17.

17 Supplement 1 Webスクレイピングの一括処理 9.処理5 ファイルの保管場所(パス)を指示、保管 ① ② ①は、ファイルの保管場所(パス)を指示しています。最初に作成したフォルダー「データ2」に保管 します。 保管場所の最後はファイル名となりますが、それはf文字列を使い「year」+「_(アンダーバー)」 +「location_type」と指示します。処理4で、「year」は「年度」に、「location_type」は「剤型 _場所」に置き換えていますので、ループを回すとファイル名も「年度_剤型_場所」 になります。 ②は、①で作成したファイルの保管場所にCSV ファイルを保存します。その際、「index=False」で DataFrameのインデックスがCSVファイルに保存されないように指定しておきます。これは、複数の 処理でインデックスがごちゃごちゃになっているからです。