PandasAI連接LLM進行智能數據分析
1. 引言
Pandas是一個數據分析開源組件庫,提供了高性能、易用的數據結構和數據分析工具。它的核心的功能是其DataFrame對象,這是一個帶有行和列標簽的二維表格數據結構,支持缺失數據處理、時間序列功能、靈活的數據輸入輸出方法、數據對齊和分組操作等特性。
PandasAI則通過結合Pandas和生成式AI技術,使用戶能夠以自然語言與數據進行交互,從而簡化數據分析流程。它的核心目標是讓數據分析變得更直觀、高效,甚至無需編寫復雜代碼即可完成數據查詢、清洗、可視化等任務。
2. 詳述
Pandas進行數據分析的流程筆者不是很熟練,這里重點關注一個問題就是PandasAI如何連接現有的大模型比如DeepSeek來進行智能數據分析。
由于經驗不足,筆者在測試PandasAI的時候,將相關的組件都安裝在默認全局的Python環境中了,導致版本有點低,使用的是v2版本。現在普通推薦使用Anaconda這樣的工具安裝虛擬環境來進行Python的依賴管理。不過根據PandasAI官網文檔[1]提示,PandasAI 3.0仍然是beta版本,并且推薦使用Poetry管理Python依賴。所以這里筆者也就沒有想升級到3.0,暫時先用穩定一定的2.X版本。
解決掉PandasAI 2.X的版本依賴問題之后,通過PandasAI連接DeepSeek進行智能數據分析的案例代碼實現如下:
import pandas as pd
from pandasai import SmartDataframe
from pandasai.llm.base import LLM
import requests
# 自定義DeepSeek大模型
class DeepSeekLLM(LLM):
def __init__(self, api_url:str, api_key: str, model: str):
super().__init__()
self.api_url = api_url
self.api_key = api_key
self.model = model
def call(self, instruction, context: dict = None, **kwargs) -> str:
"""
PandasAI 用來向 LLM 模型發起請求的接口入口。
Args:
instruction (str): PandasAI 傳入的 prompt,可能是 string 或自定義對象,表示用戶的問題。
context (dict, optional): 包含上下文信息(例如 DataFrame 元數據等),在部分 LLM 中可用。
**kwargs: 保留接口向前兼容(比如未來增加其他參數時也能傳入)。
Returns:
str: 執行指令后的結果輸出。
"""
# 把復雜的 Prompt 對象變成字符串
if not isinstance(instruction, str):
instruction = str(instruction)
# 請求頭
headers = {
"Authorization": f"Bearer {self.api_key}", # DeepSeek身份驗證
"Content-Type": "application/json"
}
# 兼容 OpenAI 的 Chat Completion API的對話消息格式
messages = [
{
"role": "system", # 設定 LLM 的行為
"content": "You are a helpful AI assistant for data analysis."
},
{
"role": "user", # 是實際的問題
"content": instruction
}
]
# 請求體
payload = {
"model": self.model,
"messages": messages,
"temperature": 0.0 # 值越低,回答的效果越穩定
}
# 發送post請求
response = requests.post(self.api_url, headers=headers, json=payload)
# 檢查返回狀態碼,如果不是 200 則報錯。
if response.status_code != 200:
raise Exception(f"DeepSeek API Error: {response.status_code}, {response.text}")
# 解析返回結果
result = response.json()
return result["choices"][0]["message"]["content"]
@property
def type(self):
return "deepseek-custom"
# Sample 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]
})
# 用自定義的 DeepSeek LLM
llm = DeepSeekLLM(
api_url = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
api_key="sk-xxx",
model="deepseek-r1")
df = SmartDataframe(sales_by_country, config={"llm": llm})
result = df.chat('列出銷售額最高的3個國家。')
print(result)
如代碼所示,關鍵的所在是需要自定義一個繼承自LLM的能夠連接DeepSeek的類DeepSeekLLM。其實PandasAI 2.X是可以使用提供了支持使用OpenAI的接口的,而連接DeepSeek的接口一般會兼容OpenAI。但是筆者嘗試了之后不行,不能傳入自定義的LLM地址。沒辦法只能自己自定義一個繼承自LLM的DeepSeekLLM類。
DeepSeekLLM類的關鍵就是call函數的實現,這是PandasAI用來向LLM模型發起請求的接口的入口。在這個函數實現中的關鍵就是通過兼容OpenAI的Chat API向自定義的DeepSeek服務發起post請求,具體的細節筆者已經在代碼中進行注釋,另外也可以查閱OpenAI API的相關文檔。這里的實現并沒有像《連接語言大模型(LLM)服務進行對話》一樣使用openai模塊或者LangChain框架,而是直接使用requests來發送HTTP請求,顯得更加底層一點,不過原理都差不多。
最終運行的結果如下所示:
country sales
0 China 7000
0 China 7000
1 United States 5000
2 Japan 4500

浙公網安備 33010602011771號