Lean Baseball

No Engineering, No Baseball.

仕事する前に知っておくと幸せかもしれないpandasのきほん - read関数にはとりあえずURL渡しておけ

f:id:shinyorke:20210620143733p:plain

お仕事や, (個人的には)趣味のデータ分析・開発などでpandasをよく使う人です.

pandasはPythonでデータサイエンスやデータ分析(解析)をやってると必ずと言っていいほどよく使うライブラリだと思います.

お仕事で同僚やインターンが書いたnotebookをよく読む(レビューする)のですが,

  • 煩雑なことやってるけどこれ一行で書けるやで
  • 最初からデータを整理するとそんな面倒くさいことしなくても大丈夫やで

...といったコメントを返す機会が増えてきました.

これらは当人たちにフィードバックしているのですが, このフィードバックの内容が案外重要な気がしてきたのでブログに書いてみることにしました.

読んだ方の理解・生産性の向上および, 「つまらない仕事が334倍楽になる」ような感じにつながると嬉しいです🙏

TL;DR

pandasのread関数にはとりあえずURLを渡しておけ

&使うカラムは事前に指定すると仕事は楽になるでしょう

おしながき

対象読者&サンプル

対象読者は,

何かしらでpandasを使ってデータ分析やデータ加工の業務・趣味をしている方

となります.

pandasもPython周りの事も初心者レベルの内容にしています.

また, 今回のコードはGoogle Colabratoryにサンプルを用意しています.

このエントリーのサンプルコード(colab)

read関数にはとりあえずURLを

pandasでDataFrameを作るときの方法として,

  • df = pd.DataFrame() でDataFrameオブジェクトを作る
  • 元データのフォーマットに合わせて, pd.read_hoge() 的なメソッドからDataFrameオブジェクトを作る

この2つの方法がありますが,

pd.read_hoge() からやる場合, ほぼほぼURLを渡せばいい感じにしてくれます.

使う機会が多そうな,

を例に紹介します.

read_csv

名前の通り, csvを読み込んでDataFrameを作る関数です.

「ネット上で公開されているCSVデータをDataFrameにする」ようなコードを書く場合, ひとまず手元にダウンロードして...と考える機会が多いかと思います.

こんな感じです.

# メジャーリーグのオープンデータCSV(GitHubで公開されている)をDataFrameにする

import urllib.request

url = 'https://github.com/chadwickbureau/baseballdatabank/raw/master/core/Batting.csv'
filename = 'Batting.csv'

urllib.request.urlretrieve(url, filename)

df = pd.read_csv(filename)

これはこれで正解ですが, ネット上のCSVであればこれでいけます.

# read_csvはURLを直接渡してもいい感じにしてくれます
df = pd.read_csv('https://github.com/chadwickbureau/baseballdatabank/raw/master/core/Batting.csv')

自分でわざわざダウンロードしてからやる必要はありません.

どちらも結果は同じです.

read_json

read_jsonも同様の方法でいけます.

connpassのAPIからデータを取ってきてDataFrameにするサンプルです.

(注:ひとまずDataFrameにしてるだけです)

# requestsを予めinstallしてるとして

import requests

url = 'https://connpass.com/api/v1/event/?keyword=pandas'
response = requests.get(url)

df = pd.DataFrame(response.json())

これも一行で終わります.

df = pd.read_json('https://connpass.com/api/v1/event/?keyword=pandas')

一度DataFrameにしたあとに, 好きな形式のデータに加工してあげればOKです.

read_excel

同じ様にread_excelもいけます.

$ pip install openpyxl xlrd

これでread_excelを使う準備を整えた後,

# 国勢調査のオープンデータ(Excel)をダウンロードしてDataFrameに
df = pd.read_excel('https://www.e-stat.go.jp/stat-search/file-download?statInfId=000032087414&fileKind=0')

これでおしまいです.

なお, 正直にダウンロードしてからやるコードはこんな感じです.

import urllib.request

# 国勢調査の人口推計data
url = 'https://www.e-stat.go.jp/stat-search/file-download?statInfId=000032087414&fileKind=0'
filename = 'population.xlsx'

urllib.request.urlretrieve(url, filename)

df = pd.read_excel(filename)

どっちが良さそうかは明確だと思います.

楽な方を選びましょう.

ちょっとしたスクレイピングはread_htmlで済ませる

Webページ(HTML)をスクレイピングしてDataFrameにして何かをやる...ということはよくあると思います.

これをやる際は,

  • Beautifulsoup使わないと駄目かな
  • スクレイピング面倒くさいンゴ

となるかもですが, <table>タグで記載されてる内容であればpandasだけで終わります.

事前準備としてライブラリを入れます.

$ pip install bs4 html5lib lxml

これでpandasから(tableタグだけなら)スクレイピングできます.

# 日本プロ野球機構のHPから菊池涼介(広島)の成績を取得する


tables = pd.read_html('https://npb.jp/bis/players/61565135.html')

# 成績はここで出てくる
table[1]

f:id:shinyorke:20210620212151p:plain

ここまでいけたら後は好きに加工したらやりたいことは出来ると思います.

カラム指定とデータ型つけるのはめちゃくちゃ大事

これは知ってると後々楽かも, 的な話です.

データ項目(カラム)や中身がわかっている場合,

  • 読み込むデータのカラムを事前に指定
  • 最初の段階でカラムのデータ型を指定

すると, 後々の仕事が減ってオススメです.

# 先ほどの野球データ
df = pd.read_csv('https://github.com/chadwickbureau/baseballdatabank/raw/master/core/Batting.csv')

# 打率・打点・ホームランを出すのに必要なカラムだけ残す感じでread_csvする
COLUMNS = {'playerID': str, 'yearID': int, 'AB': int, 'H': int, 'HR': int, 'RBI': int}
df = pd.read_csv(
    'https://github.com/chadwickbureau/baseballdatabank/raw/master/core/Batting.csv', 
    usecols=COLUMNS.keys()
    )

# 欠損値を埋めてデータ型を付けて計算して完成
df.fillna(0, inplace=True)
df.astype(COLUMNS)

df['AVG'] = round(df['H'] / df['AB'], 3)
df.fillna(0, inplace=True)

この例のメジャーリーグデータは大したサイズのデータではないのでカラム指定しなくてもいいですが, GB以上のデータを扱う際は明確な差が出てくるので覚えておいて損はありません.

shinyorke.hatenablog.com

詳しくは上記エントリーの「そもそものデータを減らす」の章をご覧いただけると幸いです.

結び - 仕事で使いこなすpandas

「仕事する前に知っておくと幸せかもしれないpandasのきほん」というテーマで,

  • ひとまずDataFrame作る時はURLをread関数に渡そう
  • 最初からデータカラムやデータ型を指定すると幸せ

という話をさせていただきました.

この2つを知ってるだけで, 泥臭い前処理や集計処理がシンプルになることも結構あるのでオススメです.

今回紹介した内容は「ひとまず覚えておいてパターン化する(真似する)」だけでも有効だと思うので生かしてもらえると嬉しいです.

また, pandasの使い方全般および, ちょっと応用的な使い方はこの辺でも書いてるので合わせて参考にしてもらえると幸いです.

shinyorke.hatenablog.com

shinyorke.hatenablog.com

ちなみに, 最近の仕事ではAIワクチン接種予測のプロトタイプを開発する際に今回紹介したtipsを活かしました.

jxpress.connpass.com

pandasの話は出ませんが, 興味を持っていただいたら聞いてもらえると嬉しいです🙏

最後までお付き合いいただきありがとうございました!

【Appendix】参考書籍など

pandasの使い方初歩はこちらをお読みいただけるといいかもです.

応用的な使い方, 特にメモリやパフォーマンスを気を使う時はこちらがすごく参考になると思います.