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地址。没办法只能自己自定义一个继承自LLMDeepSeekLLM类。

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

文章转载自:charlee44 

原文链接:PandasAI连接LLM进行智能数据分析 - charlee44 - 博客园

体验地址:JNPF快速开发平台

### 使用大型语言模型进行大规模数据聚类分析 #### 选择合适的预训练模型 对于大规模文本数据集的聚类分析,选择一个适合任务需求的预训练大型语言模型至关重要。这些模型通常已经过大量语料库的训练,在理解自然语言方面表现出色。例如BERT、RoBERTa等都是不错的选择[^1]。 #### 数据准备与清洗 确保输入给LLM的数据质量良好非常重要。这涉及到去除噪声、标准化文本格式以及可能的话对文档长度做适当裁剪或填充操作来保持一致性。高质量的数据有助于提升最终聚类效果。 #### 特征提取 利用选定的大规模语言模型作为编码器,将每条记录转换成固定大小向量表示形式的过程称为特征抽取。具体做法是通过调用模型API获取句子级别的embedding输出。这种密集型表征能够捕捉更深层次的语言结构信息而不是简单的词频统计[^2]。 ```python from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased') model = AutoModel.from_pretrained('bert-base-uncased') def get_embedding(text): inputs = tokenizer(text, return_tensors="pt", truncation=True, padding='max_length', max_length=50) outputs = model(**inputs) embeddings = outputs.last_hidden_state.mean(dim=1).detach().numpy() return embeddings.flatten() texts = ["example sentence one.", "another example."] embeddings = [get_embedding(t) for t in texts] ``` #### 聚类算法应用 一旦获得了良好的特征表达之后就可以选用适当的无监督学习方法来进行分组工作了。K-means是最常用的一种硬划分方式;而像HDBSCAN这样的密度基底方法则更适合处理形状不规则分布的情况。此外还有谱聚类(Spectral Clustering)可供考虑当面对复杂关系网络时使用[^3]。 #### 结果评估与优化 为了验证所得到簇的有效性和稳定性,应该采取内部指标(如轮廓系数Silhouette Score)、外部标准(如果有标签可用)或者两者结合的方式进行全面考量。如果初次尝试未能达到预期目标,则可以从调整超参数设置入手继续探索改进方案直至满意为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值