项目进度: 0%
数据分析

数据可视化平台

项目概述

本项目将使用Streamlit开发一个数据分析和可视化平台,支持多种数据源导入、数据处理和可视化展示。

项目特点:

  • 支持CSV、Excel等多种数据格式
  • 数据清洗和预处理功能
  • 多种图表类型展示
  • 交互式数据筛选
  • 数据分析报表导出

技术栈说明

核心框架

  • Streamlit - Web应用框架
  • Pandas - 数据处理
  • Plotly - 交互式图表
  • NumPy - 数值计算

其他工具

  • Scikit-learn - 数据分析
  • XlsxWriter - Excel导出
  • Python-docx - Word报表

项目结构

data_viz/
├── app.py
├── pages/
│   ├── data_import.py
│   ├── visualization.py
│   └── analysis.py
├── utils/
│   ├── data_processor.py
│   └── chart_helper.py
└── requirements.txt

数据导入

实现多种格式数据的导入功能:

# pages/data_import.py
import streamlit as st
import pandas as pd

def load_data():
    st.title("数据导入")
    
    uploaded_file = st.file_uploader(
        "选择数据文件",
        type=["csv", "xlsx", "xls"]
    )
    
    if uploaded_file is not None:
        try:
            if uploaded_file.name.endswith('.csv'):
                df = pd.read_csv(uploaded_file)
            else:
                df = pd.read_excel(uploaded_file)
            
            st.session_state['data'] = df
            st.success('数据导入成功!')
            
            st.subheader('数据预览')
            st.dataframe(df.head())
            
            st.subheader('基本信息')
            st.write(df.info())
        except Exception as e:
            st.error(f'数据导入失败:{str(e)}')

数据处理

数据清洗和预处理功能:

# utils/data_processor.py
import pandas as pd
import numpy as np

class DataProcessor:
    def __init__(self, df):
        self.df = df.copy()
    
    def handle_missing_values(self, method='mean'):
        numeric_cols = self.df.select_dtypes(
            include=[np.number]).columns
        
        if method == 'mean':
            self.df[numeric_cols] = self.df[numeric_cols].fillna(
                self.df[numeric_cols].mean())
        elif method == 'median':
            self.df[numeric_cols] = self.df[numeric_cols].fillna(
                self.df[numeric_cols].median())
        
        # 处理非数值列
        self.df = self.df.fillna('未知')
        
        return self.df
    
    def remove_duplicates(self):
        self.df = self.df.drop_duplicates()
        return self.df
    
    def format_datetime(self, column):
        self.df[column] = pd.to_datetime(
            self.df[column], errors='coerce'
        )
        return self.df

可视化实现

使用Plotly实现交互式图表:

# utils/chart_helper.py
import plotly.express as px
import plotly.graph_objects as go

def create_line_chart(df, x_col, y_col, title):
    fig = px.line(df, x=x_col, y=y_col, 
                  title=title)
    return fig

def create_bar_chart(df, x_col, y_col, title):
    fig = px.bar(df, x=x_col, y=y_col,
                 title=title)
    return fig

def create_scatter_plot(df, x_col, y_col, 
                       color_col=None, title=None):
    fig = px.scatter(df, x=x_col, y=y_col,
                    color=color_col, title=title)
    return fig

交互功能

实现数据筛选和图表交互:

# pages/visualization.py
import streamlit as st
from utils.chart_helper import *

def render_viz_page():
    if 'data' not in st.session_state:
        st.warning('请先导入数据!')
        return
    
    df = st.session_state['data']
    
    # 选择图表类型
    chart_type = st.selectbox(
        '选择图表类型',
        ['折线图', '柱状图', '散点图']
    )
    
    # 选择数据列
    numeric_cols = df.select_dtypes(
        include=[np.number]).columns
    
    x_col = st.selectbox('选择X轴数据', df.columns)
    y_col = st.selectbox('选择Y轴数据', numeric_cols)
    
    # 创建图表
    if chart_type == '折线图':
        fig = create_line_chart(df, x_col, y_col,
                              f'{y_col}趋势图')
    elif chart_type == '柱状图':
        fig = create_bar_chart(df, x_col, y_col,
                             f'{y_col}分布图')
    else:
        color_col = st.selectbox(
            '选择颜色分组', [None] + list(df.columns)
        )
        fig = create_scatter_plot(
            df, x_col, y_col, color_col,
            f'{x_col} vs {y_col}'
        )
    
    st.plotly_chart(fig)

项目部署

使用Streamlit Cloud部署应用:

# 部署命令
streamlit run app.py

# requirements.txt
streamlit==1.28.0
pandas==2.1.1
plotly==5.17.0
numpy==1.26.0
scikit-learn==1.3.1
xlsxwriter==3.1.9
python-docx==1.0.1