[Pandasai] Pandasai 튜토리얼 1
- -
https://github.com/khw11044/Dashboard_Streamlit
데이터 분석 시각화 토이프로젝트를 수행해 보았다. streamlit으로 해보았는데 어떤 데이터를 넣어도 위와 같이 나오는 것이 아니라 데이터별 분석 후 시각화를 해야한다.
데이터 분석 AI Agent를 개발해서 어떤 데이터를 넣든 알아서 데이터 분석 및 시각화를 하면 좋을 것 같다.
그래서 알아보니, PandasAI, LIDA, CrewAI, LangGraph로 데이터 분석 AI Agent를 만들 수 있는거 같았다. 한번 PandasAI부터 알아보자.
pandasai 튜토리얼 1
목표
- LLM을 불러오는 다양한 방법을 이용해서 LLM을 불러오고 LLM에게 pandas의 dataframe을 분석시켜보자.
- 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 쿼리로 변환합니다.
그런 다음 코드를 사용하여 데이터와 상호 작용하고 결과를 사용자에게 반환합니다.
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의 기본 클래스입니다. 단일 데이터 프레임과 상호 작용하는 데 사용됩니다.
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})
'이것저것 개발노트' 카테고리의 다른 글
[AirFlow 공부하기] [1.개발환경구성]1. WSL 설치 및 간단한 리눅스 명령어 정리 (0) | 2024.09.20 |
---|---|
[Pandasai] Pandasai 튜토리얼 2 (1) | 2024.09.18 |
streamlit 오류, AxiosError: Request failed with status code 403 (0) | 2024.09.14 |
Poetry 설치 가이드 (0) | 2024.06.30 |
pip install -r requirment.txt 설치가 되지않는 패키지는 뛰어넘고, 설치가능한 패키지만 모두 설치하기 (0) | 2023.07.19 |
소중한 공감 감사합니다