Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
メソッドチェーンを使ってDataFrameの可読性と保守性を向上させよう
Search
yuki_uchida
July 18, 2024
1
290
メソッドチェーンを使ってDataFrameの可読性と保守性を向上させよう
みんなのPython勉強会#106 [
https://startpython.connpass.com/event/322207/
] で発表したLT資料です。
yuki_uchida
July 18, 2024
Tweet
Share
More Decks by yuki_uchida
See All by yuki_uchida
SkyWayが遭遇したWebRTC の可観測性に関する問題と開発者向け可視化サービス提供までの道のり
yuki_uchida
4
2.8k
技術発信を続けるためのTIPS
yuki_uchida
3
110
何かの技術の"専門家"になりたかったから技術調査チームを立ち上げてプロダクトに貢献した話
yuki_uchida
6
450
仕様策定中のプロトコルを Rust で書いてブラウザで動かしてみた
yuki_uchida
3
2k
Media Over QuicTransportって知ってる?
yuki_uchida
0
380
WebRTCの歴史とこれから
yuki_uchida
0
1.2k
WebTransportのまとめと今後
yuki_uchida
5
1.3k
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
328
21k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Writing Fast Ruby
sferik
626
61k
A Philosophy of Restraint
colly
203
16k
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
7
160
Statistics for Hackers
jakevdp
796
220k
Faster Mobile Websites
deanohume
304
30k
The Power of CSS Pseudo Elements
geoffreycrofte
72
5.3k
Being A Developer After 40
akosma
86
590k
Transcript
メソッドチェーンを使って DataFrameの可読性と保守性を 向上させよう みんなのPython勉強会#106 2024/07/18
自己紹介 NTT コミュニケーションズ株式会社に2019年新卒入社 WebRTCプラットフォーム SkyWayでWebRTCエンジニア 副業 DataScientist@出版系 / MLOps@医療系 趣味はラーメン
🍜とコーヒー ☕️ WebRTCエンジニア / DataScientist 内田 裕貴 x: @yuki_wtz
話したいこと1 こういうコード良く書きますよね?
話したいこと1 こういうコード良く書きますよね? df = pd.read_csv("hoge.csv") df = df[df["userId"] == 1]
df["GB"] = df["MB"] * 1000 df["TB"] = df["GB"] * 1000 df = df.drop("MB") df = df.drop("GB")
話したいこと1 dfという変数に対してひたすら操作 を加えていく こういうコード良く書きますよね? df = pd.read_csv("hoge.csv") df = df[df["userId"]
== 1] df["GB"] = df["MB"] * 1000 df["TB"] = df["GB"] * 1000 df = df.drop("MB") df = df.drop("GB")
話したいこと1 この書き方の好ましくない点1 df = pd.read_csv("hoge.csv") df = df[df["userId"] == 1]
df["GB"] = df["MB"] * 1000 df["TB"] = df["GB"] * 1000 df = df.drop("MB") df = df.drop("GB")
話したいこと1 この書き方の好ましくない点1 df = pd.read_csv("hoge.csv") df = df[df["userId"] == 1]
df["GB"] = df["MB"] * 1000 df["TB"] = df["GB"] * 1000 df = df.drop("MB") df = df.drop("GB") 「dfという変数、今どうなってる?」
話したいこと1 この書き方の好ましくない点1 df = pd.read_csv("hoge.csv") df = df[df["userId"] == 1]
df["GB"] = df["MB"] * 1000 df["TB"] = df["GB"] * 1000 df = df.drop("MB") df = df.drop("GB") 「dfという変数、今どうなってる?」 jupyter notebookなどの場合、複数セルにわ たって同じ変数を操作することが多い
話したいこと1 この書き方の好ましくない点1 df = pd.read_csv("hoge.csv") df = df[df["userId"] == 1]
df["GB"] = df["MB"] * 1000 df["TB"] = df["GB"] * 1000 df = df.drop("MB") df = df.drop("GB") 「dfという変数、今どうなってる?」 jupyter notebookなどの場合、複数セルにわ たって同じ変数を操作することが多い 処理に順序性がある(この処理を実行していな いと後続の処理がバグる)場合、とりあえず最 初のセルから再実行する・・・
話したいこと1 この書き方の好ましくない点1 df = pd.read_csv("hoge.csv") df = df[df["userId"] == 1]
df["GB"] = df["MB"] * 1000 df["TB"] = df["GB"] * 1000 df = df.drop("MB") df = df.drop("GB") 「dfという変数、今どうなってる?」 jupyter notebookなどの場合、複数セルにわ たって同じ変数を操作することが多い 処理に順序性がある(この処理を実行していな いと後続の処理がバグる)場合、とりあえず最 初のセルから再実行する・・・ ごちゃごちゃ操作していくうちに、最初のセ ルから実行しても動かなくなったりする
話したいこと1 この書き方の好ましくない点2 df = pd.read_csv("hoge.csv") df_1 = df[df["pattern"] == 1]
df_1["GB"] = df_1["MB"] * 1000 df_1["TB"] = df_1["GB"] * 1000 df_1_1 = df_1.drop("MB") df_1_2 = df_1_1.drop("GB")
話したいこと1 この書き方の好ましくない点2 df = pd.read_csv("hoge.csv") df_1 = df[df["pattern"] == 1]
df_1["GB"] = df_1["MB"] * 1000 df_1["TB"] = df_1["GB"] * 1000 df_1_1 = df_1.drop("MB") df_1_2 = df_1_1.drop("GB") DataFrameを作りまくってメモリを圧迫
話したいこと1 この書き方の好ましくない点2 df = pd.read_csv("hoge.csv") df_1 = df[df["userId"] == 1].copy()
df_1["GB"] = df_1["MB"] * 1000 df_1["TB"] = df_1["GB"] * 1000 df_1_1 = df_1.drop("MB") df_1_2 = df_1_1.drop("GB") DataFrameを作りまくってメモリを圧迫
話したいこと1 この書き方の好ましくない点2 df = pd.read_csv("hoge.csv") df_1 = df[df["userId"] == 1].copy()
df_1["GB"] = df_1["MB"] * 1000 df_1["TB"] = df_1["GB"] * 1000 df_1_1 = df_1.drop("MB") df_1_2 = df_1_1.drop("GB") DataFrameを作りまくってメモリを圧迫 軽量のデータであれば問題ないが、GB級のデ ータを扱うようになると、この無駄なメモリ 使用に苦しむことになる
話したいこと2 メソッドチェーンを使ってみよう df = pd.read_csv("hoge.csv") df_1 = df[df["pattern"] == 1]
df_1["GB"] = df_1["MB"] * 1000 df_1["TB"] = df_1["GB"] * 1000 df_1_1 = df_1.drop("MB") df_1_2 = df_1_1.drop("GB")
話したいこと2 メソッドチェーンを使ってみよう df = ( pd.read_csv("hoge.csv") .query("pattern == 1") .assign(GB=lambda
x: x["MB"] * 1000) .assign(TB=lambda x: x["GB"] * 1000) .drop(columns=["MB", "GB"]) ) df = pd.read_csv("hoge.csv") df = df[df["userId"] == 1] df["GB"] = df["MB"] * 1000 df["TB"] = df["GB"] * 1000 df = df.drop("MB") df = df.drop("GB")
話したいこと2 メソッドチェーンを使ってみよう df = ( pd.read_csv("hoge.csv") .query("userId == 1") .assign(GB=lambda
x: x["MB"] * 1000) .assign(TB=lambda x: x["GB"] * 1000) .drop(columns=["MB", "GB"]) ) df = pd.read_csv("hoge.csv") df = df[df["userId"] == 1] df["GB"] = df["MB"] * 1000 df["TB"] = df["GB"] * 1000 df = df.drop("MB") df = df.drop("GB")
話したいこと2 メソッドチェーンの利点 df = ( pd.read_csv("hoge.csv") .query("userId == 1") .assign(GB=lambda
x: x["MB"] * 1000) .assign(TB=lambda x: x["GB"] * 1000) .drop(columns=["MB", "GB"]) )
話したいこと2 メソッドチェーンの利点 df = ( pd.read_csv("hoge.csv") .query("userId == 1") .assign(GB=lambda
x: x["MB"] * 1000) .assign(TB=lambda x: x["GB"] * 1000) .drop(columns=["MB", "GB"]) ) dfという変数の状態を考える必 要がなくなる
話したいこと2 メソッドチェーンの利点 df = ( pd.read_csv("hoge.csv") .query("userId == 1") .assign(GB=lambda
x: x["MB"] * 1000) .assign(TB=lambda x: x["GB"] * 1000) .drop(columns=["MB", "GB"]) ) dfという変数の状態を考える必 要がなくなる プログラミング全般に言えるが、 変化する値は少ければ少ないほど バグが起きづらい
話したいこと2 メソッドチェーンの利点 df = ( pd.read_csv("hoge.csv") .query("userId == 1") .assign(GB=lambda
x: x["MB"] * 1000) .assign(TB=lambda x: x["GB"] * 1000) .drop(columns=["MB", "GB"]) ) dfという変数の状態を考える必 要がなくなる dfに関わる操作が一塊になり、 変更が容易になる
話したいこと2 メソッドチェーンの利点 df = ( pd.read_csv("hoge.csv") .query("userId == 1") .assign(GB=lambda
x: x["MB"] * 1000) .assign(TB=lambda x: x["GB"] * 1000) .drop(columns=["MB", "GB"]) ) dfという変数の状態を考える必 要がなくなる dfに関わる操作が一塊になり、 変更が容易になる 無駄なdataframeが作られない
話したいこと3 メソッドチェーンの弱点 基本的にはメソッドチェーンを使って書けるなら書いた方が良いと思ってい るが、弱点もある
話したいこと3 メソッドチェーンの弱点 基本的にはメソッドチェーンを使って書けるなら書いた方が良いと思ってい るが、弱点もある デバッグに慣れが必要 途中経過の確認のために.pipeを繋げて中でprint文を打ったりする
話したいこと3 メソッドチェーンの弱点 基本的にはメソッドチェーンを使って書けるなら書いた方が良いと思ってい るが、弱点もある デバッグに慣れが必要 途中経過の確認のために.pipeを繋げて中でprint文を打ったりする データ抽出の速度が遅い(かも) df[df[”hoge”] == 1]
よりも df.query(“hoge == 1”)の方が5倍くら い遅いこともあった
話したいこと3 メソッドチェーンの弱点 基本的にはメソッドチェーンを使って書けるなら書いた方が良いと思ってい るが、弱点もある デバッグに慣れが必要 途中経過の確認のために.pipeを繋げて中でprint文を打ったりする データ抽出の速度が遅い(かも) df[df[”hoge”] == 1]
よりも df.query(“hoge == 1”)の方が5倍くら い遅いこともあった Pythonの関数に頼って抽出する場合にちょっと無駄が多い df[”user”].str.contains(“test”) df.query(“user.str.contains(test)”, engine=”python”)
X: @yuki_wtz Follow Me!