1. 引言

在之前的文章《PandasAI连接LLM进行智能数据分析》中实现了使用PandasAI连接与DeepSeek模型通过自然语言进行数据分析。不过那个例子中使用的是PandasAI 2.X,并且使用的是本地.csv文件来作为数据。在实际应用的系统中,使用.csv作为库表的情况比较少见。在本文中,就试试使用最新的PandasAI 3.0对MySQL数据库中涉及到多个表的数据进行数据分析。

2. 详述

既然要连接MySQL数据库,那么就要先准备数据了。在MySQL创建一个数据库chinese_retail_data,在数据库中创建两张表customers和orders,并且插入数据。这里模拟的是电商系统重点用户表和订单表。具体的SQL语句如下所示:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS chinese_retail_data;
USE chinese_retail_data;-- 创建客户表 (主表)
CREATE TABLE customers (customer_id INT PRIMARY KEY AUTO_INCREMENT,customer_name VARCHAR(100) NOT NULL,gender VARCHAR(10) NOT NULL,age_group VARCHAR(20) NOT NULL,city VARCHAR(50) NOT NULL,membership_level VARCHAR(20) DEFAULT '普通会员',registration_date DATE NOT NULL
);-- 创建订单表 (从表,通过customer_id关联)
CREATE TABLE orders (order_id INT PRIMARY KEY AUTO_INCREMENT,customer_id INT,product_name VARCHAR(100) NOT NULL,category VARCHAR(50) NOT NULL,quantity INT NOT NULL,unit_price DECIMAL(10,2) NOT NULL,order_date DATE NOT NULL,payment_method VARCHAR(20) NOT NULL,delivery_status VARCHAR(20) NOT NULL,FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);-- 插入客户数据(字段值使用中文)
INSERT INTO customers (customer_name, gender, age_group, city, membership_level, registration_date) VALUES
('张伟', '男', '25-34岁', '北京', '黄金会员', '2023-01-15'),
('李娜', '女', '35-44岁', '上海', '铂金会员', '2022-03-20'),
('王强', '男', '18-24岁', '广州', '普通会员', '2024-01-05'),
('陈静', '女', '45-54岁', '深圳', '黄金会员', '2023-06-12'),
('刘洋', '男', '25-34岁', '杭州', '普通会员', '2024-02-18'),
('赵敏', '女', '35-44岁', '成都', '铂金会员', '2022-11-30'),
('孙浩', '男', '18-24岁', '南京', '普通会员', '2024-03-08'),
('周芳', '女', '45-54岁', '武汉', '黄金会员', '2023-09-25');-- 插入订单数据(字段值使用中文,关联customer_id)
INSERT INTO orders (customer_id, product_name, category, quantity, unit_price, order_date, payment_method, delivery_status) VALUES
(1, '华为手机', '电子产品', 1, 5999.00, '2024-04-01', '支付宝', '已送达'),
(2, '美的空调', '家用电器', 1, 3200.00, '2024-04-03', '微信支付', '已送达'),
(3, '李宁运动鞋', '服饰鞋帽', 2, 499.00, '2024-04-05', '信用卡', '运输中'),
(1, '小米手环', '电子产品', 1, 299.00, '2024-04-08', '支付宝', '已送达'),
(4, '格力冰箱', '家用电器', 1, 4800.00, '2024-04-10', '微信支付', '已送达'),
(5, '耐克T恤', '服饰鞋帽', 3, 199.00, '2024-04-12', '支付宝', '已送达'),
(2, '苹果平板', '电子产品', 1, 3899.00, '2024-04-15', '微信支付', '已送达'),
(6, '海尔洗衣机', '家用电器', 1, 2800.00, '2024-04-18', '信用卡', '已送达'),
(7, '阿迪达斯运动裤', '服饰鞋帽', 1, 599.00, '2024-04-20', '支付宝', '运输中'),
(1, '戴尔笔记本', '电子产品', 1, 7999.00, '2024-04-25', '微信支付', '已送达'),
(8, '西门子烤箱', '家用电器', 1, 2200.00, '2024-04-28', '信用卡', '已送达'),
(3, '优衣库衬衫', '服饰鞋帽', 4, 199.00, '2024-05-01', '支付宝', '已送达'),
(4, 'OPPO手机', '电子产品', 1, 2999.00, '2024-05-05', '微信支付', '已送达'),
(5, '彪马运动鞋', '服饰鞋帽', 1, 699.00, '2024-05-08', '信用卡', '运输中'),
(2, '索尼耳机', '电子产品', 2, 899.00, '2024-05-12', '支付宝', '已送达');

然后准备PandasAI的环境。注意默认的Python环境pip安装的可能仍然是2.X版本,不过在使用PandasAI官方文档推荐使用Poetry之后,就可以pip安装3.0了。

最后给出具体的Python脚本:

import pandasai
from pandasai_litellm import LiteLLMllm_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
llm_key = "sk-xxxxx"
llm_model_name = "deepseek-r1"mysql_host = "127.0.0.1"
mysql_port = 3306
mysql_user = "root"
mysql_password = "test"def init_dataset(table_names):pandasai.create(path = table_names[0],description = "电商系统客户的基本信息,包括个人属性、地理位置和会员等级等静态特征。",source={"type": "mysql","connection": {"host": mysql_host,"port": mysql_port,"user": mysql_user,           "password": mysql_password,"database": "chinese_retail_data"},"table": "customers",            },columns = [{"name": "customer_id", "type": "integer", "description": "客户的唯一标识符,用于关联订单数据。"},{"name": "customer_name", "type": "string", "description": "客户的姓名,用于识别和沟通。"},{"name": "gender", "type": "string", "description": "客户的性别,用于人口统计分析。"},{"name": "age_group", "type": "string", "description": "客户所属的年龄段,用于年龄相关的市场细分。"},{"name": "city", "type": "string", "description": "户所在的城市,用于地域性销售分析。"},{"name": "membership_level", "type": "string", "description": "客户的会员等级,反映客户价值和忠诚度。"},{"name": "registration_date", "type": "datetime", "description": "客户的注册日期,用于计算客户生命周期。"},])pandasai.create(path = table_names[1],description = "电商系统客户的订单交易详情,包括购买的商品、数量、价格、时间和状态等动态行为。",source={"type": "mysql","connection": {"host": mysql_host,"port": mysql_port,"user": mysql_user,"password": mysql_password,"database": "chinese_retail_data"},"table": "orders",},columns = [{"name": "order_id", "type": "integer", "description": "订单的唯一标识符,用于追踪和管理订单。"},{"name": "customer_id", "type": "integer", "description": "关联到客户的外键,建立与客户表的联系。"},{"name": "product_name", "type": "string", "description": "所购商品的名称,用于产品销售分析。"},{"name": "category", "type": "string", "description": "商品所属的类别,用于分类统计和趋势分析。"},{"name": "quantity", "type": "integer", "description": "购买的商品数量,影响总销售额和库存。"},{"name": "unit_price", "type": "float", "description": "商品的单价,用于计算订单金额和利润。"},{"name": "order_date", "type": "datetime", "description": "订单创建的日期,用于时间序列和趋势分析。"},{"name": "payment_method", "type": "string", "description": "客户使用的支付方式,反映支付偏好。"},{"name": "delivery_status", "type": "string", "description": "订单的配送状态,用于监控物流和客户满意度。"},])def ai_chat(table_names):llm = LiteLLM(model=llm_model_name, api_base=llm_url, api_key=llm_key, custom_llm_provider="openai", temperature=0.0, seed=10080)pandasai.config.set({"llm": llm, "save_logs": True, "verbose": False, "max_retries": 3})# 加载所有相关的表   tables = [pandasai.load(name) for name in table_names]chat_content = "统计一下目前电商系统中会员类型的占比,以及每种会员类型购买商品的数额在销售额总量的占比。请使用中文回答。"result = pandasai.chat(chat_content, *tables)print(result)if __name__ == "__main__":    table_names = ["example/ecommerce-customers", "example/ecommerce-orders"]#init_dataset(table_names) #初始化只能一次ai_chat(table_names)

有以下几点需要注意:

  1. PandasAI 3.0比PandasAI 2.X方便的一点可以不用自定义LLM类来连接自定义的大模型了,使用内置的LiteLLM就可以了。另外PandasAI官方还提供大模型可以使用,不过需要申请key。这里笔者连接的还是阿里云百炼平台的DeepSeek。

  2. PandasAI设计的数据接口笔者觉得有点奇怪,主要有两点:

    • pandasai.create创建的表格数据只能使用一次,如果数据存在第二次再调用这个函数(在init_dataset函数中)就会报错。
    • PandasAI对创建的数据集名称还有要求,比如多个单词必须以"-"进行连接。
  3. PandasAI官网创建MySQL数据集的案例代码1是:

    sql_table = pai.create(path="example/mysql-dataset",description="Heart disease dataset from MySQL database",source={"type": "mysql","connection": {"host": "database.example.com","port": 3306,"user": "${DB_USER}","password": "${DB_PASSWORD}","database": "medical_data"},"table": "heart_data","columns": [{"name": "Age", "type": "integer", "description": "Age of the patient in years"},{"name": "Sex", "type": "string", "description": "Gender of the patient (M = male, F = female)"},{"name": "ChestPainType", "type": "string", "description": "Type of chest pain (ATA, NAP, ASY, TA)"},{"name": "RestingBP", "type": "integer", "description": "Resting blood pressure in mm Hg"},{"name": "Cholesterol", "type": "integer", "description": "Serum cholesterol in mg/dl"},{"name": "FastingBS", "type": "integer", "description": "Fasting blood sugar > 120 mg/dl (1 = true, 0 = false)"},{"name": "RestingECG", "type": "string", "description": "Resting electrocardiogram results (Normal, ST, LVH)"},{"name": "MaxHR", "type": "integer", "description": "Maximum heart rate achieved"},{"name": "ExerciseAngina", "type": "string", "description": "Exercise-induced angina (Y = yes, N = no)"},{"name": "Oldpeak", "type": "float", "description": "ST depression induced by exercise relative to rest"},{"name": "ST_Slope", "type": "string", "description": "Slope of the peak exercise ST segment (Up, Flat, Down)"},{"name": "HeartDisease", "type": "integer", "description": "Heart disease diagnosis (1 = present, 0 = absent)"}]}
    )
    

    但是笔者这里尝试的正确的用法是:

    pandasai.create(path = table_names[0],description = "电商系统客户的基本信息,包括个人属性、地理位置和会员等级等静态特征。",source={"type": "mysql","connection": {"host": mysql_host,"port": mysql_port,"user": mysql_user,           "password": mysql_password,"database": "chinese_retail_data"},"table": "customers",            },columns = [{"name": "customer_id", "type": "integer", "description": "客户的唯一标识符,用于关联订单数据。"},{"name": "customer_name", "type": "string", "description": "客户的姓名,用于识别和沟通。"},{"name": "gender", "type": "string", "description": "客户的性别,用于人口统计分析。"},{"name": "age_group", "type": "string", "description": "客户所属的年龄段,用于年龄相关的市场细分。"},{"name": "city", "type": "string", "description": "户所在的城市,用于地域性销售分析。"},{"name": "membership_level", "type": "string", "description": "客户的会员等级,反映客户价值和忠诚度。"},{"name": "registration_date", "type": "datetime", "description": "客户的注册日期,用于计算客户生命周期。"},]
    )
    

    关键不同点就在于columns属性值的位置。使用前者实际上是会丢失表格字段描述的。表格字段描述非常重要,PandasAI会将其传递给LLM来理解表格数据。如果创建成功的话,可以在Python脚本所在目录的datasets文件夹中,找到创建好的.yaml文件,其中有表格数据的字段表述值:

3. 结果

最终运行结果如下所示:

membership_level  会员占比(%)  销售额占比(%)
0             普通会员     37.5      9.30
1             铂金会员     25.0     29.48
2             黄金会员     37.5     61.23

本例中还有一点值得注意的是这里进行的数据分析是跨表数据分析,而不是像《PandasAI连接LLM进行智能数据分析》中那样使用的是单表。其实这就是个很有趣的问题,我们都知道业务系统的核心就是CURD,那么如果跨表查询可以实现,是不是意味着以后就可以通过自然语言来进行业务呢?现在语音的正确识别率也不低,通过语言来进行业务操作也不难吧?这就回到了笔者在之前的文章《行业思考:不是前端不行,是只会前端不行》中的讨论:也许AI可能会对传统Web前端方向带来革命性的影响。


  1. PandasAI官方文档 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917617.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917617.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917617.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FloodFill算法——DFS

FloodFill算法就是用来寻找性质相同的连通快的算法,这篇博客都是用dfs来实现FloodFill算法 1.图像渲染 题目链接:733. 图像渲染 - 力扣(LeetCode) 题目解析:将和(sr,sc)相连的所有像素相同的…

【BUUCTF系列】[极客大挑战 2019]LoveSQL 1

本文仅用于技术研究,禁止用于非法用途。 Author:枷锁 文章目录一、题目核心漏洞分析二、关键解题步骤与技术解析1. 确定列数(ORDER BY)2. 联合查询获取表名3. 爆破字段名4. 提取Flag三、漏洞根源与防御方案1. 漏洞成因2. 防御措施四、CTF技巧…

AI时代,童装销售的“指路明灯”

别看现在AI、大数据这些词眼花缭乱的,当年我刚入行那会儿,也跟你一样,对着一堆库存和销量数据发愁,不知道劲儿该往哪使。童装销售这行,看着简单,其实水挺深。不过呢,这二十多年摸爬滚打下来&…

Swin-Transformer从浅入深详解

第一部分:出现背景在 Swin Transformer 出现之前,计算机视觉(Computer Vision, CV)领域主要由 CNN (卷积神经网络) 主导。后来,NLP(自然语言处理)领域的 Transformer 模型被引入 CV,…

如何手动打包 Linux(麒麟系统)的 Qt 程序

gcc版本 gcc版本确保目标系统(运行环境)的 GCC 版本 高于或等于开发环境的版本,否则程序无法在目标平台运行。通过 gcc -v 可查看当前版本。cmake生成可执行文件 强烈建议在cmakelists添加设置运行时 rpath 为 $ORIGIN/…/lib(相对…

解决 “crypto.hash is not a function”:Vite 从 6.x 升级至 7.x 后 `pnpm run dev` 报错问题

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …

我的创作纪念日____在 CSDN一年来的成长历程和收获

365 天创作札记:在代码与文字的褶皱里,遇见 1300 束光一年来。点开csdn网站后台粉丝数的那一刻,1327 这个数字在屏幕上微微发烫。原来那些在深夜敲下的字符、调试到凌晨的代码示例、反复修改的技术拆解,真的在时光里悄悄织成了一张…

VirtualBox 的 HOST 键(主机键)是 右Ctrl 键(即键盘右侧的 Ctrl 键)笔记250802

VirtualBox 的 HOST 键(主机键)是 右Ctrl 键(即键盘右侧的 Ctrl 键)笔记250802 VirtualBox 的 HOST 键(主机键)是什么?HOST键 是 右Ctrl 键VirtualBox 的 主机键(Host Key) 是一个…

Zama的使命

全同态加密(Fully Homomorphic Encryption,FHE)实现互联网端到端加密的使命的重要里程碑。(FHE) 是一种无需解密即可处理数据的技术。它可用于在公共、无需许可的区块链上创建私人智能合约,只有特定用户才能看到交易数据和合约状态…

Go语言流式输出技术实现-服务器推送事件(Server-Sent Events, SSE)

目录引言背景与技术概述实现技术细节1. HTTP 头部配置2. 事件格式与发送3. 保持连接与刷新4. 处理连接关闭4.1 使用上下文管理连接生命周期4.2 使用通道管理客户端连接5. 客户端交互6.demo7.Go转发大模型流式输出demo引言 服务器推送事件(Server-Sent Events, SSE&…

高端房产管理小程序

系统介绍1、用户端地图找房:对接地图API,地图形式显示周边房源,支持新盘和租房两种模式查询房价走势:城市房价走势,由后台每月录入房源搜索:搜索房源,支持多维度筛选房源类型:新盘销售、房屋租赁…

文本转语音(TTS)脚本

文本转语音(TTS)脚本 概述 generate_voice.py 是一个用于生成语音的Python脚本。该脚本提供了文本转语音(TTS)功能,可以将文本内容转换为语音文件。 功能特性 文本转语音: 将输入的文本转换为语音文件多种语音选项: 支持不同的语音类型和参数批量处理: 可以处理多个…

磁盘管理与分区

磁盘管理 一、磁盘类型 SATA,SCSI,SAS类型的磁盘,在Linux中用sd来表示。 其中第一块硬盘为sda,第二块二sdb,以此类推。 第一块硬盘的第一个分区为sda1。 nvme类型的磁盘,在Linux中使用nvmeXnYpZ进行表示。 X:数字&…

Linux 逻辑卷管理

练习创建物理卷(pv->vg->lv)物理卷(PV)就像把一块块独立的硬盘,标记成 "可用于搭建 LVM 的积木",让系统知道这些硬盘可以被 LVM 管理。#把sdb这块硬盘标记为物理卷(相当于给这块积木盖章,说…

向日葵参考基因组

向日葵参考基因组升级多个版本 向日葵基因组为油脂代谢、开花调控及菊类植物进化提供新见解-文献精读151-CSDN博客 官网 https://www.sunflowergenome.org/annotations-data/

什么是爬虫协议?

什么是爬虫协议? 爬虫协议(Crawl Protocol)是指为了有效地收集网页内容而建立的一些规定和标准,用以指导网络爬虫如何在互联网上抓取信息。 爬虫协议主要指的是Robots协议(Robots Exclusion Protocol)&am…

空间平面旋转与xoy平行

空间平面旋转与xoy平行 法向量 空间平面axbyczd0的其中一个法向量(a,b,c),法向量垂直于空间平面。目标平面平行于xoy的平面为0x0yczd0;其中一个法向量为(0,0,c),c可以为不为0的任意值,取(0,0,1),目标平面的的法向量垂直于xoy平面 向量叉乘点乘 两个向量的…

odoo reportbro 拖拽式报表设计

报表设计以及下载 在实际业务中应用非常的广泛且频繁。odoo 本身也具有报表设计功能,但都是代码模式。且需要开发人员定制化开发,耗费成本高 所以引入reportbro报表设计就非常的简单快捷。低代码模式 以下以销售报表为例进行演示 报表字段配置报表界面设…

数字信号处理_编程实例1

stem([1,2,3]) 一、初始设置 %% 初始设置 % 清空工作空间,关闭无关页面 clc,clear,close all; % 绘图变量 font_size 12; %全局基础字体大小 axis_size 10; %坐标轴刻度标签字体大小 line_width 2; %绘图线条宽度 legend_size 10.5; %图例字体大小 marker_siz…

Docker 安装部署 OceanBase

1.拉取镜像 docker pull oceanbase/oceanbase-ce:latest2.启动oceanbase容器 docker run -p 2881:2881 --name oceanbase-ce -e MINI_MODE0 -d quay.io/oceanbase/oceanbase-ce3.查看oceanbase初始化的日志信息 docker logs oceanbase-ce4.进入oceanbase容器 docker exec -it o…