見出し画像

AutoGenをガッツリ試してみる:グラフをプロットしてみる

概要

前回はAutoGenというマルチエージェントのフレームワークを触ってみるということで、FizzBazzのコードを生成して実行する流れを試し、上手く動くことを確認できた。今回は独自のDocker環境を利用すると共に、グラフを表示する流れについて紹介をしてみよう。

Pythonを実行する環境として、ローカル環境が挙げられるが、ライブラリのダウンロードなど環境を汚してしまう可能性がある。できればDocker環境で実行したいところであるが、GUIを利用した場合にはDocker環境下で直接動かすだけではグラフが表示されなかった。とはいえ、Docker環境で動かないというのは困るので、これを解決してみる。

今回の記事だは、まずはローカルの環境で実行をした後に、Docker環境でグラフを表示するというのもやってみよう。

株価のダウンロードとプロットをしてみる

ローカルの環境での実験

まずは前回と同様に、生成したPythonコードをローカル環境下で実行してみることとする。インストールと環境設定は前回と同様なのでここで省く。ソースコードは以下となる。前回との違いとしては、messageの部分だけで、「NVIDIAとTESLAの年間の株式のチャートをプロットしてください」という指示になっている。

from autogen import AssistantAgent, UserProxyAgent, config_list_from_json

code_execution_config = {
    "work_dir": "coding",
    "use_docker": False
}
config_list = config_list_from_json(env_or_file="OAI_CONFIG_LIST")
assistant = AssistantAgent("assistant", llm_config={"config_list": config_list})
user_proxy = UserProxyAgent("user_proxy", code_execution_config=code_execution_config)

message = "Plot a chart of NVDA and TESLA stock price change YTD."
user_proxy.initiate_chat(assistant, message=message)user_proxy.initiate_chat(assistant, message=message)

上記を実行すると、以下のように実行のプロセス(インストール、データ取得、プロット)を示してくれる。

user_proxy (to assistant):

NVIDIAとテスラの株式価格の年間の推移をプロットして

--------------------------------------------------------------------------------
assistant (to user_proxy):

それを達成するために、私たちはPythonのYahoo Financeライブラリ、pandas、およびmatplotlibを使用します。次の手順に従ってください:

1. 必要なモジュールがない場合はPythonのYahoo Financeライブラリ、pandas、およびmatplotlibをインストールします。

2. Yahoo FinanceからテスラおよびNVIDIAの株式データを取得します。

3. 年間の終値を取得してプロットします。

まず、必要なライブラリをインストールするためのコードを実行しましょう。

```shell
pip install yfinance pandas matplotlib
```

次に、以下のPythonコードを使用して株式データを取得し、年間の終値をプロットします:

```python
# filename: stock_plot.py

import yfinance as yf
import pandas as pd
from matplotlib import pyplot as plt

# Yahoo FinanceからNVIDIAとTeslaの株価データを取得します
nvidia = yf.download("NVDA", start="2021-01-01", end="2021-12-31")
tesla = yf.download("TSLA", start="2021-01-01", end="2021-12-31")

plt.figure(figsize=(14, 7))

# NVIDIAのデータをプロット
plt.plot(nvidia.index, nvidia.Close, label='NVIDIA')

# Teslaのデータをプロット
plt.plot(tesla.index, tesla.Close, label='Tesla')

# グラフのタイトルとラベルを設定
plt.title('Yearly Stock Price Trend')
plt.xlabel('Date')
plt.ylabel('Closing Price (USD)')
plt.legend()

# グラフを表示
plt.show()
```

このPythonスクリプトを保存して実行すると、202111日から20211231日までのNVIDIAとTeslaの年間株価の推移が表示されます。株価は毎日の終値に基づいており、時間経過による変化を直線的に表示します。

そこで、このまま実行を続けると以下のようなグラフが表示される。

NVIDIAとTeslaの年間の株価の推移

Dockerを利用してみる

Dockerを利用する際に、デフォルトで利用されるベースイメージであるpython:3-alpineだと、実行中にnumpyなどをインストールしようとして動かなかった。またそのままだとmatplotlibのグラフも表示されなかった。そこでこの記事では、独自のDockerイメージを作成しAutoGenから利用する方法について説明する。

まずはDockerをAutoGenから利用できるようにパッケージをインストールしておく。Docker自体のインストールなどは別途やっておこう。

pip install docker

Mac環境を対象として、コンテナ内で実行したGUIを表示するために以下を実行し、XQuartzというパッケージをインストールする。XQuartzはMac上でX11を動かす仕組みらしい。

brew install --cask xquartz

XQuartzを起動し以下のように環境を設定する。ネットワーク・クライアントからの接続を許可にチェックを入れておく。

open -a XQuartz

環境を設定したら一度XQuartzを終了し、再起動をしておく必要があるらしい。あとは、以下を実行しておこうとのこと。

xhost + 127.0.0.1

次にDockerのイメージを作る。コード中で使われるのでいくつかパッケージをインストールしておく。不要なものもあると思うけど気にしない。DISPLAYの環境変数を設定しておく。その上で、docker buildしておく。

FROM python:3

RUN apt-get update && apt-get install -y \
    build-essential\
    python3-pip\
    python3-setuptools\
    python3-distutils\
    python3-dev

RUN pip install numpy pandas yfinance
ENV DISPLAY host.docker.internal:0
docker build -t autogen .

AutoGenから独自のDockerイメージを利用する際には、code_execution_configのuse_dockerに利用したいイメージを記載しておく。後はコードを実行すると動くはずだ。

code_execution_config = {
    "work_dir": "coding",
    "use_docker": ["autogen:latest"]
}

ファイルを保存する

ここまでにグラフをGUIで表示をしましたが、ファイルとして保存する事もできます。例えば以下のように、出力ファイル名を指示文を与えることで、codingディレクトリ下にstock_price_ytd.pngが出力することもできます。

message = "NVIDIAとテスラの株式価格の年間の推移をプロットし、stock_price_ytd.pngというファイル名で保存してください"
user_proxy.initiate_chat(
    assistant,
    message="message"
)

終わりに

独自のDocker環境下でAutoGenのコードを実行させるとともに、GUIでグラフをプロットする流れについて解説した。独自のDocker環境を使えるので、毎度パッケージをインストールするプロセスをせず、かつ、自分のPCの環境を汚さずにAutoGenを使えるようになった。まだ僕自身がAutoGenを使いこなせていないので、次に何をやるか決めたら、記事を書こうかなと思います。

この記事が気に入ったらサポートをしてみませんか?