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
280
メソッドチェーンを使って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
1.9k
Media Over QuicTransportって知ってる?
yuki_uchida
0
380
WebRTCの歴史とこれから
yuki_uchida
0
1.2k
WebTransportのまとめと今後
yuki_uchida
5
1.3k
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
1
39
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
Intergalactic Javascript Robots from Outer Space
tanoku
268
27k
Building Better People: How to give real-time feedback that sticks.
wjessup
363
19k
KATA
mclloyd
29
13k
What's in a price? How to price your products and services
michaelherold
243
12k
Gamification - CAS2011
davidbonilla
80
5k
A Philosophy of Restraint
colly
203
16k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.8k
Statistics for Hackers
jakevdp
796
220k
How GitHub (no longer) Works
holman
311
140k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
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!