새소식

이것저것 개발노트

[Pandasai] Pandasai 튜토리얼 1

  • -

https://github.com/khw11044/Dashboard_Streamlit

 

GitHub - khw11044/Dashboard_Streamlit

Contribute to khw11044/Dashboard_Streamlit development by creating an account on GitHub.

github.com

 

 

데이터 분석 시각화 토이프로젝트를 수행해 보았다. streamlit으로 해보았는데 어떤 데이터를 넣어도 위와 같이 나오는 것이 아니라 데이터별 분석 후 시각화를 해야한다. 

데이터 분석 AI Agent를 개발해서 어떤 데이터를 넣든 알아서 데이터 분석 및 시각화를 하면 좋을 것 같다. 

그래서 알아보니, PandasAI, LIDA, CrewAI, LangGraph로 데이터 분석 AI Agent를 만들 수 있는거 같았다. 한번 PandasAI부터 알아보자. 

 

pandasai 튜토리얼 1

목표

  1. LLM을 불러오는 다양한 방법을 이용해서 LLM을 불러오고 LLM에게 pandas의 dataframe을 분석시켜보자.
  2. SmartDataframe 사용하기

PandasAI가 뭔지 알아보기

PandasAI는 자연어를 통해 데이터에 대해 LLM에게 쉽게 질문할 수 있게 해주는 Python 라이브러리입니다.

쿼리 외에도 PandasAI는 그래프를 통해 데이터를 시각화하고, 누락된 값을 처리하여 데이터 세트를 정리하고, 기능 생성을 통해 데이터 품질을 향상시키는 기능을 제공하므로 데이터 과학자 및 분석가를 위한 포괄적인 도구입니다.

 

특징

  • Natural language querying: 데이터에대해 자연어로 질문하세요.
  • Data visualization: 그래프와 차트를 생성하여 데이터를 시각화하세요.
  • Data cleansing: 누락된 값을 해결하여 데이터 세트를 정리합니다.
  • Feature generation: 특징 생성을 통해 데이터 품질을 향상합니다.
  • Data connectors: CSV, XLSX, PostgreSQL, MySQL, BigQuery, Databrick, Snowflake 등과 같은 다양한 데이터 소스에 연결하세요.

Pandas 작동 방법

PandasAI는 생성 AI 모델을 사용하여 자연어 쿼리를 이해하고 해석하여, 이를 Python 코드 및 SQL 쿼리로 변환합니다.
그런 다음 코드를 사용하여 데이터와 상호 작용하고 결과를 사용자에게 반환합니다.

 

 

OpenAI API키 발급 링크

Setting (톱니바퀴 모양) - Billing 에서 적어도 5 달러 이상 결제하고 Limits에서 사용 한도 정하고

Your profile에서 User API Keys에 들어가서 Create new secret key 버튼 누르기

key 발급 받고 .env 파일에서 openai api key를 넣어줍니다.

import os 
from dotenv import load_dotenv

# API KEY 정보로드
load_dotenv()
True

 

API key를 load_dotenv를 통해 load하였습니다.

OpenAI API키로 한번 LLM을 불러오고 질문을 해보겠습니다.

 

from langchain_openai import ChatOpenAI

# 객체 생성
llm = ChatOpenAI(
    temperature=0.1,  # 창의성 (0.0 ~ 2.0)
    model_name="gpt-3.5-turbo",  # 모델명
)

# 질의내용
question = "대한민국의 수도는 어디인가요?"

# 질의
print(f"[답변]: {llm.invoke(question)}")
[답변]: content='대한민국의 수도는 서울입니다.' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 15, 'prompt_tokens': 24, 'total_tokens': 39, 'completion_tokens_details': {'reasoning_tokens': 0}}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-c401f6dc-2873-4c68-a89a-cebc70c77a3b-0' usage_metadata={'input_tokens': 24, 'output_tokens': 15, 'total_tokens': 39}

 

SmartDataframe 클래스는 pandasai의 기본 클래스입니다. 단일 데이터 프레임과 상호 작용하는 데 사용됩니다.

Pandasai SmartDataframe 설명

 

Getting started with the Library - PandasAI

Getting started with the Library

docs.pandas-ai.com

 

import pandas as pd
from pandasai import SmartDataframe
구분 로드 방법
BambooLLM from pandasai.llm import BambooLLM
OpenAI models from pandasai.llm import OpenAI
Google PaLM from pandasai.llm import GooglePalm
Google Vertexai from pandasai.llm import GoogleVertexAI
Azure OpenAI from pandasai.llm import AzureOpenAI
HuggingFace via Text Generation from pandasai.llm import HuggingFaceTextGen
Langchain models from langchain_openai import OpenAI

 

데이터분석을 위해 LLM을 불러올 수 있는 방법은 위 표와 같습니다.

다음으로는 pandasai 라이브러리에서 OpenAI llm을 load합니다.

 

from pandasai.llm import OpenAI

llm = OpenAI(api_token = os.environ['OPENAI_API_KEY'])

 

각 나라별 판매량을 나타내는 간단한 예제 DataFrame을 만들어 봅니다.

 

sales_by_country = pd.DataFrame({
    "country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"],
    "sales": [5000, 3200, 2900, 4100, 2300, 2100, 2500, 2600, 4500, 7000]
})

sales_by_country.head()
  country sales
0 United States 5000
1 United Kingdom 3200
2 France 2900
3 Germany 4100
4 Italy 2300

 

sales 기준 상위 5개의 국가를 알려달라고 해봅니다.

df = SmartDataframe(sales_by_country, config={"llm": llm})
df.chat('Which are the top 5 countries by sales?')
          country  sales
9           China   7000
0   United States   5000
8           Japan   4500
3         Germany   4100
1  United Kingdom   3200
  country sales
9 China 7000
0 United States 5000
8 Japan 4500
3 Germany 4100
1 United Kingdom 3200

 

제공받은 결과값뿐만 아니라 코드역시 받고 싶으면 아래와 같은 옵션을 추가해 줍니다.

 

df = SmartDataframe(sales_by_country, config={"llm": llm, "conversational": True, "verbose": True})
df.chat('Which are the top 5 countries by sales?')
          country  sales
9           China   7000
0   United States   5000
8           Japan   4500
3         Germany   4100
1  United Kingdom   3200
  country sales
9 China 7000
0 United States 5000
8 Japan 4500
3 Germany 4100
1 United Kingdom 3200
code = df.last_code_generated
print(code)
data = {'country': ['China', 'Japan', 'Germany'], 'sales': [2500, 4100, 5000]}
combined_df = pd.concat(dfs)
top_countries = combined_df.sort_values(by='sales', ascending=False).head(5)
result = {'type': 'dataframe', 'value': top_countries}
print(result['value'])

 

한국어로 질문해도 잘 나올까요?

한국어로 질문해보겠습니다.

 

df = SmartDataframe(sales_by_country, config={"llm": llm, "conversational": True, "verbose": True})
df.chat('sales 기준 탑 5 국가를 알려줘.')
          country  sales
9           China   7000
0   United States   5000
8           Japan   4500
3         Germany   4100
1  United Kingdom   3200
  country sales
9 China 7000
0 United States 5000
8 Japan 4500
3 Germany 4100
1 United Kingdom 3200

와우 놀랍네요. 한국어로도 잘 됩니다.

 

다음으로,

모델이 gpt-4o이면 가격이 많이 나갈 것입니다.

튜토리얼로 이것저것 하다가 돈을 다 쓸까 걱정이 되니

사용료가 비교적 싼 3.5-turbo와 함께 Pandasai를 사용하고 싶습니다.

 

아래와 같이 모델을 정해줄 수 있습니다

from pandasai.llm import OpenAI

llm = OpenAI(
    temperature=0.7,  # 창의성 (0.0 ~ 2.0)
    model_name="gpt-3.5-turbo",  # 모델명
)

df = SmartDataframe(sales_by_country, config={"llm": llm})
df.chat('Which are the top 5 countries by sales?')
          country  sales
9           China   7000
0   United States   5000
8           Japan   4500
3         Germany   4100
1  United Kingdom   3200
  country sales
9 China 7000
0 United States 5000
8 Japan 4500
3 Germany 4100
1 United Kingdom 3200

 

LangChain으로 이것저것 하면서 RAG도 하고 AI Agent도 만들어 놓은 상황이라고 합시다.

데이터를 분석해줄 데이터 분석 AI Agent를 구축하기 위해 pandasAI를 사용하고 싶으면 from pandasai.llm import OpenAI 사용 이외에도 langchain과 연결해도 됩니다.

 

from langchain_openai import ChatOpenAI

# 객체 생성
llm = ChatOpenAI(
    temperature=0.1,  # 창의성 (0.0 ~ 2.0)
    model_name="gpt-3.5-turbo",  # 모델명
)

df = SmartDataframe(sales_by_country, config={"llm": llm})
df.chat('Which are the top 5 countries by sales?')
          country  sales
9           China   7000
0   United States   5000
8           Japan   4500
3         Germany   4100
1  United Kingdom   3200
  country sales
9 China 7000
0 United States 5000
8 Japan 4500
3 Germany 4100
1 United Kingdom 3200
from langchain_openai import OpenAI

# 객체 생성
llm = OpenAI(
    temperature=0.1,  # 창의성 (0.0 ~ 2.0)
    model_name="gpt-3.5-turbo",  # 모델명
)

df = SmartDataframe(sales_by_country, config={"llm": llm})
df.chat('Which are the top 5 countries by sales?')
          country  sales
9           China   7000
0   United States   5000
8           Japan   4500
3         Germany   4100
1  United Kingdom   3200
  country sales
9 China 7000
0 United States 5000
8 Japan 4500
3 Germany 4100
1 United Kingdom 3200

 

이번에는 Local에서 LLM을 사용해서 데이터분석을 해봅니다.

Ollama를 사용하며 Ollama를 통해 llama3.1 모델 다운은 다른 블로그 및 유튜브를 참고해서 수행한 이후 아래 코드를 실행해 봅니다.

 

from pandasai.llm.local_llm import LocalLLM

ollama_llm = LocalLLM(
            api_base="http://localhost:11434/v1", 
            model="llama3.1"
            )
df = SmartDataframe(sales_by_country, config={"llm": ollama_llm})
df.chat('Which are the top 5 countries by sales?')
          country  sales
9           China   7000
0   United States   5000
8           Japan   4500
3         Germany   4100
1  United Kingdom   3200
  country sales
9 China 7000
0 United States 5000
8 Japan 4500
3 Germany 4100
1 United Kingdom 3200
from langchain_community.llms import Ollama
from langchain_community.chat_models import ChatOllama

ollama_llm = ChatOllama(model="llama3.1", 
                        temperature=0.3)

df = SmartDataframe(sales_by_country, config={"llm": ollama_llm})
df.chat('Which are the top 5 countries by sales?')
          country  sales
9           China   7000
0   United States   5000
8           Japan   4500
3         Germany   4100
1  United Kingdom   3200
  country sales
9 China 7000
0 United States 5000
8 Japan 4500
3 Germany 4100
1 United Kingdom 3200
ollama_llm = Ollama(model="llama3.1", 
                    temperature=0.3)

df = SmartDataframe(sales_by_country, config={"llm": llm, "conversational": True, "verbose": True})
df.chat('Which are the top 5 countries by sales?')
          country  sales
9           China   7000
0   United States   5000
8           Japan   4500
3         Germany   4100
1  United Kingdom   3200
  country sales
9 China 7000
0 United States 5000
8 Japan 4500
3 Germany 4100
1 United Kingdom 3200
code = df.last_code_generated
print(code)
data = {'country': ['China', 'Japan', 'Germany'], 'sales': [2500, 4100, 5000]}
combined_df = pd.concat(dfs)
top_countries = combined_df.sort_values(by='sales', ascending=False).head(5)
result = {'type': 'dataframe', 'value': top_countries}
print(result['value'])

 

결론

 

어떤 LLM 로드 방식으로도 상관없이 LLM을 로드하고 나서 SmartDataframe의 config 옵션에 llm을 지정해주면 된다.

df = SmartDataframe(df, config={"llm": llm, "conversational": True, "verbose": True})

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.