找回密码
 立即注册
首页 业界区 业界 PandasAI连接LLM进行智能数据分析

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

豺独 3 天前
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进行智能数据分析的案例代码实现如下:
  1. import pandas as pd
  2. from pandasai import SmartDataframe
  3. from pandasai.llm.base import LLM
  4. import requests
  5. # 自定义DeepSeek大模型
  6. class DeepSeekLLM(LLM):
  7.     def __init__(self, api_url:str, api_key: str, model: str):
  8.         super().__init__()
  9.         self.api_url = api_url
  10.         self.api_key = api_key
  11.         self.model = model        
  12.     def call(self, instruction, context: dict = None, **kwargs) -> str:  
  13.         """
  14.         PandasAI 用来向 LLM 模型发起请求的接口入口。
  15.         Args:
  16.             instruction (str): PandasAI 传入的 prompt,可能是 string 或自定义对象,表示用户的问题。
  17.             context (dict, optional): 包含上下文信息(例如 DataFrame 元数据等),在部分 LLM 中可用。
  18.             **kwargs: 保留接口向前兼容(比如未来增加其他参数时也能传入)。
  19.         Returns:
  20.             str: 执行指令后的结果输出。
  21.         """
  22.         # 把复杂的 Prompt 对象变成字符串
  23.         if not isinstance(instruction, str):
  24.             instruction = str(instruction)
  25.         # 请求头
  26.         headers = {
  27.             "Authorization": f"Bearer {self.api_key}",   # DeepSeek身份验证
  28.             "Content-Type": "application/json"
  29.         }
  30.         # 兼容 OpenAI 的 Chat Completion API的对话消息格式
  31.         messages = [
  32.             {
  33.                 "role": "system", # 设定 LLM 的行为
  34.                 "content": "You are a helpful AI assistant for data analysis."
  35.             },
  36.             {
  37.                 "role": "user",  # 是实际的问题
  38.                 "content": instruction
  39.             }
  40.         ]
  41.         # 请求体
  42.         payload = {
  43.             "model": self.model,
  44.             "messages": messages,
  45.             "temperature": 0.0 # 值越低,回答的效果越稳定
  46.         }
  47.         # 发送post请求
  48.         response = requests.post(self.api_url, headers=headers, json=payload)
  49.         # 检查返回状态码,如果不是 200 则报错。
  50.         if response.status_code != 200:
  51.             raise Exception(f"DeepSeek API Error: {response.status_code}, {response.text}")
  52.         # 解析返回结果
  53.         result = response.json()
  54.         return result["choices"][0]["message"]["content"]
  55.     @property
  56.     def type(self):
  57.         return "deepseek-custom"
  58. # Sample DataFrame
  59. sales_by_country = pd.DataFrame({
  60.     "country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"],
  61.     "sales": [5000, 3200, 2900, 4100, 2300, 2100, 2500, 2600, 4500, 7000]
  62. })
  63. # 用自定义的 DeepSeek LLM
  64. llm = DeepSeekLLM(
  65.     api_url = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
  66.     api_key="sk-xxx",
  67.     model="deepseek-r1")
  68. df = SmartDataframe(sales_by_country, config={"llm": llm})
  69. result = df.chat('列出销售额最高的3个国家。')
  70. 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请求,显得更加底层一点,不过原理都差不多。
最终运行的结果如下所示:
  1. country  sales
  2. 0          China   7000
  3. 0          China   7000
  4. 1  United States   5000
  5. 2          Japan   4500
复制代码


  • PandasAI官方文档 ↩︎

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册