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

构建一个数据分析Agent:提升分析效率的实践

在上一篇文章中,我们讨论了如何构建一个智能客服Agent。今天,我想分享另一个实际项目:如何构建一个数据分析Agent。这个项目源于我们一个金融客户的真实需求 - 提升数据分析效率,加快决策速度。

从分析师的痛点说起

记得和分析师团队交流时的场景:

小张:每天要分析这么多数据,真的很耗时
小李:是啊,而且经常要写各种分析报告
我:主要在哪些环节比较耗时?
小张:数据清洗、指标计算、图表生成这些都很繁琐
我:这些正好可以用AI Agent来协助

经过需求分析,我们确定了几个核心功能:

  1. 智能数据清洗
  2. 自动特征分析
  3. 可视化生成
  4. 报告撰写

技术方案设计

首先是整体架构:

from typing import List, Dict, Any, Optional
from enum import Enum
from pydantic import BaseModel
import pandas as pd
import numpy as npclass AnalysisTask(Enum):CLEAN = "clean"ANALYZE = "analyze"VISUALIZE = "visualize"REPORT = "report"class DataContext(BaseModel):data_path: strtask_type: AnalysisTaskrequirements: Dict[str, Any]history: List[Dict[str, Any]]class DataAnalyst:def __init__(self,config: Dict[str, Any]):# 1. 初始化分析模型self.analysis_model = AnalysisLLM(model="gpt-4",temperature=0.1,context_length=8000)# 2. 初始化工具集self.tools = {"cleaner": DataCleaner(),"analyzer": DataAnalyzer(),"visualizer": DataVisualizer(),"reporter": ReportGenerator()}# 3. 初始化数据存储self.data_store = DataStore(cache_dir="./cache",max_size_gb=10)async def process_task(self,context: DataContext) -> Dict[str, Any]:# 1. 加载数据data = await self._load_data(context.data_path)# 2. 理解需求requirements = await self._understand_requirements(context.requirements)# 3. 生成分析方案plan = await self._generate_plan(data,requirements)# 4. 执行分析result = await self._execute_analysis(data,plan)return resultasync def _understand_requirements(self,requirements: Dict[str, Any]) -> Dict[str, Any]:# 1. 提取分析目标objectives = await self.analysis_model.extract_objectives(requirements)# 2. 识别关键指标metrics = await self._identify_metrics(objectives)# 3. 确定分析方法methods = await self._select_methods(objectives,metrics)return {"objectives": objectives,"metrics": metrics,"methods": methods}

数据清洗功能

首先实现数据清洗功能:

class DataCleaner:def __init__(self,model: AnalysisLLM):self.model = modelasync def clean_data(self,data: pd.DataFrame) -> Dict[str, Any]:# 1. 数据概览profile = await self._profile_data(data)# 2. 识别问题issues = await self._identify_issues(data,profile)# 3. 执行清洗cleaned_data = await self._perform_cleaning(data,issues)return {"cleaned_data": cleaned_data,"profile": profile,"issues": issues}async def _identify_issues(self,data: pd.DataFrame,profile: Dict[str, Any]) -> List[Dict[str, Any]]:issues = []# 1. 检查缺失值missing = await self._check_missing_values(data)issues.extend(missing)# 2. 检查异常值outliers = await self._detect_outliers(data)issues.extend(outliers)# 3. 检查数据类型type_issues = await self._check_data_types(data)issues.extend(type_issues)return issuesasync def _perform_cleaning(self,data: pd.DataFrame,issues: List[Dict[str, Any]]) -> pd.DataFrame:cleaned = data.copy()for issue in issues:# 1. 处理缺失值if issue["type"] == "missing":cleaned = await self._handle_missing(cleaned,issue)# 2. 处理异常值elif issue["type"] == "outlier":cleaned = await self._handle_outlier(cleaned,issue)# 3. 处理类型问题elif issue["type"] == "type":cleaned = await self._handle_type(cleaned,issue)return cleaned

特征分析功能

接下来是特征分析功能:

class DataAnalyzer:def __init__(self,model: AnalysisLLM):self.model = modelasync def analyze_features(self,data: pd.DataFrame,requirements: Dict[str, Any]) -> Dict[str, Any]:# 1. 统计分析stats = await self._statistical_analysis(data)# 2. 特征相关性correlations = await self._correlation_analysis(data)# 3. 时间趋势trends = await self._trend_analysis(data)return {"statistics": stats,"correlations": correlations,"trends": trends}async def _statistical_analysis(self,data: pd.DataFrame) -> Dict[str, Any]:stats = {}# 1. 基础统计量basic_stats = await self._calculate_basic_stats(data)stats["basic"] = basic_stats# 2. 分布分析distribution = await self._analyze_distribution(data)stats["distribution"] = distribution# 3. 分组统计groupby = await self._group_statistics(data)stats["groupby"] = groupbyreturn statsasync def _correlation_analysis(self,data: pd.DataFrame) -> Dict[str, Any]:# 1. 计算相关系数corr_matrix = await self._calculate_correlations(data)# 2. 特征重要性importance = await self._feature_importance(data)# 3. 共线性检测collinearity = await self._check_collinearity(data)return {"correlation_matrix": corr_matrix,"feature_importance": importance,"collinearity": collinearity}

可视化功能

再来实现可视化功能:

class DataVisualizer:def __init__(self,model: AnalysisLLM):self.model = modelasync def create_visualizations(self,data: pd.DataFrame,analysis: Dict[str, Any]) -> Dict[str, Any]:# 1. 选择图表类型chart_types = await self._select_charts(data,analysis)# 2. 生成图表charts = await self._generate_charts(data,chart_types)# 3. 优化展示optimized = await self._optimize_display(charts)return {"charts": charts,"layout": optimized}async def _select_charts(self,data: pd.DataFrame,analysis: Dict[str, Any]) -> List[Dict[str, Any]]:charts = []# 1. 分布图表distribution_charts = await self._distribution_charts(data,analysis)charts.extend(distribution_charts)# 2. 关系图表relationship_charts = await self._relationship_charts(data,analysis)charts.extend(relationship_charts)# 3. 趋势图表trend_charts = await self._trend_charts(data,analysis)charts.extend(trend_charts)return chartsasync def _generate_charts(self,data: pd.DataFrame,chart_types: List[Dict[str, Any]]) -> List[Dict[str, Any]]:charts = []for chart_type in chart_types:# 1. 准备数据plot_data = await self._prepare_plot_data(data,chart_type)# 2. 设置样式style = await self._set_chart_style(chart_type)# 3. 生成图表chart = await self._plot_chart(plot_data,chart_type,style)charts.append({"type": chart_type,"data": plot_data,"style": style,"chart": chart})return charts

报告生成功能

最后是报告生成功能:

class ReportGenerator:def __init__(self,model: AnalysisLLM):self.model = modelasync def generate_report(self,data: pd.DataFrame,analysis: Dict[str, Any],visualizations: Dict[str, Any]) -> Dict[str, Any]:# 1. 提取要点key_points = await self._extract_key_points(analysis)# 2. 生成结构structure = await self._create_structure(key_points)# 3. 撰写内容content = await self._write_content(structure,analysis,visualizations)return {"key_points": key_points,"structure": structure,"content": content}async def _extract_key_points(self,analysis: Dict[str, Any]) -> List[Dict[str, Any]]:points = []# 1. 统计发现statistical_points = await self._extract_statistical_points(analysis["statistics"])points.extend(statistical_points)# 2. 相关性发现correlation_points = await self._extract_correlation_points(analysis["correlations"])points.extend(correlation_points)# 3. 趋势发现trend_points = await self._extract_trend_points(analysis["trends"])points.extend(trend_points)return pointsasync def _write_content(self,structure: Dict[str, Any],analysis: Dict[str, Any],visualizations: Dict[str, Any]) -> Dict[str, str]:content = {}# 1. 写摘要content["summary"] = await self._write_summary(structure,analysis)# 2. 写主体content["body"] = await self._write_body(structure,analysis,visualizations)# 3. 写结论content["conclusion"] = await self._write_conclusion(structure,analysis)return content

实际效果

经过两个月的使用,这个数据分析Agent带来了显著的效率提升:

  1. 时间节省

    • 数据清洗时间减少70%
    • 分析流程加快50%
    • 报告生成效率提升60%
  2. 质量提升

    • 分析更全面
    • 图表更专业
    • 报告更规范
  3. 能力扩展

    • 支持更多数据源
    • 分析方法更丰富
    • 可视化更灵活

实践心得

在开发这个数据分析Agent的过程中,我总结了几点经验:

  1. 需求导向

    • 理解分析目标
    • 把握重点指标
    • 注重实用性
  2. 方法系统

    • 分析方法要系统
    • 工具选择要合理
    • 流程设计要清晰
  3. 结果可用

    • 结论要有洞见
    • 图表要易理解
    • 报告要实用

写在最后

一个好的数据分析Agent不仅要会算数据,更要懂业务含义,能够帮助用户发现数据背后的价值。它就像一个经验丰富的数据分析师,在合适的时候给出恰当的分析建议。

在下一篇文章中,我会讲解如何开发一个文档助手Agent。如果你对数据分析Agent的开发有什么想法,欢迎在评论区交流。

相关文章:

构建一个数据分析Agent:提升分析效率的实践

在上一篇文章中,我们讨论了如何构建一个智能客服Agent。今天,我想分享另一个实际项目:如何构建一个数据分析Agent。这个项目源于我们一个金融客户的真实需求 - 提升数据分析效率,加快决策速度。 从分析师的痛点说起 记得和分析师团队交流时的场景: 小张&#xff…...

85.[1] 攻防世界 WEB easyphp

进入靶场 属于代码审计 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;常用于调试或展示代码 highlight_file(__FILE__);// 初始化两个标志变量&#xff0c;用于后续条件判断 $key1 0; $key2 0;// 从 GET 请求中获取参数 a 和 b $a $_GET[a]; $b $_GET[b];// 检…...

嵌入式硬件篇---CPUGPUTPU

文章目录 第一部分&#xff1a;处理器CPU&#xff08;中央处理器&#xff09;1.通用性2.核心数3.缓存4.指令集5.功耗和发热 GPU&#xff08;图形处理器&#xff09;1.并行处理2.核心数量3.内存带宽4.专门的应用 TPU&#xff08;张量处理单元&#xff09;1.为深度学习定制2.低精…...

pytorch图神经网络处理图结构数据

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 图神经网络&#xff08;Graph Neural Networks&#xff0c;GNNs&#xff09;是一类能够处理图结构数据的深度学习模型。图结构数据由节点&#xff08;vertices&#xff09;和边&#xff08;edges&#xff09;组成&a…...

海外问卷调查,最常用到的渠道查有什么特殊之处

市场调研&#xff0c;包含市场调查和市场研究两个步骤&#xff0c;是企业和机构根据经营方向而做出的决策问题&#xff0c;最终通过海外问卷调查中的渠道查&#xff0c;来系统地设计、收集、记录、整理、分析、研究市场反馈的工作流程。 市场调研的工作流程包括&#xff1a;确…...

【Uniapp-Vue3】解决uni-popup弹窗在安全区显示透明问题

我们在使用uni-popup时&#xff0c;如果想要给弹出内容添加一个背景颜色&#xff0c;我们会发现在安全区域是不显示该背景颜色的。 首先根据如下的目录结构找到uni-popup.vue文件 在该文件中找到bottom配置&#xff0c;将红箭头所指代码注释掉 下面的安全区域就没有了&#xff…...

什么是麦克斯韦方程

飞书链接&#xff0c;格式更好&#xff0c;⭐⭐⭐&#xff1a;长尾 - 什么是麦克斯韦方程 基于作者的内容&#xff0c;做了一些扩展&#xff08;问了 DeepSeek&#xff09; 最美的公式&#xff1a;你也能懂的麦克斯韦方程组&#xff08;积分篇&#xff09; 04通量的引入 用一个…...

webrtc peerconnection_client peerconnection_server 连接失败问题解决 win10 win11

0 常见问题 (1) webrtc peerconnection_client 连接 peerconnection_server 无连接列表 &#xff08;2&#xff09;连接导致崩溃debug状态下因为这个断言 RTC_DCHECK_RUN_ON(&capture_checker_); 1 在 peerconnection\client\main.cc 当中 定义类 class CustomSock…...

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser

文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么&#xff0c;有存就有取 在取值的时候&#xff0c;报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中&#xff1a;LoginUser u…...

2025年2月1日(Keep calm and code Python)

“Keep calm and code Python” 的意思是 “保持冷静&#xff0c;编写 Python 代码”。 这句话来源于 “Keep Calm and Carry On”&#xff08;保持冷静&#xff0c;继续前进&#xff09;&#xff0c;这是二战时期英国政府的宣传口号。后来&#xff0c;这种句式被广泛模仿&…...

核心集:DeepCore: A Comprehensive Library for CoresetSelection in Deep Learning

目录 一、TL&#xff1b;DR 二、为什么研究核心集&#xff1f; 三、问题定义和如何做 3.1 问题定义 3.2 业界方法 3.2.1 基于几何的方法 3.2.2 基于不确定性的方法 3.2.3 基于误差/损失的方法 3.2.5 GraNd 和 EL2N 分数 3.2.6 重要性采样 3.2.7 基于决策边界的办法 …...

Hot100之矩阵

73矩阵置零 题目 思路解析 收集0位置所在的行和列 然后该行全部初始化为0 该列全部初始化为0 代码 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;List<Integer> list1 new ArrayList<>();List<…...

可视化相机pose colmap形式的相机内参外参

目录 内参外参转换 可视化相机pose colmap形式的相机内参外参 内参外参转换 def visualize_cameras(cameras, images):fig plt.figure()ax fig.add_subplot(111, projection3d)for image_id, image_data in images.items():qvec image_data[qvec]tvec image_data[tvec]#…...

第十二章 I 开头的术语

文章目录 第十二章 I 开头的术语以 I 开头的术语被识别 (identified by)识别关系 (identifying relationship)身份 (identity)idkey隐式全局引用 (implicit global reference)隐含命名空间 (implied namespace)包含文件 (include file)传入锁 (incoming lock) 索引 (index)索引…...

C# 类与对象详解

.NET学习资料 .NET学习资料 .NET学习资料 在 C# 编程中&#xff0c;类与对象是面向对象编程的核心概念。它们让开发者能够将数据和操作数据的方法封装在一起&#xff0c;从而构建出模块化、可维护且易于扩展的程序。下面将详细介绍 C# 中类与对象的相关知识。 一、类的定义 …...

Windsurf cursor vscode+cline 与Python快速开发指南

Windsurf简介 Windsurf是由Codeium推出的全球首个基于AI Flow范式的智能IDE&#xff0c;它通过强大的AI助手功能&#xff0c;显著提升开发效率。Windsurf集成了先进的代码补全、智能重构、代码生成等功能&#xff0c;特别适合Python开发者使用。 Python环境配置 1. Conda安装…...

深度解析:网站快速收录与服务器性能的关系

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/37.html 网站快速收录与服务器性能之间存在着密切的关系。服务器作为网站运行的基础设施&#xff0c;其性能直接影响到搜索引擎对网站的抓取效率和收录速度。以下是对这一关系的深度解析&am…...

Linux tr 命令使用详解

简介 tr &#xff08;translate&#xff09;命令用于在 Linux 中翻译或删除输入流&#xff08;通常是 stdin &#xff09;中的字符。它主要用于文本操作&#xff0c;并且可以作为转换或删除文本文件或流中的特定字符的方便工具。 基本语法 tr [OPTION] [SET1] [SET2]SET1&am…...

数据库内存与Buffer Pool

数据库内存与Buffer Pool 文章目录 数据库内存与Buffer Pool一&#xff1a;MySQL内存结构1&#xff1a;MySQL工作组件2&#xff1a;工作线程的本地内存3&#xff1a;共享内存区域4&#xff1a;存储引擎缓冲区 二&#xff1a;InnoDB的核心&#xff1a;Buffer Pool1&#xff1a;数…...

程序员学英文之At the Airport Customs

Dialogue-1 Making Airline Reservation预定机票 My cousin works for Xiamen Airlines. 我表哥在厦航上班。I’d like to book an air ticket. 我想预定一张机票。Don’t judge a book by its cover. 不要以貌取人。I’d like to book / re-serve a table for 10. 我想预定一…...

Redis代金卷(优惠卷)秒杀案例-单应用版

优惠卷表:优惠卷基本信息,优惠金额,使用规则 包含普通优惠卷和特价优惠卷(秒杀卷) 优惠卷的库存表:优惠卷的库存,开始抢购时间,结束抢购时间.只有特价优惠卷(秒杀卷)才需要填写这些信息 优惠卷订单表 卷的表里已经有一条普通优惠卷记录 下面首先新增一条秒杀优惠卷记录 { &quo…...

51单片机 01 LED

一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC&#xff1b;如果没有找到hex文件&#xff08;在objects文件夹下&#xff09;&#xff0c;在keil中options for target-output- 勾选 create hex file。 如果要修改编程 &#xff1a;重新编译-下载/编程-单片机重…...

MusicFree-开源的第三方音乐在线播放和下载工具, 支持歌单导入[对标落雪音乐]

MusicFree 链接&#xff1a;https://pan.xunlei.com/s/VOI0RrVLTTWE9kkpt0U7ofGBA1?pwd4ei6#...

消息队列篇--原理篇--常见消息队列总结(RabbitMQ,Kafka,ActiveMQ,RocketMQ,Pulsar)

1、RabbitMQ 特点&#xff1a; AMQP协议&#xff1a;RabbitMQ是基于AMQP&#xff08;高级消息队列协议&#xff09;构建的&#xff0c;支持多种消息传递模式&#xff0c;如发布/订阅、路由、RPC等。多语言支持&#xff1a;支持多种编程语言的客户端库&#xff0c;包括Java、P…...

nacos 配置管理、 配置热更新、 动态路由

文章目录 配置管理引入jar包添加 bootstrap.yaml 文件配置在application.yaml 中添加自定义信息nacos 配置信息 配置热更新采用第一种配置根据服务名确定配置文件根据后缀确定配置文件 动态路由DynamicRouteLoaderNacosConfigManagerRouteDefinitionWriter 路由配置 配置管理 …...

程序代码篇---Numpyassert迭代器

文章目录 前言第一部分&#xff1a;Numpy1. 创建数组2. 数组索引和切片3. 数组形状操作4. 数组运算5. 数学函数6. 随机数生成7. 数组排序 第二部分&#xff1a;assert基本语法1.condition2.error_message 示例注意事项断言的用途 第三部分&#xff1a;迭代器迭代器协议1.__iter…...

(笔记+作业)书生大模型实战营春节卷王班---L0G2000 Python 基础知识

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/QtJnweAW1iFl8LkoMKGcsUS9nld 课程视频&#xff1a;https://www.bilibili.com/video/BV13U1VYmEUr/ 课程文档&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/Python 关卡作业&#xff1a;htt…...

分布式微服务系统架构第90集:现代化金融核心系统

#1.1 深化数字化转型&#xff0c;核心面临新挑战 1、架构侧&#xff1a;无法敏捷协同数字金融经营模式转型。 2、需求侧&#xff1a;业务需求传导低效始终困扰金融机构。 3、开发侧&#xff1a;创新产品上市速度低于期望。 4、运维侧&#xff1a;传统面向资源型监控体系难以支撑…...

浅谈Linux 权限、压缩、进程与服务

概述 放假回家&#xff0c;对Linux系统的一些知识进行重新的整理&#xff0c;做到温故而知新&#xff0c;对用户权限管理、文件赋权、压缩文件、进程与服务的知识进行了一次梳理和总结。 权限管理 Linux最基础的权限是用户和文件&#xff0c;先了解基础的用户权限和文件权限…...

SpringBoot中Excel表的导入、导出功能的实现

文章目录 一、easyExcel简介二、Excel表的导出2.1 添加 Maven 依赖2.2 创建导出数据的实体类4. 编写导出接口5. 前端代码6. 实现效果 三、excel表的导出1. Excel表导入的整体流程1.1 配置文件存储路径 2. 前端实现2.1 文件上传组件 2.2 文件上传逻辑3. 后端实现3.1 文件上传接口…...