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

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. 对于文…...

移除元素-双指针(下标)

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#xff1a…...

蓝桥杯备赛题目练习(一)

目录 一. 口算练习题 代码如下 代码解读&#xff08;简略重点&#xff09;&#xff1a; 代码解读&#xff08;详细&#xff09;&#xff1a; 二. 小乐乐改数字 代码&#xff08;1&#xff09;&#xff1a;当做整数读取 代码&#xff08;2&#xff09;&#xff1a;当做字符…...

FortiOS 存在身份验证绕过导致命令执行漏洞(CVE-2024-55591)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

【多线程】线程池核心数到底如何配置?

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 前置回顾2. 动态线程池2.1 JMX 的介绍2.1.1 MBeans 介绍 2.2 使用 JMX jconsole 实现动态修改线程池2.2.…...

Windows图形界面(GUI)-QT-C/C++ - Qt Combo Box

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 1.1 基本概念 1.2 应用场景对比 二、核心属性详解 2.1 行为控制 2.2 显示配置 三、数据操作与访问 3.1 基础数据管理 3.2 高级数据访问 四、用户交互处理 4.1 信号处…...

开源AI智能名片2 + 1链动模式S2B2C商城小程序:内容价值创造与传播新引擎

摘要&#xff1a;本文聚焦于信息爆炸时代下&#xff0c;内容价值的创造与传播。随着用户角色的转变&#xff0c;其在内容生产与传播中的价值日益凸显。同时&#xff0c;深入探讨开源AI智能名片2 1链动模式S2B2C商城小程序这一创新商业模式&#xff0c;如何借助用户创造内容并传…...

python读取excel工具:openpyxl | AI应用开发

python读取excel工具&#xff1a;openpyxl | AI应用开发 openpyxl 是一个 Python 库&#xff0c;专门用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件。它是处理 Excel 文件的强大工具&#xff0c;可以让你在不需要安装 Excel 软件的情况下&#xff0c;对 Excel 文件进行创建、…...

堆的基本概念

1.1 堆的基本概念 虚拟机所在目录 E:\ctf\pwn-self 进入虚拟机的pwndocker环境 holyeyesubuntu:~$ pwd /home/holyeyes holyeyesubuntu:~$ sudo ./1run.sh IDA分析 int __fastcall main(int argc, const char **argv, const char **envp) { void *v4; // [rsp20h] [rbp-1…...

Android车机DIY开发之软件篇(九) NXP AutomotiveOS编译

Android车机DIY开发之软件篇(十一) NXP AutomotiveOS编译 Google 在汽车上也提供了用于汽车的 Google 汽车服务&#xff08;GAS&#xff0c;Google Automotive Service&#xff09;&#xff0c;包含有 Google 地图、应用市场、Google 汽车助理等等。Google 汽车服务同样没有开…...

嵌入式工程师必学(143):模拟信号链基础

概述: 我们每天使用的许多电子设备,以及我们赖以生存的电子设备,如果不使用电子工程师设计的实际输入信号,就无法运行。 模拟信号链由四个主要元件组成:传感器、放大器、滤波器和模数转换器 (ADC)。这些传感器用于检测、调节模拟信号并将其转换为适合由微控制器或其他数…...

《LLM大语言模型深度探索与实践:构建智能应用的新范式,融合代理与数据库的高级整合》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…...

e2studio开发RA2E1(5)----GPIO输入检测

e2studio开发RA2E1.5--GPIO输入检测 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置GPIO口配置按键口配置按键口&Led配置R_IOPORT_PortRead()函数原型R_IOPORT_PinRead()函数原型代码 概述 本篇文章主要介绍如何…...

Spring @Lazy:延迟初始化,为应用减负

在Spring框架中&#xff0c;Lazy注解的作用非常直观&#xff0c;它就是用来告诉Spring容器&#xff1a;“嘿&#xff0c;这个Bean嘛&#xff0c;先别急着创建和初始化&#xff0c;等到真正需要用到的时候再弄吧&#xff01;” 默认情况下&#xff0c;Spring容器在启动时会立即创…...

将OneDrive上的文件定期备份到移动硬盘

背景&#xff1a; 我在oneDrive上存了很多文件&#xff0c;分布在多个文件夹中&#xff0c;也有套了好几层文件夹的情况。我希望每隔一段时间&#xff0c;将oneDrive上的所有文件向移动硬盘上拷贝一份&#xff0c;但是我只想将距离上一次向移动硬盘拷贝的文件相比&#xff0c;发…...

从0开始,来看看怎么去linux排查Java程序故障

一&#xff0c;前提准备 最基本前提&#xff1a;你需要有liunx环境&#xff0c;如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后&#xff0c;你还需要安装jdk和配置环境变量 1. 安装JDK&#xff08;以OpenJDK 17为例&#xff09; 下载JDK…...

DeepSeek-V3:开源多模态大模型的突破与未来

目录 引言 一、DeepSeek-V3 的概述 1.1 什么是 DeepSeek-V3&#xff1f; 1.2 DeepSeek-V3 的定位 二、DeepSeek-V3 的核心特性 2.1 多模态能力 2.2 开源与可扩展性 2.3 高性能与高效训练 2.4 多语言支持 2.5 安全与伦理 三、DeepSeek-V3 的技术架构 3.1 模型架构 3…...

Deep Sleep 96小时:一场没有硝烟的科技保卫战

2025年1月28日凌晨3点&#xff0c;当大多数人还沉浸在梦乡时&#xff0c;一场没有硝烟的战争悄然打响。代号“Deep Sleep”的服务器突遭海量数据洪流冲击&#xff0c;警报声响彻机房&#xff0c;一场针对中国关键信息基础设施的网络攻击来势汹汹&#xff01; 面对美国发起的这场…...

Redis地理散列GeoHash

GeoHash是一种用于地理位置编码的算法&#xff0c;将二维的地理坐标&#xff08;纬度和经度&#xff09;转换为一维的字符串表示&#xff0c;从而实现对地理位置的高效存储和查询。Redis作为一个内存数据库&#xff0c;提供了对GeoHash的支持&#xff0c;使得地理位置相关的数据…...

JAVA安全—反射机制攻击链类对象成员变量方法构造方法

前言 还是JAVA安全&#xff0c;哎&#xff0c;真的讲不完&#xff0c;太多啦。 今天主要是讲一下JAVA中的反射机制&#xff0c;因为反序列化的利用基本都是要用到这个反射机制&#xff0c;还有一些攻击链条的构造&#xff0c;也会用到&#xff0c;所以就讲一下。 什么是反射…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...