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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yuki_uchida
July 18, 2024
540
1
Share
メソッドチェーンを使ってDataFrameの可読性と保守性を向上させよう
みんなのPython勉強会#106 [
https://startpython.connpass.com/event/322207/
] で発表したLT資料です。
yuki_uchida
July 18, 2024
More Decks by yuki_uchida
See All by yuki_uchida
Media over QUICによる超低遅延ライブ配信について
yuki_uchida
0
130
Rustでマルチスレッドプログラミング! リアルタイム通信ではどのようにスレッドを立てるのか
yuki_uchida
8
8.1k
MoQとか勉強会#2 発表資料
yuki_uchida
2
3k
SkyWayが遭遇したWebRTC の可観測性に関する問題と開発者向け可視化サービス提供までの道のり
yuki_uchida
4
4.6k
技術発信を続けるためのTIPS
yuki_uchida
3
220
何かの技術の"専門家"になりたかったから技術調査チームを立ち上げてプロダクトに貢献した話
yuki_uchida
6
840
仕様策定中のプロトコルを Rust で書いてブラウザで動かしてみた
yuki_uchida
3
4.6k
Media Over QuicTransportって知ってる?
yuki_uchida
0
710
WebRTCの歴史とこれから
yuki_uchida
0
1.5k
Featured
See All Featured
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
230
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.9k
Side Projects
sachag
455
43k
The Curse of the Amulet
leimatthew05
1
11k
Designing Experiences People Love
moore
143
24k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.2k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
250
Practical Orchestrator
shlominoach
191
11k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
310
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!