🙌

Pandas + AI = PandasAI

に公開

PandasAIとは

PandasAIは、自然言語を使用してPandasのDataFrameに対してクエリを実行できるPythonライブラリです。GPT-4oなどの大規模言語モデル(LLM)を活用し、自然言語で複雑なデータ分析タスクを実行することができます。

PandasAIの主な機能

  • 自然言語によるデータ分析
  • データ可視化
  • 複雑なデータ操作の自動化

セットアップ

インストール

pip install pandasai

必要な依存関係:

  • Python
  • pandas
  • OpenAI APIキー(OpenAIのモデルを使用する場合)

基本的な使用方法

以下はPandasAIの基本的な使用例です。

import pandas as pd
from pandasai import Agent
from pandasai.llm import OpenAI

# サンプルデータの作成(月次売上データ)
df = pd.DataFrame({
    '月': ['1月', '2月', '3月', '4月', '5月', '6月'],
    '商品A': [120, 150, 180, 160, 200, 220],
    '商品B': [80, 90, 100, 110, 95, 105],
    '商品C': [200, 180, 220, 240, 260, 280],
    '広告費': [50, 60, 70, 65, 75, 80]
})

# PandasAIエージェントの初期化
agent = Agent(
    df,
    config={
        "llm": OpenAI(model_name="gpt-4o"),
        "custom_whitelisted_dependencies": ["plotly"], # plotlyをホワイトリストへ追加
    }
)

# 自然言語クエリの実行
result = agent.chat("各商品の売上と広告費の相関関係を散布図で表示してください")

データをDataframe型で渡してあげてAgentを設定し、あとはクエリを渡すだけです。
出力形式を指定したい場合は、以下のようにプロンプトで指定してあげると良いです。

import logging

import pandas as pd
from pandasai import Agent
from pandasai.llm import OpenAI

GENERATE_GRAPH_PROMPT = """
    あなたはデータ分析の専門家です。
    ユーザーのデータを参照して、ユーザーの質問に適切なグラフを作成してください。
    
    ルール:
    - 日本語で出力してください。
    - 画像での出力は行わないでください。
    - テーブル形式での出力の場合は、PandasのDataframeの型で出力してください。
    - グラフ形式での出力の場合は、PlotlyのFigureの型で出力してください。
    ユーザーの質問:{user_query}
"""

# サンプルデータの作成(月次売上データ)
df = pd.DataFrame({
    '月': ['1月', '2月', '3月', '4月', '5月', '6月'],
    '商品A': [120, 150, 180, 160, 200, 220],
    '商品B': [80, 90, 100, 110, 95, 105],
    '商品C': [200, 180, 220, 240, 260, 280],
    '広告費': [50, 60, 70, 65, 75, 80]
})

# PandasAIエージェントの初期化
agent = Agent(
    df,
    config={
        "llm": OpenAI(model_name="gpt-4o"),
        "custom_whitelisted_dependencies": ["plotly"], # plotlyをホワイトリストへ追加
    }
)

# 自然言語クエリの実行
result = agent.chat(GENERATE_GRAPH_PROMPT.format(user_query="各商品の月次売上推移を折れ線グラフで表示し、広告費との関係も示してください"))
logging.info(f"result: {result}")
実行結果

Figure型で返ってきました

result: Figure({
     'data': [{'mode': 'lines+markers',
               'name': '商品A',
               'type': 'scatter',
               'x': array(['1月', '2月', '3月', '4月', '5月', '6月'], dtype=object),
               'y': {'bdata': 'eACWALQAoADIANwA', 'dtype': 'i2'}},
              {'mode': 'lines+markers',
               'name': '商品B',
               'type': 'scatter',
               'x': array(['1月', '2月', '3月', '4月', '5月', '6月'], dtype=object),
               'y': {'bdata': 'UFpkbl9p', 'dtype': 'i1'}},
              {'mode': 'lines+markers',
               'name': '商品C',
               'type': 'scatter',
               'x': array(['1月', '2月', '3月', '4月', '5月', '6月'], dtype=object),
               'y': {'bdata': 'yAC0ANwA8AAEARgB', 'dtype': 'i2'}},
              {'name': '広告費',
               'type': 'bar',
               'x': array(['1月', '2月', '3月', '4月', '5月', '6月'], dtype=object),
               'y': {'bdata': 'MjxGQUtQ', 'dtype': 'i1'},
               'yaxis': 'y2'}],
     'layout': {'legend': {'orientation': 'h', 'x': 0.1, 'y': 1.1},
                'template': '...',
                'title': {'text': '各商品の月次売上推移と広告費'},
                'xaxis': {'title': {'text': '月'}},
                'yaxis': {'title': {'text': '売上'}},
                'yaxis2': {'overlaying': 'y', 'side': 'right', 'title': {'text': '広告費'}}}
 })

トークン数の取得

1回の処理でどのくらいの費用が掛かっているか概算するにはトークン数の取得が必要かと思います。
PandasAIでOpenAIのモデルを使う場合は、以下のようにget_openai_callbackを使用することでトークン数を取得することが可能です

import logging

import pandas as pd
from pandasai import Agent
from pandasai.llm import OpenAI
from pandasai.helpers.openai_info import get_openai_callback

# サンプルデータの作成(月次売上データ)
df = pd.DataFrame({
    '月': ['1月', '2月', '3月', '4月', '5月', '6月'],
    '商品A': [120, 150, 180, 160, 200, 220],
    '商品B': [80, 90, 100, 110, 95, 105],
    '商品C': [200, 180, 220, 240, 260, 280],
    '広告費': [50, 60, 70, 65, 75, 80]
})

# PandasAIエージェントの初期化
agent = Agent(
    df,
    config={
        "llm": OpenAI(model_name="gpt-4o"),
        "custom_whitelisted_dependencies": ["plotly"], # plotlyをホワイトリストへ追加
    }
)

with get_openai_callback() as cb:
    result = agent.chat("各商品の売上と広告費の相関関係を散布図で表示してください")
    prompt_tokens = cb.prompt_tokens
    completion_tokens = cb.completion_tokens

    logging.info(f"prompt_tokens: {prompt_tokens}")
    logging.info(f"completion_tokens: {completion_tokens}")
実行結果
prompt_tokens: 908
completion_tokens: 915

まとめ

PandasAIを使用することで、自然言語でデータの絞り込みや可視化等行えるようになり、複雑なSQLの発行などの手間が省け、より簡単にデータ分析ができるようになります。

また、StreamlitでUIを構築することで、比較的工数少なく、データ分析のチャットアプリなど作ることが可能です。PoCでAIを活用したデータ分析アプリの開発など考えている方はぜひ検討してみてください。

ただし、PandasAIは非常に便利なライブラリですが、セキュリティ面への配慮や適切なエラーハンドリングの実装が重要となります。

参考リンク

UPGRADE tech blog

Discussion