10分でワークフローを修正したJupyter AIに出会うまで、パンダスクエリのデバッグに1週間費やした話
私を完全に打ちのめしたシナリオはこうだ:不統一な列名を持つ3つのDataFrameを結合し、日時列にカスタム関数を適用し、結果をピボットする作業をしていた。その間、コーヒーは冷めていった。df.merge()を何度も入力しすぎて、キーボードが泣いているのが聞こえたほどだ。そこでJupyter AIを発見し、それ以来、生のPandasコードを一行も書いていない。しかし、これは魔法ではない。鋭い刃を持つ道具であり、どこで切れるかを正確にお見せしよう。
これを発見する前に実際に何が壊れていたのか
47列の顧客解約データセットを扱っていた。日付範囲でフィルタリングするたびに、pd.to_datetime()にinfer_datetime_format=Trueが必要なのか、format='%Y-%m-%d'が必要なのかを忘れてしまう。Googleで検索し、Stack Overflowからコピペするが、CSVがダッシュではなくスラッシュを使用しているため、日付形式が間違ってしまう。その時気づいたのだ:私は悪いデータサイエンティストなのではなく、Pandasの構文を覚えるのが苦手なだけだと。
Jupyter AIはあなたの脳を置き換えるものではない。ブラウザのタブを置き換えるのだ。以下に、そのセットアップ方法と実際に機能する内容を紹介する。
Jupyter AIのインストール:2分のセットアップが15分かかった話
まず、正直なインストール手順。Python 3.8+とJupyter Lab 3.5+が必要だ。以下を実行:
pip install jupyter-ai
次に拡張機能を有効化:
jupyter labextension install @jupyter-ai/core
待て—Jupyter Lab 4.xを使用している場合、これは失敗する可能性がある。私は苦い経験でこれを学んだ。Lab 4の場合、以下が必要:
pip install jupyter-ai>=2.0
そしてlabextensionコマンドは完全にスキップする。組み込まれている。バージョンの不一致でデバッグに20分費やした。インストール後、Jupyter Labを再起動し、左側のサイドバーにあるAIアイコンを探す。ロボットの顔が見えれば成功だ。見えない場合は、jupyter --versionでJupyterのバージョンを確認する。
モデルの設定:GPT-4が唯一の現実的な選択肢である理由
Jupyter AIは複数のモデル(Anthropic、Cohere、Hugging Face)をサポートしているが、私はすべてをテストした。真実を言うと、データサイエンスのタスクでは、GPT-4だけが一貫して動作するコードを出力する。Claude 3は近いが、時々列名を幻覚する。Llama 2のようなローカルモデルはリアルタイム使用には遅すぎる。
Jupyter AIの設定パネル(AIサイドバーの歯車アイコン)でAPIキーを設定する。OpenAIキーを貼り付ける。デプロイしない限り環境変数は使用しない。設定パネルはセッション間で永続化される。
これが最初の実際のテストだ。チャットパネルに入力:
「CSVファイル'sales_2023.csv'を読み込み、すべての列を表示して最初の5行を表示」
Jupyter AIが応答:
import pandas as pd
pd.set_option('display.max_columns', None)
df = pd.read_csv('sales_2023.csv')
df.head()
動作した。しかし、ここに最初の欠陥がある:ファイルが存在するか確認しなかった。実行時にファイルがサブディレクトリにあるとクラッシュした。プロンプトで常にパスを指定することを学んだ:「'data/raw/'フォルダから読み込む」
実例:乱雑なデータセットのクリーニング
実際にこれを使用している例をお見せしよう。同じ列に「2023-01-15 14:30:00」や「15/01/2023」のような文字列として日付が保存されているデータセットがあった。悪夢だ。入力:
「'timestamp'列をdatetimeに変換。一部の値はYYYY-MM-DD形式、他はDD/MM/YYYY形式。エラーはNaTに設定して処理。」
Jupyter AIが生成:
df['timestamp'] = pd.to_datetime(df['timestamp'], format='mixed', errors='coerce')
このformat='mixed'パラメータは私が一度も使ったことのないものだった。完璧に動作した。しかし、タイムゾーン対応のタイムスタンプは処理できなかった。出力はナイーブなものだった。フォローアップが必要だった:「すべてのタイムスタンプをUTCのタイムゾーン対応にする」。.dt.tz_localize('UTC')を追加した。
教訓:Jupyter AIは反復的だ。一度で完璧なコードは得られない。ステップバイステップの指示が必要なジュニア開発者のように扱うこと。
高度な機能:カスタム関数とベクトル化
ここからが強力な部分だ。カスタムウィンドウで加重移動平均を計算する必要があった。入力:
「スパン12期間の指数加重移動平均を計算する関数を作成し、'store_id'でグループ化した'revenue'列に適用」
返ってきたコード:
def calc_ewma(group):
return group['revenue'].ewm(span=12, adjust=False).mean()
df['ewma_revenue'] = df.groupby('store_id').apply(calc_ewma).reset_index(level=0, drop=True)
動作したが、200万行では遅かった。質問:「ベクトル化できる?」transformの使用を提案:
df['ewma_revenue'] = df.groupby('store_id')['revenue'].transform(lambda x: x.ewm(span=12, adjust=False).mean())
実行時間が45秒から3秒に短縮された。これは通常、Google検索に30分費やすような最適化だ。
遭遇する隠れた欠陥
DataFrame構造を忘れる:5回のプロンプト後、存在しない列を参照するコードを生成する可能性がある。最初のプロンプトに必ず
df.columns.tolist()を含めること。チャットパネルのメモリリーク:約50回の相互作用後、AIが応答しなくなる。カーネルを再起動し、チャットをクリアする。プロンプトは短く焦点を絞って保つこと。
大規模データセットを処理できない:「1000万行でこのクエリを最適化」と試みた。サンプルでは動作するが、完全なデータセットではクラッシュするコードを生成した。テストには
.sample(1000)を使用すること。プロットは当たり外れがある:「相関行列のseabornヒートマップ」を要求したが、代わりにmatplotlibをインポートした。ライブラリを明示的に指定:「plotlyを使用してインタラクティブな散布図を作成」
実際に機能する可視化
プロットでは、明示的なプロンプトで最も成功している:
「plotly expressの折れ線グラフを作成。X軸は'date'、Y軸は'sales'。'region'で色分け。タイトルは'地域別月次売上'。'product_count'を表示するホバーデータでインタラクティブに。」
生成されたコード:
import plotly.express as px
fig = px.line(df, x='date', y='sales', color='region',
title='Monthly Sales by Region', hover_data=['product_count'])
fig.show()
プロのヒント:常に明示的にhover_dataを要求すること。デフォルトは最小限だ。
最終的に定着したワークフロー
これが現在のルーティンだ。新しいノートブックを開き、最初のセルで%load_ext jupyter_aiを実行(今は自動だが)、AIパネルに入力:
「列を持つDataFrameがあります:[df.columnsを貼り付け]。目標:[タスクを説明]。制約:[メモリ制限、時間制限]。出力:[単一のコードセルまたは説明]。」
この構造化されたプロンプトで、80%のケースで動作するコードが得られる。残りの20%は?自分でデバッグするか、タスクを小さなプロンプトに分割する。
次の5分間
Jupyter AIのすべてを一度に学ぼうとしないで。代わりに、今すぐこれを行う:
- インストールする(上記のLab 4コマンドを使用)。
- 持っている乱雑なCSVを開く。
- 「すべての日付列をdatetimeに修正し、エラーを処理」と依頼。
- 次に「数値列の欠損値を中央値で補完」と依頼。
- 最後に「plotlyを使用した相関ヒートマップを作成」と依頼。
10分以内に、可視化付きのクリーンなデータセットが手に入る。それが約束だ。しかし覚えておいて:それは道具であり、代替品ではない。その出力を盲目的に信じた瞬間、文字列を数字の代わりに合計するピボットテーブルを生成する。私も経験済みだ。私のコーヒーはまだ冷めている。