当前位置: 首页 > article >正文

CSV数据分析智能工具(基于OpenAI API和streamlit)

utils.py:

from langchain_openai import ChatOpenAI
from langchain_experimental.agents.agent_toolkits import create_csv_agent
import jsonPROMPT_TEMPLATE = """你是一位数据分析助手,你的回应内容取决于用户的请求内容。1. 对于文字回答的问题,按照这样的格式回答:{"answer": "<你的答案写在这里>"}例如:{"answer": "订单量最高的产品ID是!MNWC3-067"}2. 如果用户需要一个表格,按照这样的格式回答:{"table": {"columns": ["column1", "column2", ...], "data": [[value1, value2, ...],[value1, value2, ...],...]}}3. 如果用户的请求适合返回条形图,按照这样的格式回答:{"bar": {"columns": ["A", "B", "C", ...], "data": [34, 21, 91, ...]}}4. 如果用户的请求适合返回折线图,按照这样的格式回答:{"line": {"columns": ["A", "B", "C", ...], "data": [34, 21, 91, ...]}}5. 如果用户的请求适合返回散点图,按照这样的格式回答:{"scatter": {"columns": ["A", "B", "C", ...], "data": [34, 21, 91, ...]}}注意:我们只支持三种类型的图表:"bar", "line" 和 "scatter"。请将所有输出作为JSON字符串返回。请注意要将"columns"列表和数据列表中的所有字符串都用双引号包围。例如:{"columns": ["Products", "Orders"], "data": [["32085Lip", 245], ["76439Eye", 178]]}你要处理的用户请求如下:"""def dataframe_agent(api_key, uploaded_file, query):model = ChatOpenAI(model="gpt-4",api_key=api_key,base_url="https://api.gptsapi.net/v1",temperature=0)# path 复制文件到本地,得到路径file_content = uploaded_file.getvalue() #.read()改成.getvalue(),就能读了print(file_content)print(type(file_content))print(type(file_content))file_path = "temp.csv"with open(file_path,"wb") as fwb:fwb.write(file_content)# agent执行器agent_executor = create_csv_agent(llm=model,path=file_path,allow_dangerous_code=True,agent_executor_kwargs={"handle_parsing_errors": True},verbose=True)# 输入 = 我们补充的提示 + 用户输入prompt = PROMPT_TEMPLATE + queryresult = agent_executor.invoke({"input": prompt})# result_dict = json.loads(result["output"]) #实际输出的内容是output键对应的值,然后把它解析成字典,方便前端使用# return result_dicttry : result_dict = json.loads(result["output"]) #实际输出的内容是output键对应的值,然后把它解析成字典,方便前端使用finally : print(result["output"])return result_dict# # 自定义一个类来模拟 UploadedFile 对象
# class CustomUploadedFile:
#     def __init__(self, name, type, data):
#         self.name = name
#         self.type = type
#         self.data = data
#         self.size = len(data)#     def read(self):
#         return self.data# # 自定义一个函数将文件路径转换为类似 UploadedFile 的对象
# def file_path_to_uploaded_file(file_path):
#     with open(file_path, 'rb') as f:
#         file_content = f.read()
#     file_name = file_path.split("/")[-1]  # 获取文件名
#     file_type = "text/csv"  # 假设是 CSV 文件,可根据实际情况修改
#     return CustomUploadedFile(file_name, file_type, file_content)# # 示例文件路径
# file_path = "test_data.csv"# # 转换为 UploadedFile 对象
# uploaded_file = file_path_to_uploaded_file(file_path)# import os 
# import pandas as pd# print(dataframe_agent(os.getenv("OPENAI_API_KEY"),uploaded_file,"数据里score的范围是什么"))

 main.py:

import streamlit as st
from utils import dataframe_agent
import pandas as pd
import osdef create_chart(input_data, chart_type):# 检查"data"字段是否存在且非空if "data" not in input_data or not input_data["data"]:st.error("没有提供有效的数据来创建图表")returndata = input_data["data"]# 如果数据看起来像是一维的(即单列数据)if all(isinstance(i, (int, float)) for i in data):df = pd.DataFrame(data, columns=input_data["columns"])else:# 假设数据是二维的(多列数据)df = pd.DataFrame(data, columns=input_data["columns"])if chart_type == "line":st.line_chart(df)elif chart_type == "bar":st.bar_chart(df)# 可以添加更多图表类型的支持else:st.error(f"不支持的图表类型: {chart_type}")st.title("CSV数据分析智能工具")with st.sidebar:api_key = st.text_input("请输入你的OpenAI API密钥", type="password") st.markdown("[获取OpenAI API密钥](https://2233.ai/api)")# 上传文件csv_file = st.file_uploader("请上传你的csv格式数据文件:", type="csv")# 展示部分文件数据
if csv_file:df = pd.read_csv(csv_file)with st.expander("原始数据"):st.dataframe(df)query = st.text_area("请输入你关于以上表格的问题,或数据提取请求,或可视化请求(支持散点图、折线图、条形图):", disabled=not csv_file)button = st.button("生成回答")if button:if not api_key:st.info("请先输入OpenAI API密钥")st.stop()if not query:st.info("请输入您的问题")st.stop()with st.spinner("AI正在思考中,请稍等···"):result_dict = dataframe_agent(api_key=api_key, uploaded_file=csv_file, query=query)if "answer" in result_dict:st.write(result_dict["answer"])if "table" in result_dict:columns = result_dict["table"]["columns"]data = result_dict["table"]["data"]df_result = pd.DataFrame(data, columns=columns)st.table(df_result)if "bar" in result_dict:create_chart(result_dict["bar"], "bar")if "line" in result_dict:create_chart(result_dict["line"], "line")if "scatter" in result_dict:create_chart(result_dict["scatter"], "scatter")

1、由于对于不同的响应内容,前端展示不同

比如:直接输出字符串答案,或者绘制表格、条形图、散点图、折线图等。

 

所以要设计提示词,引导ai对不同内容进行区分。

一个办法是,规定响应的答案格式是字典,里面的键值表示了是什么样的内容(比如answer对应字符串内容,table表示表格,bar条形图,line折线图,scatter散点图),

易于后续分类讨论解析。 

 

注意:仔细检查prompt有没有格式错误,或者中英文标点符号错误

2、json.loads 是 Python 标准库 json 模块中的一个重要函数,主要用于将 JSON 格式的字符串解析为 Python 对象。

 

3、

从你给出的错误信息可知,在调用 create_csv_agent 或者 create_pandas_dataframe_agent 时,程序抛出了 ValueError 异常。

错误原因:

create_pandas_dataframe_agent 这类代理会依赖 Python REPL(交互式解释器)工具来执行任意代码,这存在安全风险。为了防止潜在的安全问题,在使用此功能前,你必须明确表示同意使用,也就是要把 allow_dangerous_code 参数设置为 True。 

 

4、把file_content = uploaded_file.read()改成file_content = uploaded_file.getvalue() 

因为前端里有一句df=pd.read_csv(csv_file),会让读指针移到文件末尾,所以再用read读就是空。

补充:

关闭文件后,文件指针并不会回到最开始的位置,文件对象也不再处于可用状态,无法直接获取其指针位置信息。

 

当你调用文件对象的close()方法关闭文件时,系统会释放与该文件相关的资源,包括文件描述符等。此时,文件对象在内存中的状态被改变,不再维护之前的文件指针位置。如果后续你想要再次读取文件内容,需要重新打开文件,而重新打开文件时,文件指针默认会位于文件开头(除非你使用特定的模式打开文件,例如以追加模式'a''a+'打开文件,文件指针会位于文件末尾 )。

 

5、

相关文章:

CSV数据分析智能工具(基于OpenAI API和streamlit)

utils.py&#xff1a; from langchain_openai import ChatOpenAI from langchain_experimental.agents.agent_toolkits import create_csv_agent import jsonPROMPT_TEMPLATE """你是一位数据分析助手&#xff0c;你的回应内容取决于用户的请求内容。1. 对于文…...

【Day31 LeetCode】动态规划DP Ⅳ

一、动态规划DP Ⅳ 1、最后一块石头的重量II 1049 这题有点像脑筋急转弯&#xff0c;尽量让石头分成重量相同的两堆&#xff08;尽可能相同&#xff09;&#xff0c;相撞之后剩下的石头就是最小的。明白这一点&#xff0c;就与上一篇博客里的划分等和数组很相似。划分等和数组…...

产品经理的人工智能课 02 - 自然语言处理

产品经理的人工智能课 02 - 自然语言处理 1 自然语言处理是什么2 一个 NLP 算法的例子——n-gram 模型3 预处理与重要概念3.1 分词 Token3.2 词向量化表示与 Word2Vec 4 与大语言模型的交互过程参考链接 大语言模型&#xff08;Large Language Models, LLMs&#xff09;是自然语…...

华为手机nova9,鸿蒙系统版本4.2.0.159,智慧助手.今天版本是14.x,如何卸载智慧助手.今天?

手欠&#xff0c;将手机鸿蒙系统升级到4.2.0.159后&#xff0c;出现了负一屏&#xff0c;负一屏就是主页向左滑&#xff0c;出现了&#xff0c;如图的界面&#xff1a; 华为鸿蒙系统负一屏的界面 通过在手机中我的华为-搜索“开启或关闭智慧助手.今天&#xff08;负一屏&#…...

C#面试常考随笔13: 泛型的主要约束和次要约束是什么?

在 C# 泛型中&#xff0c;主要约束和次要约束用于限制泛型类型参数的使用&#xff0c;确保类型参数满足一定的条件&#xff0c;从而提高代码的可靠性和可维护性。以下是主要约束和次要约束的详细介绍&#xff1a; 主要约束 引用类型约束&#xff08;class&#xff09;&#x…...

win32汇编环境,窗口程序中自定义工具栏的使用示例

;运行效果 ;win32汇编环境,窗口程序中自定义工具栏的使用示例 ;工具栏一般放在菜单下面&#xff0c;相当于一个个小的对话框&#xff0c;当然你放在其它地方也可以。 ;原理是&#xff0c;创建一张BMP位图&#xff0c;比如下例用一张168*24的图&#xff0c;平均分成7部分&#x…...

【PyQt】pyqt小案例实现简易文本编辑器

pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器&#xff0c;使用PyQt5框架构建。以下是代码的主要功能和特点&#xff1a; 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…...

2024最新版Node.js详细安装教程(含npm配置淘宝最新镜像地址)

一&#xff1a;Node.js安装 浏览器中搜索Nodejs&#xff0c;或直接用网址:Node.js — 在任何地方运行 JavaScript 建议此处下载长期支持版本&#xff08;红框内&#xff09;: 开始下载&#xff0c;完成后打开文件: 进入安装界面&#xff0c;在此处勾选&#xff0c;再点击n…...

DeepSeek R1的隐藏提问技巧?

deepseek属于推理模型&#xff0c;而不是指令模型&#xff0c;R1对提示词非常敏感。 1、需要更加真诚地与deepseek进行对话。 在用r1时&#xff0c;需要将此前的问答方式改变。 例如&#xff1a; 你现在是一个新能源汽车的市场研究分析师&#xff0c;这里有一份调研报告总结…...

【HTML入门】Sublime Text 4与 Phpstorm

文章目录 前言一、环境基础1.Sublime Text 42.Phpstorm(1)安装(2)启动Phpstorm(3)“启动”码 二、HTML1.HTML简介(1)什么是HTML(2)HTML版本及历史(3)HTML基本结构 2.HTML简单语法(1)HTML标签语法(2)HTML常用标签(3)表格(4)特殊字符 总结 前言 在当今的软件开发领域&#xff0c…...

JVS低代码逻辑引擎多种业务场景触发案例配置:涵盖列表页按钮、表单数据、流程审批、外部API接口调用等

逻辑引擎作为JVS低代码开发套件的核心组件&#xff0c;专注于业务逻辑的快速构建与实现&#xff0c;它扮演着程序配置与执行的核心角色&#xff0c;适用于多样化的应用场景。该逻辑引擎设计灵活&#xff0c;能够通过多种配置方式被触发&#xff0c;以精准响应各类业务需求并实现…...

开发人员笔记本

为开发人员推荐大容量且性能稳定的电脑时&#xff0c;需考虑处理器、内存、存储、显卡和散热等因素。以下是几款适合开发的高性能电脑推荐&#xff1a; 1. Apple MacBook Pro 16英寸 (M2 Max/M2 Pro) 处理器: Apple M2 Max 或 M2 Pro内存: 32GB 或 64GB 统一内存存储: 1TB 或…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)

#作者&#xff1a;闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式&#xff08;Simple Queue&#xff09;工作队列模式&#xff08;Work Queue&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff…...

计算机网络笔记再战——理解几个经典的协议4

目录 IP——网际协议 IP地址 1. A类地址 2. B类地址 3. C类地址 4. D类地址&#xff08;组播地址&#xff09; 5. E类地址&#xff08;保留地址&#xff09; 特殊地址与私有地址 广播地址 IP多播 子网掩码 传统分类与CIDR/VLSM的对比 路由控制 默认路由 主机路由…...

Java CountDownLatch 用法和源码解析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

深度学习在文本情感分析中的应用

引言 情感分析是自然语言处理&#xff08;NLP&#xff09;中的一个重要任务&#xff0c;旨在识别和提取文本中的主观信息。随着深度学习技术的发展&#xff0c;我们可以使用深度学习模型来提高情感分析的准确性和效率。本文将介绍如何使用深度学习进行文本情感分析&#xff0c…...

C++编码规范(六)关于C++标准库STL在使用中的一些规范和建议

C 标准库STL是 C 编程语言的重要组成部分&#xff0c;为开发者提供了丰富的功能和工具&#xff0c;极大地提高了开发效率和代码的可移植性。 其主要包括&#xff1a;标准容器库&#xff0c;输入 / 输出流库&#xff0c;算法库&#xff0c;迭代器库&#xff0c;字符串库&#xf…...

两种文件类型(pdf/图片)打印A4半张纸方法

环境:windows10、Adobe Reader XI v11.0.23 Pdf: 1.把内容由横排变为纵排&#xff1a; 2.点击打印按钮&#xff1a; 3.选择打印页范围和多页&#xff1a; 4.内容打印在纸张上部 图片&#xff1a; 1.右键图片点击打印&#xff1a; 2.选择打印类型&#xff1a; 3.打印配置&am…...

Vue3状态管理: Pinia使用技巧与最佳实践

Vue3状态管理: Pinia使用技巧与最佳实践 随着Web应用复杂度的提升&#xff0c;前端状态管理变得愈发重要。而在Vue3中&#xff0c;Pinia作为一种全新的状态管理工具&#xff0c;为我们提供了更加灵活和强大的状态管理解决方案。本文将从Pinia的基本概念入手&#xff0c;深入探讨…...

stm32点灯 GPIO的输出模式

目录 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置&#xff08; 默认不变&#xff09;HSI 高速内部时钟8Mhz 5.项目配置 6.代码 延时1s循环LED亮灭 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置&#xff08; 默认不变&#xff09…...

​K8S运行时切换-从Docker到Containerd的切换实战

1. 切换的原因 性能提升&#xff1a;Containerd通过减少抽象层提升了整体性能。 安全性增强&#xff1a;它提供了更直接的系统调用&#xff0c;减少了潜在的安全风险。 简化架构&#xff1a;Containerd拥有更简洁的设计&#xff0c;使得维护和故障排除更为容易。 官方支持趋…...

腾讯会议win7二维码展示不出来

问题&#xff1a;win64更新后二维码展示不出来&#xff0c;手机等登陆都不行 安装所在位置创建文档命名TBSDEBUG并去掉后缀...

swift 专题三 swift 规范一

一、Swift编码命名规范 对类、结构体、枚举和协议等类型的命名应该采用大驼峰法&#xff0c;如 SplitViewController。 文件名采用大驼峰法&#xff0c;如BlockOperation.swift。 对于扩展文件&#xff0c;有时扩展定义在一个独立的文件中&#xff0c;用“原始类型名 扩展名…...

WPS计算机二级•幻灯片放映与会议

听说这是目录哦 放映PPT时常用的快捷技巧&#x1f96c;设置放映模式&#x1f955;演讲备注的添加和隐藏&#x1fada;在PPT中插入附件并放映时打开&#x1fadb;隐藏幻灯片 不被放映和打印&#x1f344;‍&#x1f7eb;演讲计时模式&#x1f966;能量站&#x1f61a; 放映PPT时…...

联想拯救者开机进入bios

如果你的联想拯救者&#xff08;Lenovo Legion&#xff09;笔记本电脑开机后直接进入 BIOS 设置界面&#xff0c;可能是以下原因之一导致的。以下是解决方法&#xff1a; 1. 检查启动顺序 进入 BIOS 后&#xff0c;找到 Boot&#xff08;启动&#xff09;选项卡。检查启动顺序…...

云原生周刊:K8s引领潮流

开源项目推荐 KWOK KWOK&#xff08;Kubernetes WithOut Kubelet&#xff09;是一个开源项目&#xff0c;旨在提供一个轻量级的 K8s 集群模拟环境&#xff0c;允许用户在不依赖真实节点的情况下&#xff0c;本地模拟整个 K8s 集群。它通过模拟 Kubelet 和其他集群组件的行为&…...

FBX SDK的使用:基础知识

Windows环境配置 FBX SDK安装后&#xff0c;目录下有三个文件夹&#xff1a; include 头文件lib 编译的二进制库&#xff0c;根据你项目的配置去包含相应的库samples 官方使用案列 动态链接 libfbxsdk.dll, libfbxsdk.lib是动态库&#xff0c;需要在配置属性->C/C->预…...

计算机网络笔记再战——理解几个经典的协议6——TCP与UDP

目录 先说端口号 TCP 使用序号保证顺序性和应答来保证有效性 超时重传机制 TCP窗口机制 UDP 路由协议 协议分类&#xff1a;IGP和EGP 几个经典的路由算法 RIP OSPF 链路状态数据库&#xff08;LSDB&#xff09; LSA&#xff08;Link State Advertisement&#xff0…...

Android 单例模式:实现可复用数据存储

引言 在 Java 开发中&#xff0c;我们经常会遇到需要在整个应用程序中共享数据的场景。例如&#xff0c;配置信息、缓存数据等&#xff0c;这些数据需要在不同的模块或类中被访问和使用。为了确保数据的一致性和避免重复创建&#xff0c;我们可以使用单例模式来实现一个可复用的…...

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制 一. 数据同步 在之前的学习中有了副本Replica的概念,解决了数据备份的问题。我们还需要面临一个设计难题即:如何处理分区中Leader与Follwer节点数据同步不匹配问题所带来的风险,这也是保证数据高可用的…...