315 lines
12 KiB
Markdown
315 lines
12 KiB
Markdown
# 📊 AI 数据分析师
|
||
|
||
一个基于 DeepSeek API + Streamlit 的智能数据分析平台,上传 CSV 数据即可获得 AI 驱动的深度洞察和可视化报告。
|
||
|
||

|
||

|
||

|
||

|
||
|
||
## ✨ 功能特性
|
||
|
||
| 功能 | 描述 |
|
||
|:---|:---|
|
||
| 📈 **数据预览** | 数据表格展示、统计摘要、列信息分析 |
|
||
| 📊 **智能可视化** | 根据数据类型自动生成直方图、散点图、箱线图、热力图 |
|
||
| 🤖 **AI 深度分析** | 综合分析、相关性分析、异常检测三种模式 |
|
||
| 💬 **自然语言问答** | 用中文直接询问关于数据的任何问题 |
|
||
| 📝 **报告生成** | 一键生成完整的 Markdown 格式分析报告并下载 |
|
||
|
||
## 🖼️ 界面预览
|
||
|
||
```
|
||
┌────────────────────────────────────────────────────────────────────┐
|
||
│ 📊 AI 数据分析师 │
|
||
│ 上传数据,让 AI 帮你发现数据中的故事 │
|
||
├────────────────────────────────────────────────────────────────────┤
|
||
│ [📈 数据预览] [📊 智能可视化] [🤖 AI 分析] [💬 数据问答] [📝 生成报告] │
|
||
├────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
|
||
│ │ 100 │ │ 7 │ │ 0 │ │ 5 │ │
|
||
│ │ 数据行 │ │ 数据列 │ │ 缺失值 │ │ 数值列 │ │
|
||
│ └──────┘ └──────┘ └──────┘ └──────┘ │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||
│ │ 姓名 │ 部门 │ 年龄 │ 工龄 │ 月薪 │ 绩效评分 │ 满意度 │ │
|
||
│ │ 张三 │ 技术部 │ 28 │ 3 │ 15000 │ 85.5 │ 4.2 │ │
|
||
│ │ 李四 │ 市场部 │ 32 │ 5 │ 18000 │ 78.3 │ 3.8 │ │
|
||
│ │ ... │ ... │ ... │ ... │ ... │ ... │ ... │ │
|
||
│ └─────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
└────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## 🚀 快速开始
|
||
|
||
### 1. 进入项目目录
|
||
|
||
```bash
|
||
cd 示例项目-AI数据分析师
|
||
```
|
||
|
||
### 2. 创建虚拟环境(推荐)
|
||
|
||
```bash
|
||
python -m venv venv
|
||
|
||
# Windows
|
||
venv\Scripts\activate
|
||
|
||
# macOS/Linux
|
||
source venv/bin/activate
|
||
```
|
||
|
||
### 3. 安装依赖
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### 4. 配置 API Key
|
||
|
||
创建 `.env` 文件:
|
||
|
||
```bash
|
||
echo "DEEPSEEK_API_KEY=sk-your-api-key" > .env
|
||
```
|
||
|
||
或直接在应用界面的侧边栏输入 API Key。
|
||
|
||
### 5. 运行应用
|
||
|
||
```bash
|
||
streamlit run app.py
|
||
```
|
||
|
||
浏览器会自动打开 http://localhost:8501
|
||
|
||
## 📁 项目结构
|
||
|
||
```
|
||
示例项目-AI数据分析师/
|
||
├── app.py # 主程序 (~600行)
|
||
├── requirements.txt # 项目依赖
|
||
├── sample_data.csv # 示例数据(员工信息)
|
||
├── .env # 环境变量(需自行创建)
|
||
├── .gitignore # Git 忽略文件
|
||
└── README.md # 项目说明
|
||
```
|
||
|
||
## 🛠️ 技术架构
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ Streamlit UI │
|
||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||
│ │数据预览 │ │智能可视化│ │ AI分析 │ │数据问答 │ │
|
||
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
|
||
│ │ │ │ │ │
|
||
├───────┼───────────┼───────────┼───────────┼─────────────┤
|
||
│ ▼ ▼ ▼ ▼ │
|
||
│ ┌─────────────────────────────────────────────────┐ │
|
||
│ │ Pandas DataFrame │ │
|
||
│ │ (数据处理与统计分析) │ │
|
||
│ └─────────────────────────────────────────────────┘ │
|
||
│ │ │ │
|
||
│ ▼ ▼ │
|
||
│ ┌─────────┐ ┌─────────────────────────────────────┐ │
|
||
│ │ Altair │ │ DeepSeek API │ │
|
||
│ │ (可视化)│ │ (AI 分析 / 问答 / 报告生成) │ │
|
||
│ └─────────┘ └─────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## 🔑 核心技术点
|
||
|
||
### 1. 数据处理与摘要生成
|
||
|
||
```python
|
||
def get_data_summary(df: pd.DataFrame) -> str:
|
||
"""生成数据摘要供 AI 分析"""
|
||
summary = []
|
||
|
||
# 基本信息
|
||
summary.append(f"数据集包含 {len(df)} 行和 {len(df.columns)} 列。")
|
||
|
||
# 数值列统计
|
||
numeric_cols = df.select_dtypes(include=['number']).columns
|
||
stats = df[numeric_cols].describe().to_string()
|
||
|
||
# ... 更多统计信息
|
||
return "\n".join(summary)
|
||
```
|
||
|
||
### 2. AI 分析的 Prompt 工程
|
||
|
||
```python
|
||
def analyze_with_ai(client, data_summary, analysis_type):
|
||
prompts = {
|
||
"general": """你是一个专业的数据分析师...
|
||
请从以下几个方面进行分析:
|
||
1. 📊 数据概况
|
||
2. 🔍 关键发现
|
||
3. 📈 建议可视化
|
||
4. ⚠️ 注意事项
|
||
5. 💡 进一步分析建议""",
|
||
|
||
"correlation": """分析变量之间的相关性...""",
|
||
"anomaly": """检测数据中的异常值..."""
|
||
}
|
||
|
||
response = client.chat.completions.create(
|
||
model="deepseek-chat",
|
||
messages=[
|
||
{"role": "system", "content": prompts[analysis_type]},
|
||
{"role": "user", "content": f"数据摘要:\n{data_summary}"}
|
||
]
|
||
)
|
||
return response.choices[0].message.content
|
||
```
|
||
|
||
### 3. 自动可视化生成
|
||
|
||
```python
|
||
def create_visualizations(df):
|
||
"""根据数据类型自动选择合适的图表"""
|
||
charts = []
|
||
numeric_cols = df.select_dtypes(include=['number']).columns
|
||
cat_cols = df.select_dtypes(include=['object']).columns
|
||
|
||
# 数值分布 -> 直方图
|
||
if numeric_cols:
|
||
hist_chart = alt.Chart(df).mark_bar().encode(
|
||
x=alt.X(f'{col}:Q', bin=True),
|
||
y='count()'
|
||
)
|
||
charts.append(hist_chart)
|
||
|
||
# 多数值变量 -> 散点图 + 相关性热力图
|
||
# 分类+数值 -> 箱线图
|
||
# ...
|
||
|
||
return charts
|
||
```
|
||
|
||
### 4. 多轮对话的上下文管理
|
||
|
||
```python
|
||
def ask_data_question(client, data_summary, question, chat_history):
|
||
messages = [
|
||
{"role": "system", "content": "你是数据分析助手..."},
|
||
{"role": "user", "content": f"数据摘要:\n{data_summary}"},
|
||
{"role": "assistant", "content": "我已了解数据,请问您想知道什么?"}
|
||
]
|
||
|
||
# 添加历史对话
|
||
for msg in chat_history:
|
||
messages.append(msg)
|
||
|
||
# 添加当前问题
|
||
messages.append({"role": "user", "content": question})
|
||
|
||
return client.chat.completions.create(
|
||
model="deepseek-chat",
|
||
messages=messages
|
||
)
|
||
```
|
||
|
||
### 5. Session State 管理
|
||
|
||
```python
|
||
# 初始化状态
|
||
if "df" not in st.session_state:
|
||
st.session_state.df = None
|
||
if "analyses" not in st.session_state:
|
||
st.session_state.analyses = {}
|
||
if "qa_history" not in st.session_state:
|
||
st.session_state.qa_history = []
|
||
|
||
# 跨 Tab 共享数据
|
||
df = st.session_state.df
|
||
```
|
||
|
||
## 📊 使用的 Streamlit 组件
|
||
|
||
| 组件 | 用途 |
|
||
|:---|:---|
|
||
| `st.tabs` | 多标签页布局 |
|
||
| `st.columns` | 统计卡片布局 |
|
||
| `st.file_uploader` | CSV 文件上传 |
|
||
| `st.dataframe` | 交互式数据表格 |
|
||
| `st.altair_chart` | Altair 图表渲染 |
|
||
| `st.chat_message` | 问答对话界面 |
|
||
| `st.chat_input` | 聊天输入框 |
|
||
| `st.session_state` | 状态管理 |
|
||
| `st.download_button` | 报告下载 |
|
||
| `st.spinner` | 加载动画 |
|
||
| `st.expander` | 可折叠区域 |
|
||
|
||
## 🎨 Vibe Coding 开发过程
|
||
|
||
### 初始 Prompt
|
||
|
||
> "帮我创建一个 AI 数据分析师应用,使用 DeepSeek API 和 Streamlit。
|
||
>
|
||
> 功能需求:
|
||
> 1. 上传 CSV 文件,显示数据预览和统计
|
||
> 2. 自动根据数据类型生成可视化图表(用 Altair)
|
||
> 3. AI 分析功能:综合分析、相关性分析、异常检测
|
||
> 4. 自然语言问答,可以问关于数据的问题
|
||
> 5. 生成 Markdown 格式的分析报告
|
||
>
|
||
> 技术要求:
|
||
> - 使用 st.tabs 做多标签页布局
|
||
> - 使用 st.session_state 管理状态
|
||
> - 界面要美观,使用自定义 CSS"
|
||
|
||
### 迭代优化
|
||
|
||
```
|
||
Prompt 1: "给数据预览页添加统计卡片,显示行数、列数、缺失值等"
|
||
|
||
Prompt 2: "让可视化更智能,根据数据类型自动选择图表类型"
|
||
|
||
Prompt 3: "问答功能要支持多轮对话,AI 要记住之前的问题"
|
||
|
||
Prompt 4: "报告生成功能要把之前的分析结果都整合进去"
|
||
|
||
Prompt 5: "加一个示例数据选项,方便没有数据的用户体验"
|
||
```
|
||
|
||
## 🔧 扩展建议
|
||
|
||
如果你想进一步完善这个项目,可以考虑:
|
||
|
||
1. **支持更多文件格式**:Excel、JSON、Parquet
|
||
2. **添加数据清洗功能**:缺失值处理、异常值处理
|
||
3. **更丰富的可视化**:时间序列图、地理图
|
||
4. **导出更多格式**:PDF、HTML、Word
|
||
5. **添加数据筛选器**:让用户选择分析哪些列/行
|
||
6. **机器学习预测**:简单的回归/分类预测功能
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
1. **数据大小**:大数据集(>10万行)可能导致界面卡顿
|
||
2. **API 成本**:长文本分析和多轮问答会消耗更多 Token
|
||
3. **隐私安全**:敏感数据请在本地使用,不要上传到公共服务器
|
||
4. **API Key 安全**:不要将 `.env` 提交到代码仓库
|
||
|
||
## 📚 参考资料
|
||
|
||
- [Streamlit 官方文档](https://docs.streamlit.io)
|
||
- [Altair 可视化文档](https://altair-viz.github.io)
|
||
- [Pandas 数据分析](https://pandas.pydata.org/docs/)
|
||
- [DeepSeek API 文档](https://platform.deepseek.com/api-docs)
|
||
|
||
## 👤 作者
|
||
|
||
Python 程序设计课程设计 - 高级示例项目
|
||
|
||
---
|
||
|
||
**让数据说话,用 AI 倾听!** 📊🤖
|
||
|