本应用是一个基于Streamlit构建的交互式数据分析工具,它为用户提供了一个便捷的数据分析仪表板。用户既可以上传CSV文件,也能使用内置的示例数据开展分析。该工具支持数据筛选、采样、相关性分析、分布分析和分组分析等多项功能,并且所有参数和数据状态都通过Streamlit的session_state进行管理,从而确保了交互体验和数据的一致性。
- 数据加载:支持上传CSV文件,同时提供一键加载内置示例数据的功能。
- 字段识别:自动识别数值型和分类型字段,支持多条件筛选。
- 相关性分析:可自定义相关性热力图的阈值、显示风格和颜色主题,还能可视化相关系数矩阵和热力图,并支持阈值过滤与系数显示。
- 数据采样:支持数据采样,方便对大数据集进行快速分析。
- 数据展示:提供数据概览、基本信息、统计摘要等数据展示功能。
- 分布分析:支持直方图、箱线图、密度图等多种分布可视化方式。
- 分组分析:支持按分类字段分组,对数值字段进行多种聚合(均值、总和、最大、最小、计数),并可自定义显示前N组。
- streamlit
- pandas
- numpy
- matplotlib
- seaborn
- 快速数据探索与可视化分析
- 非技术用户的交互式数据分析
- 数据科学教学与演示
运行以下命令启动Streamlit应用:
streamlit run app.py
在侧边栏中,你可以选择上传CSV文件,或者点击“使用内置示例数据”按钮加载示例数据。同时,还提供了示例CSV文件的下载链接。
根据需要,在侧边栏设置分析参数、筛选条件和采样比例:
- 相关性分析参数:设置相关性热力图的显示阈值和是否显示相关系数值。
- 可视化参数:选择图表风格和图标颜色主题。
- 数据采样参数:设置数据采样比例,并点击“确认采样”按钮进行采样。
- 分组分析参数:设置仅显示前N个组。
在主界面查看数据概览、相关性分析、分布分析和分组分析的结果。
- 采样和筛选操作会影响后续分析结果。
- 支持中文字段和数据,已设置中文字体兼容。
- 若上传文件编码异常,系统会自动尝试不同编码读取。
app.py
:主应用文件,包含了Streamlit应用的所有代码。
以下是部分关键代码片段,展示了如何加载示例数据和进行数据采样:
# 使用示例数据按钮(通过session_state保存状态)
if st.button("使用内置示例数据"):
sample_data = """产品名称,类别,地区,销售额,销售量,利润率,日期
智能手机,电子产品,华东,89200,120,0.18,2025-01-01
笔记本电脑,电子产品,华北,125400,75,0.22,2025-01-01
平板电脑,电子产品,华南,45800,90,0.15,2025-01-01
蓝牙耳机,电子产品,华东,32500,250,0.25,2025-01-01
智能手表,电子产品,华北,56300,130,0.21,2025-01-01
咖啡,食品饮料,华东,18700,320,0.32,2025-01-01
茶叶,食品饮料,华南,24500,180,0.28,2025-01-01
巧克力,食品饮料,华北,15600,240,0.35,2025-01-01
饼干,食品饮料,华东,12400,160,0.26,2025-01-01
矿泉水,食品饮料,华南,9800,450,0.18,2025-01-01
运动鞋,服装鞋帽,华北,65400,120,0.22,2025-01-02
运动服,服装鞋帽,华东,78900,95,0.25,2025-01-02
牛仔裤,服装鞋帽,华南,45600,160,0.23,2025-01-02
T恤,服装鞋帽,华北,32100,280,0.19,2025-01-02
连衣裙,服装鞋帽,华东,56700,110,0.28,2025-01-02
冰箱,家电,华南,125400,40,0.25,2025-01-02
洗衣机,家电,华北,98700,55,0.23,2025-01-02
电视,家电,华东,156800,35,0.27,2025-01-02
空调,家电,华南,189500,42,0.31,2025-01-02
电饭煲,家电,华北,32500,120,0.20,2025-01-02"""
st.session_state.df = pd.read_csv(io.StringIO(sample_data))
st.session_state.use_sample = True # 标记使用示例数据
st.session_state.uploaded = False # 重置上传状态
st.session_state.original_df = st.session_state.df.copy() # 保存原始数据
# 数据采样参数
if st.session_state.df is not None and not st.session_state.df.empty:
total_rows = len(st.session_state.original_df) # 使用原始数据的行数
sample_ratio = st.slider(
f"数据采样比例(共{total_rows}行)",
min_value=0.1, max_value=1.0, value=1.0, step=0.1
)
if sample_ratio <= 1.0:
if st.button("确认采样"):
if total_rows > 0:
st.session_state.df = st.session_state.original_df.sample(frac=sample_ratio, random_state=42)
st.success(f"已采样 {sample_ratio*100}% 的数据({len(st.session_state.df)}行)")
else:
st.error("数据集为空,无法进行采样")
else:
st.session_state.df = st.session_state.original_df.copy() # 当比例为1.0时,恢复原始数据
如果你有任何改进建议或发现了问题,请随时提交issue或pull request。