<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      PandasAI連接LLM對MySQL數(shù)據(jù)庫進行數(shù)據(jù)分析

      1. 引言

      在之前的文章《PandasAI連接LLM進行智能數(shù)據(jù)分析》中實現(xiàn)了使用PandasAI連接與DeepSeek模型通過自然語言進行數(shù)據(jù)分析。不過那個例子中使用的是PandasAI 2.X,并且使用的是本地.csv文件來作為數(shù)據(jù)。在實際應(yīng)用的系統(tǒng)中,使用.csv作為庫表的情況比較少見。在本文中,就試試使用最新的PandasAI 3.0對MySQL數(shù)據(jù)庫中涉及到多個表的數(shù)據(jù)進行數(shù)據(jù)分析。

      2. 詳述

      既然要連接MySQL數(shù)據(jù)庫,那么就要先準備數(shù)據(jù)了。在MySQL創(chuàng)建一個數(shù)據(jù)庫chinese_retail_data,在數(shù)據(jù)庫中創(chuàng)建兩張表customers和orders,并且插入數(shù)據(jù)。這里模擬的是電商系統(tǒng)重點用戶表和訂單表。具體的SQL語句如下所示:

      -- 創(chuàng)建數(shù)據(jù)庫
      CREATE DATABASE IF NOT EXISTS chinese_retail_data;
      USE chinese_retail_data;
      
      -- 創(chuàng)建客戶表 (主表)
      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
      );
      
      -- 創(chuàng)建訂單表 (從表,通過customer_id關(guān)聯(lián))
      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)
      );
      
      -- 插入客戶數(shù)據(jù)(字段值使用中文)
      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');
      
      -- 插入訂單數(shù)據(jù)(字段值使用中文,關(guān)聯(lián)customer_id)
      INSERT INTO orders (customer_id, product_name, category, quantity, unit_price, order_date, payment_method, delivery_status) VALUES
      (1, '華為手機', '電子產(chǎn)品', 1, 5999.00, '2024-04-01', '支付寶', '已送達'),
      (2, '美的空調(diào)', '家用電器', 1, 3200.00, '2024-04-03', '微信支付', '已送達'),
      (3, '李寧運動鞋', '服飾鞋帽', 2, 499.00, '2024-04-05', '信用卡', '運輸中'),
      (1, '小米手環(huán)', '電子產(chǎn)品', 1, 299.00, '2024-04-08', '支付寶', '已送達'),
      (4, '格力冰箱', '家用電器', 1, 4800.00, '2024-04-10', '微信支付', '已送達'),
      (5, '耐克T恤', '服飾鞋帽', 3, 199.00, '2024-04-12', '支付寶', '已送達'),
      (2, '蘋果平板', '電子產(chǎn)品', 1, 3899.00, '2024-04-15', '微信支付', '已送達'),
      (6, '海爾洗衣機', '家用電器', 1, 2800.00, '2024-04-18', '信用卡', '已送達'),
      (7, '阿迪達斯運動褲', '服飾鞋帽', 1, 599.00, '2024-04-20', '支付寶', '運輸中'),
      (1, '戴爾筆記本', '電子產(chǎn)品', 1, 7999.00, '2024-04-25', '微信支付', '已送達'),
      (8, '西門子烤箱', '家用電器', 1, 2200.00, '2024-04-28', '信用卡', '已送達'),
      (3, '優(yōu)衣庫襯衫', '服飾鞋帽', 4, 199.00, '2024-05-01', '支付寶', '已送達'),
      (4, 'OPPO手機', '電子產(chǎn)品', 1, 2999.00, '2024-05-05', '微信支付', '已送達'),
      (5, '彪馬運動鞋', '服飾鞋帽', 1, 699.00, '2024-05-08', '信用卡', '運輸中'),
      (2, '索尼耳機', '電子產(chǎn)品', 2, 899.00, '2024-05-12', '支付寶', '已送達');
      

      然后準備PandasAI的環(huán)境。注意默認的Python環(huán)境pip安裝的可能仍然是2.X版本,不過在使用PandasAI官方文檔推薦使用Poetry之后,就可以pip安裝3.0了。

      最后給出具體的Python腳本:

      import pandasai
      from pandasai_litellm import LiteLLM
      
      llm_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 = "電商系統(tǒng)客戶的基本信息,包括個人屬性、地理位置和會員等級等靜態(tài)特征。",
              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": "客戶的唯一標識符,用于關(guān)聯(lián)訂單數(shù)據(jù)。"},
                  {"name": "customer_name", "type": "string", "description": "客戶的姓名,用于識別和溝通。"},
                  {"name": "gender", "type": "string", "description": "客戶的性別,用于人口統(tǒng)計分析。"},
                  {"name": "age_group", "type": "string", "description": "客戶所屬的年齡段,用于年齡相關(guān)的市場細分。"},
                  {"name": "city", "type": "string", "description": "戶所在的城市,用于地域性銷售分析。"},
                  {"name": "membership_level", "type": "string", "description": "客戶的會員等級,反映客戶價值和忠誠度。"},
                  {"name": "registration_date", "type": "datetime", "description": "客戶的注冊日期,用于計算客戶生命周期。"},
              ]
          )
      
          pandasai.create(
              path = table_names[1],
              description = "電商系統(tǒng)客戶的訂單交易詳情,包括購買的商品、數(shù)量、價格、時間和狀態(tài)等動態(tài)行為。",
              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": "關(guān)聯(lián)到客戶的外鍵,建立與客戶表的聯(lián)系。"},
                  {"name": "product_name", "type": "string", "description": "所購商品的名稱,用于產(chǎn)品銷售分析。"},
                  {"name": "category", "type": "string", "description": "商品所屬的類別,用于分類統(tǒng)計和趨勢分析。"},
                  {"name": "quantity", "type": "integer", "description": "購買的商品數(shù)量,影響總銷售額和庫存。"},
                  {"name": "unit_price", "type": "float", "description": "商品的單價,用于計算訂單金額和利潤。"},
                  {"name": "order_date", "type": "datetime", "description": "訂單創(chuàng)建的日期,用于時間序列和趨勢分析。"},
                  {"name": "payment_method", "type": "string", "description": "客戶使用的支付方式,反映支付偏好。"},
                  {"name": "delivery_status", "type": "string", "description": "訂單的配送狀態(tài),用于監(jiān)控物流和客戶滿意度。"},
              ]
          )
      
      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})
      
          # 加載所有相關(guān)的表   
          tables = [pandasai.load(name) for name in table_names]
      
          chat_content = "統(tǒng)計一下目前電商系統(tǒng)中會員類型的占比,以及每種會員類型購買商品的數(shù)額在銷售額總量的占比。請使用中文回答。"
      
          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類來連接自定義的大模型了,使用內(nèi)置的LiteLLM就可以了。另外PandasAI官方還提供大模型可以使用,不過需要申請key。這里筆者連接的還是阿里云百煉平臺的DeepSeek。

      2. PandasAI設(shè)計的數(shù)據(jù)接口筆者覺得有點奇怪,主要有兩點:

        • pandasai.create創(chuàng)建的表格數(shù)據(jù)只能使用一次,如果數(shù)據(jù)存在第二次再調(diào)用這個函數(shù)(在init_dataset函數(shù)中)就會報錯。
        • PandasAI對創(chuàng)建的數(shù)據(jù)集名稱還有要求,比如多個單詞必須以"-"進行連接。
      3. PandasAI官網(wǎng)創(chuàng)建MySQL數(shù)據(jù)集的案例代碼[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 = "電商系統(tǒng)客戶的基本信息,包括個人屬性、地理位置和會員等級等靜態(tài)特征。",
            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": "客戶的唯一標識符,用于關(guān)聯(lián)訂單數(shù)據(jù)。"},
                {"name": "customer_name", "type": "string", "description": "客戶的姓名,用于識別和溝通。"},
                {"name": "gender", "type": "string", "description": "客戶的性別,用于人口統(tǒng)計分析。"},
                {"name": "age_group", "type": "string", "description": "客戶所屬的年齡段,用于年齡相關(guān)的市場細分。"},
                {"name": "city", "type": "string", "description": "戶所在的城市,用于地域性銷售分析。"},
                {"name": "membership_level", "type": "string", "description": "客戶的會員等級,反映客戶價值和忠誠度。"},
                {"name": "registration_date", "type": "datetime", "description": "客戶的注冊日期,用于計算客戶生命周期。"},
            ]
        )
        

        關(guān)鍵不同點就在于columns屬性值的位置。使用前者實際上是會丟失表格字段描述的。表格字段描述非常重要,PandasAI會將其傳遞給LLM來理解表格數(shù)據(jù)。如果創(chuàng)建成功的話,可以在Python腳本所在目錄的datasets文件夾中,找到創(chuàng)建好的.yaml文件,其中有表格數(shù)據(jù)的字段表述值:

      3. 結(jié)果

      最終運行結(jié)果如下所示:

      membership_level  會員占比(%)  銷售額占比(%)
      0             普通會員     37.5      9.30
      1             鉑金會員     25.0     29.48
      2             黃金會員     37.5     61.23
      

      本例中還有一點值得注意的是這里進行的數(shù)據(jù)分析是跨表數(shù)據(jù)分析,而不是像《PandasAI連接LLM進行智能數(shù)據(jù)分析》中那樣使用的是單表。其實這就是個很有趣的問題,我們都知道業(yè)務(wù)系統(tǒng)的核心就是CURD,那么如果跨表查詢可以實現(xiàn),是不是意味著以后就可以通過自然語言來進行業(yè)務(wù)呢?現(xiàn)在語音的正確識別率也不低,通過語言來進行業(yè)務(wù)操作也不難吧?這就回到了筆者在之前的文章《行業(yè)思考:不是前端不行,是只會前端不行》中的討論:也許AI可能會對傳統(tǒng)Web前端方向帶來革命性的影響。


      1. PandasAI官方文檔 ??

      posted @ 2025-08-04 22:58  charlee44  閱讀(352)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 奇台县| 中文字幕人乱码中文| 日韩av一区二区三区不卡| 丰满少妇人妻久久久久久| 97国产揄拍国产精品人妻| 欧美精品高清在线观看| 日韩不卡一区二区三区四区 | 国产日韩久久免费影院| 麻花传剧mv在线看免费| 久久亚洲国产品一区二区| 99人体免费视频| 国产成人卡2卡3卡4乱码| 亚洲综合另类小说色区色噜噜| 国产熟女一区二区五月婷| 国精产品一区一区三区mba下载| 国产三级国产精品国产专| 国产丰满乱子伦无码专区| 熟女在线视频一区二区三区| 四虎成人精品无码永久在线| 亚洲欧美综合一区二区三区| 国产在热线精品视频99公交 | 国产一级黄色片在线播放| 久久夜色精品国产亚av| 欧美乱码伦视频免费| 老熟女熟妇一区二区三区| 欧美性猛交xxxx乱大交极品| 精品九九热在线免费视频| 91中文字幕一区在线| 国产美女午夜福利视频| 欧洲精品久久久AV无码电影| 色老头亚洲成人免费影院| 在线亚洲妇色中文色综合 | 久久精品夜夜夜夜夜久久| 久久一本人碰碰人碰| 国产精品日韩av在线播放 | 富锦市| 无码人妻丰满熟妇啪啪欧美| 日韩中文字幕人妻一区| 都市激情 在线 亚洲 国产| 亚洲区综合区小说区激情区| 国产精品无码一区二区桃花视频 |