项目概述
本项目将使用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