【GenBI實戰】python腳本實現基于DeepSeek api的數據查詢和圖表可視化

寫在前面

生成式 BI (GenBI) 正在改變我們與數據交互的方式。它允許用戶使用自然語言提出問題,并自動獲得數據洞察,而無需編寫復雜的 SQL 查詢或手動創建圖表。本文將帶你動手實戰,使用 Python 和 DeepSeek API (或其他類似的大語言模型 API) 實現一個簡單的 GenBI 流程:

  1. 輸入: Markdown 表格形式的數據和自然語言查詢。
  2. 處理: 利用 DeepSeek API 的強大語言理解和代碼生成能力,將自然語言查詢轉換為 Python 代碼,并使用該代碼處理 Markdown 表格數據。
  3. 輸出: 生成可視化圖表(使用 Plotly 庫)。

通過這個實戰項目,你將學習如何:

  • 使用 DeepSeek API (或其他 LLM API)。
  • 解析 Markdown 表格數據。
  • 將自然語言查詢轉換為 Python 代碼。
  • 使用 Python 代碼處理數據并生成可視化圖表 (使用 Plotly)。

前提條件

  • Python 3.7 或更高版本
  • 安裝必要的 Python 庫:
    pip install requests pandas plotly
    
    如果沒有DeepSeek的API_KEY, 可以替換成其他LLM,比如OpenAI, 文心一言, 通義千問, 智譜AI等。需要稍微修改對應的API調用代碼。
  • DeepSeek API 密鑰 (或其他 LLM API 密鑰)

項目結構

genbi_project/
├── main.py        # 主程序
├── data.md        # 示例 Markdown 數據文件 (可選)
└── requirements.txt # 依賴庫列表

步驟 1:設置 DeepSeek API 密鑰 (或其他 LLM API 密鑰)
首先,需要獲取DeepSeek API的密鑰。訪問DeepSeek官網注冊賬號,然后在控制臺中找到你的API key。
如果你沒有DeepSeek的API key,可以使用其他大語言模型API, 例如:

  • OpenAI: 訪問 https://platform.openai.com/ 注冊并獲取 API 密鑰。
  • 文心一言 (ERNIE Bot): 訪問 https://yiyan.baidu.com/ 注冊并獲取 API 密鑰。
  • 通義千問: 訪問https://tongyi.aliyun.com/注冊并獲取API key.
  • 智譜AI: 訪問https://open.bigmodel.cn/注冊并獲取API key.

將獲取到的 API 密鑰設置為環境變量或直接在代碼中設置(不推薦在代碼中明文存儲密鑰):

# main.py (示例 - 使用環境變量)
import os# 從環境變量獲取 API 密鑰 (推薦)
DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY")
# 或者直接設置 API 密鑰 (不推薦)
# DEEPSEEK_API_KEY = "YOUR_DEEPSEEK_API_KEY"

替換其他LLM的API KEY和調用方式
如果使用其他LLM,需要做以下幾處修改:

  1. API 密鑰:DEEPSEEK_API_KEY 替換為你所用 LLM 的 API 密鑰。
  2. API 調用:call_deepseek_api 函數替換為調用你所用 LLM API 的函數。 不同的 LLM API 有不同的調用方式(請求 URL、參數、返回結果格式等),需要參考其官方文檔進行修改。
  3. Prompt: Prompt 的內容可能需要根據不同 LLM 的特點進行微調,以獲得最佳效果。

步驟 2:定義 DeepSeek API 調用函數

創建一個函數來調用 DeepSeek API:

# main.py
import requestsdef call_deepseek_api(prompt, model="deepseek-coder", max_tokens=1000, temperature=0.5):"""調用 DeepSeek API。Args:prompt: 輸入給模型的 Prompt。model: 使用的模型名稱。max_tokens: 生成的最大 token 數。temperature: 控制生成結果的隨機性。Returns:模型生成的文本,如果發生錯誤則返回 None。"""if DEEPSEEK_API_KEY is None:raise ValueError("DeepSeek API key not found.  Set the DEEPSEEK_API_KEY environment variable.")url = "https://api.deepseek.com/v1/chat/completions"  # 請根據 DeepSeek API 文檔修改 URLheaders = {"Content-Type": "application/json","Authorization": f"Bearer {DEEPSEEK_API_KEY}",}data = {"model": model,"messages": [{"role": "user", "content": prompt}],"max_tokens": max_tokens,"temperature": temperature,}try:response = requests.post(url, headers=headers, json=data)response.raise_for_status()  # 如果請求失敗,拋出異常return response.json()["choices"][0]["message"]["content"]except requests.exceptions.RequestException as e:print(f"Error calling DeepSeek API: {e}")return None

步驟 3:解析 Markdown 表格數據

創建一個函數來解析 Markdown 表格數據,并將其轉換為 Pandas DataFrame:

# main.py
import pandas as pd
import redef parse_markdown_table(markdown_table):"""解析 Markdown 表格數據,并將其轉換為 Pandas DataFrame。Args:markdown_table: Markdown 表格字符串。Returns:Pandas DataFrame,如果解析失敗則返回 None。"""try:# 使用正則表達式分割行lines = markdown_table.strip().split('\n')header = [s.strip() for s in re.split(r"\|", lines[0])[1:-1]]# 移除表頭下的分隔線lines = lines[2:]data = []for line in lines:# 使用正則表達式分割單元格, 考慮 | 前后可能有空格row = [s.strip() for s in re.split(r"\s*\|\s*", line)[1:-1]]data.append(row)df = pd.DataFrame(data, columns=header)return dfexcept Exception as e:print(f"Error parsing Markdown table: {e}")return None

步驟 4:構建 Prompt 并調用 DeepSeek API

創建一個函數來構建 Prompt,調用 DeepSeek API,并獲取生成的 Python 代碼:

# main.pydef generate_python_code(markdown_table, query):"""構建 Prompt,調用 DeepSeek API,并獲取生成的 Python 代碼。Args:markdown_table: Markdown 表格字符串。query: 自然語言查詢。Returns:生成的 Python 代碼(字符串形式),如果生成失敗則返回 None。"""prompt = f"""
You are a helpful assistant that generates Python code to analyze data and create visualizations.
You are given a Markdown table and a natural language query.
Generate Python code (using pandas and plotly) to:
1.  Parse the Markdown table into a pandas DataFrame.
2.  Process the DataFrame to answer the query.
3.  Create a visualization (using plotly) of the result.
4.  Print the figure in JSON format using `fig.to_json()`. Do *not* use `fig.show()`.Markdown Table:
```markdown
{markdown_table}

Natural Language Query:
{query}

Python Code:

"""code = call_deepseek_api(prompt)return code

步驟 5:執行生成的 Python 代碼并獲取可視化結果

創建一個函數來執行生成的 Python 代碼,并獲取 Plotly 圖表的 JSON 表示:

# main.py
import jsondef execute_code_and_get_visualization(code):"""執行生成的 Python 代碼,并獲取 Plotly 圖表的 JSON 表示。Args:code: 要執行的 Python 代碼。Returns:Plotly 圖表的 JSON 表示(字符串形式),如果執行失敗則返回 None。"""try:# 創建一個局部命名空間,用于執行代碼local_vars = {}exec(code, {}, local_vars)# 檢查是否有 'fig' 變量 (Plotly 圖表對象)if 'fig' in local_vars:fig = local_vars['fig']# 將 Plotly 圖表轉換為 JSON 格式fig_json = fig.to_json()return fig_jsonelse:print("Error: No 'fig' variable found in the generated code.")return Noneexcept Exception as e:print(f"Error executing generated code: {e}")return None

步驟 6:主程序邏輯

# main.py
def main():"""主程序邏輯。"""# 示例 Markdown 表格數據markdown_table = """
| Region | Sales | Profit |
|---|---|---|
| North America | 1200000 | 240000 |
| Europe | 950000 | 190000 |
| Asia | 800000 | 160000 |
| South America | 500000 | 80000 |
| Africa | 300000 | 45000 |
"""# 示例自然語言查詢query = "Show a bar chart of sales by region, sorted in descending order."# 生成 Python 代碼code = generate_python_code(markdown_table, query)if code:print("Generated Python code:\n", code)# 執行代碼并獲取可視化結果visualization_json = execute_code_and_get_visualization(code)if visualization_json:print("\nVisualization (JSON format):\n", visualization_json)# (可選) 將 JSON 數據保存到文件with open("visualization.json", "w") as f:f.write(visualization_json)print("\nVisualization saved to visualization.json")# (可選) 在瀏覽器中顯示圖表 (需要額外的 JavaScript 代碼)else:print("Failed to generate visualization.")else:print("Failed to generate Python code.")
if __name__ == "__main__":main()

完整的 main.py 代碼:

import os
import requests
import pandas as pd
import re
import json
import plotly.express as px# 從環境變量獲取 API 密鑰 (推薦)
DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY")
# 或者直接設置 API 密鑰 (不推薦)
# DEEPSEEK_API_KEY = "YOUR_DEEPSEEK_API_KEY"def call_deepseek_api(prompt, model="deepseek-coder", max_tokens=1000, temperature=0.5):"""調用 DeepSeek API。Args:prompt: 輸入給模型的 Prompt。model: 使用的模型名稱。max_tokens: 生成的最大 token 數。temperature: 控制生成結果的隨機性。Returns:模型生成的文本,如果發生錯誤則返回 None。"""if DEEPSEEK_API_KEY is None:raise ValueError("DeepSeek API key not found.  Set the DEEPSEEK_API_KEY environment variable.")url = "https://api.deepseek.com/v1/chat/completions"  # 請根據 DeepSeek API 文檔修改 URLheaders = {"Content-Type": "application/json","Authorization": f"Bearer {DEEPSEEK_API_KEY}",}data = {"model": model,"messages": [{"role": "user", "content": prompt}],"max_tokens": max_tokens,"temperature": temperature,}try:response = requests.post(url, headers=headers, json=data)response.raise_for_status()  # 如果請求失敗,拋出異常return response.json()["choices"][0]["message"]["content"]except requests.exceptions.RequestException as e:print(f"Error calling DeepSeek API: {e}")return None
def parse_markdown_table(markdown_table):"""解析 Markdown 表格數據,并將其轉換為 Pandas DataFrame。Args:markdown_table: Markdown 表格字符串。Returns:Pandas DataFrame,如果解析失敗則返回 None。"""try:# 使用正則表達式分割行lines = markdown_table.strip().split('\n')header = [s.strip() for s in re.split(r"\|", lines[0])[1:-1]]# 移除表頭下的分隔線lines = lines[2:]data = []for line in lines:# 使用正則表達式分割單元格, 考慮 | 前后可能有空格row = [s.strip() for s in re.split(r"\s*\|\s*", line)[1:-1]]data.append(row)df = pd.DataFrame(data, columns=header)return dfexcept Exception as e:print(f"Error parsing Markdown table: {e}")return None
def generate_python_code(markdown_table, query):"""構建 Prompt,調用 DeepSeek API,并獲取生成的 Python 代碼。Args:markdown_table: Markdown 表格字符串。query: 自然語言查詢。Returns:生成的 Python 代碼(字符串形式),如果生成失敗則返回 None。"""prompt = f"""
You are a helpful assistant that generates Python code to analyze data and create visualizations.
You are given a Markdown table and a natural language query.
Generate Python code (using pandas and plotly) to:
1.  Parse the Markdown table into a pandas DataFrame.
2.  Process the DataFrame to answer the query.
3.  Create a visualization (using plotly) of the result.
4.  Print the figure in JSON format using `fig.to_json()`. Do *not* use `fig.show()`.Markdown Table:
```markdown
{markdown_table}

Natural Language Query:
{query}

Python Code:

"""code = call_deepseek_api(prompt)return code
import jsondef execute_code_and_get_visualization(code):"""執行生成的 Python 代碼,并獲取 Plotly 圖表的 JSON 表示。Args:code: 要執行的 Python 代碼。Returns:Plotly 圖表的 JSON 表示(字符串形式),如果執行失敗則返回 None"""try:# 創建一個局部命名空間,用于執行代碼local_vars = {}exec(code, {}, local_vars)# 檢查是否有 'fig' 變量 (Plotly 圖表對象)if 'fig' in local_vars:fig = local_vars['fig']# 將 Plotly 圖表轉換為 JSON 格式fig_json = fig.to_json()return fig_jsonelse:print("Error: No 'fig' variable found in the generated code.")return Noneexcept Exception as e:print(f"Error executing generated code: {e}")return None
def main():"""主程序邏輯。"""# 示例 Markdown 表格數據markdown_table = """
| Region | Sales | Profit |
|---|---|---|
| North America | 1200000 | 240000 |
| Europe | 950000 | 190000 |
| Asia | 800000 | 160000 |
| South America | 500000 | 80000 |
| Africa | 300000 | 45000 |
"""# 示例自然語言查詢query = "Show a bar chart of sales by region, sorted in descending order."# 生成 Python 代碼code = generate_python_code(markdown_table, query)if code:print("Generated Python code:\n", code)# 執行代碼并獲取可視化結果visualization_json = execute_code_and_get_visualization(code)if visualization_json:print("\nVisualization (JSON format):\n", visualization_json)# (可選) 將 JSON 數據保存到文件with open("visualization.json", "w") as f:f.write(visualization_json)print("\nVisualization saved to visualization.json")# (可選) 在瀏覽器中顯示圖表 (需要額外的 JavaScript 代碼)else:print("Failed to generate visualization.")else:print("Failed to generate Python code.")
if __name__ == "__main__":main()

運行結果
成功運行后,控制臺會輸出生成的Python代碼和圖表的JSON格式數據。
程序會在目錄下創建一個visualization.json文件。
DeepSeek API (或其他 LLM API) 生成的 Python 代碼可能如下所示(實際生成的代碼可能略有不同):

import pandas as pd
import plotly.express as px
import re# 解析 Markdown 表格 (與 parse_markdown_table 函數相同)
def parse_markdown_table(markdown_table):try:lines = markdown_table.strip().split('\n')header = [s.strip() for s in re.split(r"\|", lines[0])[1:-1]]lines = lines[2:]data = []for line in lines:row = [s.strip() for s in re.split(r"\s*\|\s*", line)[1:-1]]data.append(row)df = pd.DataFrame(data, columns=header)return dfexcept Exception as e:print(f"Error parsing Markdown table: {e}")return None# 將 Markdown 表格解析為 DataFrame
df = parse_markdown_table(markdown_table)# 將 'Sales' 列轉換為數值類型
df['Sales'] = pd.to_numeric(df['Sales'])# 按 'Sales' 列降序排序
df_sorted = df.sort_values('Sales', ascending=False)# 創建柱狀圖
fig = px.bar(df_sorted, x='Region', y='Sales', title='Sales by Region (Sorted)')# 將圖表轉換為 JSON 格式 (重要:不要使用 fig.show())
# print(fig.to_json()) # 這行被注釋掉,因為我們已經在 execute_code_and_get_visualization 函數中處理了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72028.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Web-to-Web和Server-to-Serve歸因方法

Web2Web 和 S2S 歸因方法 1. Web2Web 歸因方法 原理: Web2Web(Web-to-Web)歸因方法主要用于跟蹤用戶在網站之間的行為路徑。它通過瀏覽器中的Cookie或其他標識符來追蹤用戶在不同網站之間的行為,從而確定用戶轉化的路徑。 使用…

c++中迭代器和指針有什么區別?

在 C 中,迭代器和指針雖然在某些場景下有相似的行為,但它們在設計目的、功能和使用場景上有本質區別。以下是詳細對比和最佳實踐: 一、核心區別對比表 特征指針迭代器本質原生數據類型,直接存儲內存地址類對象,抽象容…

如何使用Docker搭建哪吒監控面板程序

哪吒監控(Nezha Monitoring)是一款自托管、輕量級的服務器和網站監控及運維工具,旨在為用戶提供實時性能監控、故障告警及自動化運維能力。 文檔地址:https://nezha.wiki/ 本章教程,使用Docker方式安裝哪吒監控面板,在此之前,你需要提前安裝好Docker. 我當前使用的操作系…

ONLYOFFICE + Ollama,本地AI模型的高效集成方案

這篇文章將繼續探討如何在 ONLYOFFICE 中連接并高效使用各類 AI 模型。今天的主角是 Ollama——一個專為本地部署和運行 AI 模型的平臺。如何使用 Ollama 并與 ONLYOFFICE 編輯器集成,利用其強大的 AI 模型處理文本任務。以下是詳細的操作步驟和使用方法。 關于 ONL…

單片機開發為什么不用C++?

最近受到很多初學者的靈魂拷問,單片機需要學C嗎? 還別說,問這問題的還挺多的,今天以一篇文章來說下。 很多小白覺得,C語言這老古董,語法簡陋得像石器時代的產物,為什么還牢牢霸占著單片機開發的…

2025-02-28 學習記錄--C/C++-C語言 scanf 中,%s 不需要加

合抱之木,生于毫末;九層之臺,起于累土;千里之行,始于足下。💪🏻 C語言 scanf 中,%s 不需要加 & 格式化符號變量類型是否需要加 &原因%s字符數組不需要數組名本身就是指針&a…

數字樣機:從技術革新到產業賦能的演進之路

摘要:數字樣機作為產品全生命周期數字化的核心技術,旨在通過虛擬化建模與仿真技術重構傳統工業研發范式。 數字樣機(Digital Prototype,DP)技術是一種數字化設計技術,利用數字樣機替代原型樣機&#xff0c…

Ubuntu20.04安裝Isaac sim/ Isaac lab

2025年之后omniverse好像不能直接裝Isaac sim了,要跳轉到官網鏈接。 Isaac lab要在Isaac sim安裝之后才能安裝 Ubuntu20.04安裝Isaac sim/ Isaac lab Isaac sim安裝Isaac lab安裝 Isaac sim安裝 找到官網 Isaac sim官方文檔 下載下來解壓到本地文件夾&#xff0c…

【前端】XML,XPATH,與HTML的關系

XML與HTML關系 XML(可擴展標記語言)和 HTML(超文本標記語言)是兩種常見的標記語言,但它們有不同的目的和用途。它們都使用類似的標記結構(標簽),但在設計上存在一些關鍵的差異。 XML…

8款智能排班系統,全面深入介紹

本文介紹了以下8款主流的排班系統:1.i人事;2.Moka; 3.When I Work; 4.薪人薪事; 5.泛微e-office; 6.多可軟件; 7.釘釘; 8.Homebase等。 排班系統作為一種高效的管理工具,…

DeepSeek 助力 Vue3 開發:打造絲滑的頁腳(Footer)

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏關注哦 💕 目錄 Deep…

SpringCloud 微服務框架

單體架構:將業務全部功能集中到一個項目中,打成一個war包存儲,部署在一臺服務器中,只有一個數據庫 優點 :架構簡單,部署成本低。適合小型項目 問題:高并發性能問題,開發時代碼耦合問題&#x…

goLand導入git項目并打包發布linux

作為項目管理,擁有半吊子開發能力,居然有一天需要修改維護go項目。。。從菜鳥教程學習開始~苦 goland導入git項目 本地啟動 導入之后會自動更新相關依賴。 本人導入之后立馬修改了依賴位置,且修改為一項目一位置,互不干涉。 在代…

通義靈碼插件安裝入門教學 - IDEA(安裝篇)

在開發過程中,使用合適的工具和插件可以極大地提高我們的工作效率。今天,我們將詳細介紹如何在 IntelliJ IDEA 中安裝并配置通義靈碼插件,這是一款旨在提升開發者效率的實用工具。無論你是新手還是有經驗的開發者,本文都將為你提供…

【設計模式精講】開源實戰之剖析Spring框架:Spring中工廠模式的應用

文章目錄 第七章 開源實戰7.1 剖析Spring框架中用到的經典設計模式7.1.1 Spring中工廠模式的應用7.1.1.1 Spring中的Bean組件7.1.1.2 Spring中的BeanFactory7.1.1.3 Spring中的FactoryBean 個人主頁:道友老李 歡迎加入社區:道友老李的學習社區 第七章 開…

[數據結構]用棧實現隊列

思路分析 代碼實現: typedef int STDataType; typedef struct Stack {int* a;int top;//下標int capacity; }ST; //棧的初始化 void STInit(ST* ps); //棧的插入 void STPush(ST* ps, STDataType x); //棧的刪除 void STPop(ST* ps); // int STSize(ST* ps); //判斷…

C++ 17 允許在 for 循環,if 語句,switch 語句中初始化變量

看到 c 有這個特性,python 和 java 似乎都沒有,根據 AI 的回答進行了一些整理總結。 文章目錄 **1. 在 for 循環中初始化變量****特點****多個變量初始化** **2. 在 if 語句中初始化變量(C17 及以上)****示例****特點** **3. 在 s…

【云原生之kubernetes實戰】在k8s環境中高效部署Vikunja任務管理工具(含數據庫配置)

【【云原生之kubernetes實戰】在k8s環境中高效部署Vikunja任務管理工具(含數據庫配置) 前言一、Vikunja介紹1.1 Vikunja簡介1.2 Vikunja主要特點1.3 使用場景二、相關知識介紹2.1 本次實踐存儲介紹2.2 k8s存儲介紹三、本次實踐介紹3.1 本次實踐簡介3.2 本次環境規劃3.3 部署前…

分享一個常用的命名規則和Spring的命名風格

目錄 Spring 命名風格規范總結表 常用代碼命名單詞(通用且專業) 命名技巧 一、返回布爾值的方法 二、條件執行方法 三、異步處理方法 四、回調方法 五、集合操作方法 六、狀態校驗方法 七、對象生命周期方法 八、數據操作方法 Spring 命名風格規…

【Golang學習之旅】Go-zero + Gen:如何使用 Gen 提升 Go 開發效率

文章目錄 前言一、Go-zero簡介二、Gen工具簡介2.1 Gen的功能與特點2.2 Gen的工作原理 三、Go-zero Gen:結合的優勢3.1為什么選擇Go-zero與Gen3.2 Gen的代碼生成與Go-zero的結合點 四、實際案例:Go-zero Gen的應用4.1 構建一個用戶管理系統4.2 定義Gen配…