AI機能搭載Pythonライブラリ、PandasAIとAzure OpenAIでデータ分析を楽しく！機密性の高いデータも安心分析

みなさん、こんにちは。突然の質問ですが、Pythonのライブラリである**PandasAI**をご存じでしょうか？

https://levelup.gitconnected.com/introducing-pandasai-the-generative-ai-python-library-568a971af014

データに対して、自然言語により質問をすることができるようになるライブラリです。本記事ではこの**PandasAI**と、高度なセキュリティ機能を備えた**Azure OpenAI Service**を組み合わせたデータ分析についてデモ画面を交えてご紹介します。
（ここでは既にMicrosoft社のAzure OpenAI Serviceを契約されていて、また、少しPythonコードが読める方をイメージして書かせていただいていますが、ざっと眺めるだけでももちろん結構です。まだ、ご存じない方に「こんなライブラリがあるのか」と知って頂ければ幸いです。）

## PandasAIとは
**PandasAI**は、データ分析用のPythonライブラリである**pandas**にAI（人工知能）機能を追加するための補完ライブラリです。自然言語を使ってデータに関する質問ができるようになります。このライブラリはまだまだ開発途上のようです。記事投稿時点でこのように使える程度に捉えて頂ければと思います。

## Azure OpenAI Serviceとは
Azure OpenAI Serviceは、言わずと知れたMicrosoft社によるAzure上で動作するOpenAIのモデルサービスです。エンタープライズレベルの高度なセキュリティが提供されています。

## Streamlitとは
Pythonベースのフレームワークで、気軽にデモ用のアプリを作成することができます。

https://github.com/streamlit/streamlit

## デモデータについて
機械学習等で有名なタイタニックのデータを使わせて頂きました。（次のリンク先からCSVファイルをダウンロードして使わせていただきました。）

https://github.com/datasciencedojo/datasets/blob/master/titanic.csv

## デモ用Pythonにコードについて
今回のデモ用Pythonコードはこのブログの最後の方に付けています。私もまだまだPythonは勉強中なのですが、参考になれば幸いです。早速、次のようにコマンドを打ち実行してみます。私の場合Windows上のコマンドプロンプトから実行しています。

``` 
streamlit run main.py
``` 

# デモ
## 分析するファイルの取り込み
次のような画面が出ますので、赤枠ところから先ほどダウンロードしておいたファイルを指定して取り込みます。
![begin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537852/77b25f0d-821b-ccf5-41f5-0fff431a64c2.png)


ファイルの最初の5行が表示されました。

![readcsv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537852/11e31e22-217b-440e-4a36-dc52ab5fc3e0.png)

## プロンプト（質問）
では、実際にプロンプト（質問）を書いて実行します。ファイルのヘッダーは英語ですが、日本語で質問してみます。プロンプト（質問）を書いたら赤枠の実行ボタンを押します。

**「このデータの基本統計量を出して。」**
![basic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537852/114f0194-fbc6-f771-bbe2-c5cc11a15894.png)

count、mean（平均）、std（標準偏差）、min（最小値）、max（最大値）と言ったこのデータの基本的な統計量が表示されました。
![basic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537852/85fd332a-2872-9f02-340d-ea357c08d74c.png)

次の質問をしてみます。

**「平均年齢を教えて。」**

特に赤枠で囲っていませんが、プロンプトに入れて実行ボタンを押す動作は一緒です。
実行ボタンの下に数字がでました。これは先ほどの基本的統計量の平均年齢と一致しています。

![mean_age.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537852/dddd3a4c-4599-fad3-b4ac-8d616b44dfe7.png)

グラフも出せるようなので次のようにプロンプト欄に入れて実行ボタンを押します。

**「男女比をパイチャートで出して。」**

![piechart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537852/bd7a5d7b-2aae-3530-8215-94982beaa0cd.png)

簡単ですね。では、次のプロンプト。

**「年齢別の棒グラフを出して。」**

![bar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537852/c0916782-996e-d5c6-70b2-4d9297480639.png)


# サンプルコード
次のコードが今回使った主なライブラリとコードです。Azure OpenAI Serviceのキーやエンドポイント等は契約し、デプロイされているご自身（会社）のものを使って下さい。

```
japanize-matplotlib==1.1.3
matplotlib==3.7.2
numpy==1.25.1
openpyxl==3.1.2
pandas==1.5.3
pandasai==0.6.9
python-dotenv==1.0.0
streamlit==1.26.0
```



``` Python
import os
import openai
import pandas as pd
import streamlit as st
import japanize_matplotlib

from dotenv import load_dotenv
from pandasai import PandasAI
from pandasai.llm.azure_openai import AzureOpenAI
from pandasai.middlewares.streamlit import StreamlitMiddleware


load_dotenv('env')

def load_api():
    llm = AzureOpenAI(api_base = os.getenv("AZURE_OPENAI_ENDPOINT") , 
                  api_version = os.getenv("AZURE_OPENAI_VERSION"),
                  api_token = os.getenv("AZURE_OPENAI_KEY"),
                  deployment_name = os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME")
                  )

    pandas_ai = PandasAI(
        llm,
        verbose=True,
        enable_cache=False,
        enforce_privacy=True,
        conversational=True,
        middlewares=[StreamlitMiddleware()],
    )
    return pandas_ai


def markdown_header():
    st.markdown(
        "<h1 style='font-size: 28px;'>Data analysis with PandasAI</h1>",
        unsafe_allow_html=True
    )

def handle_upload_file(pandas_ai):
    upload_file = st.file_uploader(
        "分析するcsvもしくはxlsx形式のファイル指定して下さい。", type=['csv', 'xlsx']
    )

    if upload_file is not None:
        file_extension = os.path.splitext(upload_file.name)[1]

        if file_extension == ".csv":
            df = pd.read_csv(upload_file, encoding='utf-8')
        elif file_extension == ".xlsx":
            df = pd.read_excel(upload_file)
        else:
            st.warning("このファイルタイプはサポートされていません。")
            return
        
        st.write(df.head(5))

        prompt = st.text_area("プロンプトを入れて下さい。")

        if st.button("実行"):
            if prompt:
                with st.spinner("実行中..."):
                    st.write(pandas_ai.run(df, prompt=prompt))
            else:
                st.warning("プロンプトを入れて下さい。")
    else:
        st.info("ファイルを選択して下さい。")

if __name__ == "__main__":
    pandas_ai = load_api()
    markdown_header()
    handle_upload_file(pandas_ai)
```



## さいごに
機密性の高いデータでも安心して分析できる**PandasAI**と**Azure OpenAI Service**という組み合わせは、データ分析をより効率的かつ楽しくしてくれるかもしれません。今後、OpenAI社のCode Interpreterのような機能がAzureにも入ってきたりする場合、Code Interpreterだけでデータ分析は完結してしまうのかもしれません。果たしてそのような時にこのPandasAIがどこまで有用なのか不明なのですが、それでもライブラリ自体にAIを搭載するという発想が面白いと感じています。まだまだ、鋭意開発中のようですので今後もどのように進化するのか見ていければと考えています。



https://github.com/gventuri/pandas-ai