【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.mzph.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配…