写点什么

PandasAI 连接 LLM 进行智能数据分析

  • 2025-07-28
    福建
  • 本文字数:2330 字

    阅读完需:约 8 分钟

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 pdfrom pandasai import SmartDataframefrom pandasai.llm.base import LLMimport 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 DataFramesales_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 LLMllm = 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 地址。没办法只能自己自定义一个继承自LLMDeepSeekLLM类。

DeepSeekLLM类的关键就是call函数的实现,这是 PandasAI 用来向 LLM 模型发起请求的接口的入口。在这个函数实现中的关键就是通过兼容 OpenAI 的 Chat API 向自定义的 DeepSeek 服务发起post请求,具体的细节笔者已经在代码中进行注释,另外也可以查阅 OpenAI API 的相关文档。这里的实现并没有像《连接语言大模型(LLM)服务进行对话》一样使用openai模块或者LangChain框架,而是直接使用 requests 来发送 HTTP 请求,显得更加底层一点,不过原理都差不多。

最终运行的结果如下所示:

country  sales0          China   70000          China   70001  United States   50002          Japan   4500
复制代码


文章转载自:charlee44 

原文链接:https://www.cnblogs.com/charlee44/p/19008034

体验地址:http://www.jnpfsoft.com/?from=001YH

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
PandasAI连接LLM进行智能数据分析_数据分析_不在线第一只蜗牛_InfoQ写作社区