LangChainのcreate_pandas_dataframe_agentを使ってみた。

# 1. はじめに
* LangChainの[create_pandas_dataframe_agent](https://python.langchain.com/en/latest/modules/agents/toolkits/examples/pandas.html)というのを使ってみたが、結構いける感じだった！

# 2. 試してみたもの
* データは10000件くらいの特許データ（csv）。出願日、出願人、発明者などがデータで入っているもの。⇓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/a3d72982-7ecb-62b1-672f-010dd9766882.png)


インストールなどはお決まりで。
```python
!pip install langchain
!pip install openai

import os
os.environ["OPENAI_API_KEY"] = "********"

from langchain.agents import create_pandas_dataframe_agent
import pandas as pd
df = pd.read_csv(~~~)

```

* create_pandas_dataframe_agentでllmとdfを指定。
```python
from langchain.llms import OpenAI
agent = create_pandas_dataframe_agent(OpenAI(temperature=0), df, verbose=True)
```


## 行数を聞いてみるとあってる！
```python
agent.run("how many rows are there?")
"人手で集計：{}".format(df.shape[0])
````
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/27f7a457-79c7-138e-69d2-a181e75ad717.png)



## 出願人や発明者の数を聞いてもあってる！
* 特にセル内に複数人いた場合（｜区切りで入ってる）でも、文章で説明すれば理解してくれた。
* 良く見ると機械がやった集計方法も乗ってて勉強になった。
```python
agent.run("出願人は何人いますか？セル内の区切りの「|」で分割して集計してください。")
df["出願人(最新)"].str.split("|",expand=True).stack().value_counts()
````
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/fe39d50f-e889-fe88-aaab-90902c9c7712.png)

```python
agent.run("発明者は何人いますか？セル内の区切りの「|」で分割して集計してください。")
df["発明者(最新)"].str.split("|",expand=True).stack().value_counts()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/c0350ef6-5dd3-1581-8f8c-df829ee86923.png)

## 出願年で集計してもあってる。ちゃんとソートもお願いすれば聞いてくれる。
```python
agent.run("出願日から出願年を抽出して、出願年毎に出願件数を集計してください。出願年で昇順にソートしてください。")
df["出願日(現)"].str[0:4].value_counts().sort_index()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/bedb9544-bcaa-198a-9e2e-8049535794ac.png)

⇓人手集計結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/a6723e94-28e6-b340-f7ed-27b57cbe2cf9.png)


## テキスト処理
* エラーが出て最終的に実行できず。これは他のライブラリ（Python Agent）の助けを借りればできるかも。
```python
agent.run("要約から名詞を抽出して集計してください")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/6c11f172-3c6f-d0d7-e50e-2e3e8cf0868c.png)


```python
agent.run("要約から名詞を抽出して集計してください")
agent.run("発明の名称を使ってワードクラウドを作ってください")
```


* 実際出力されなかったけれど指示が出ているので順に実行してみる。
* おお。日本語対応してないので豆腐化。
```python
from wordcloud import WordCloud
names = df['発明の名称'].str.cat(sep=' ')
wordcloud = WordCloud().generate(names)
wordcloud.to_image()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/fc0312d1-cd86-8c92-d8a5-91bebfebc648.png)


* 日本語フォントで何とかしようとしている。そのうち日本語対応させたい。
```python
agent.run("発明の名称を使ってワードクラウドを作ってください。日本語で表示する必要があります。")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/6aae5ae7-6ef2-9bb0-71f5-a12b1e26c5d7.png)



## 内容要約
* １行分で切って要約してくれた模様。これはGPTSimpleVectorIndexなどで処理してあげた方がよさそう。
```python
agent.run("出願の内容を要約から抽出してまとめてください。")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/27a50bbe-a0bc-9c9f-4e38-a94b45d3c2b5.png)


## クロス集計
* 一生懸命集計スクリプトを出力しようとしてるけど失敗。
* なんとかうまく指示して作成する方法を見つけたい。

```python
agent.run("Fタームを横軸、出願人を縦軸にしてそれぞれセル内の区切りの「|」で分割した上で、クロス集計をしてください。")

#人手でやるとこんな感じ？
#df[['Fターム(最新)', '出願人(最新)']].apply(lambda x: x.str.split('|')).explode('Fターム(最新)').explode('出願人(最新)').reset_index().pivot_table(index='Fターム(最新)', columns='出願人(最新)', aggfunc='size', fill_value=0)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/b947eaed-3f69-edd3-eb71-a2ec5b27cb25.png)


## 定義抽出
```python
agent.run("筆頭ＦＩの分類定義を検索して、新たな列「定義」に追加してください。")
```
* なんかやってくれている。かなり荒っぽく削っているけど抽出してくれた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/57205069-dfc5-2860-ce88-126bb90fe37c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/995dec36-1ffd-0cc8-2937-bd0c69a77520.png)