PandasAI連接LLM對MySQL數據庫進行數據分析

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…