在Python数据处理工作中,工具链的选择直接影响开发效率和结果的可复现性。经过长期实践,我形成了一套以marimo、PyCharm和uv为核心的工作流,覆盖数据读取、清洗、分析、可视化与存储。本文将详细拆解这套流程,并给出关键代码示例。
- uv init
- uv add marimo pandas numpy scipy matplotlib
- uv run marimo edit
复制代码
以上命令初始化项目、安装依赖并启动marimo笔记本。uv管理虚拟环境和依赖锁定,避免了手动激活环境的繁琐。
## 开发环境:marimo与PyCharm各司其职
marimo是一个响应式Python笔记本,变量更新后依赖的单元格自动重新执行,消除了Jupyter常见的隐藏状态问题。笔记本保存为.py文件,可用Git管理。由于marimo要求全局变量不重复定义,变量命名必须清晰,例如:
- raw_df = pd.read_csv('data.csv')
- cleaned_df = clean_data(raw_df)
- summary_df = aggregate(cleaned_df)
复制代码
PyCharm则负责脚本化开发和数据库操作。从2025.1版本开始,社区版和专业版合并,核心功能免费。当数据处理逻辑稳定后,应将其从marimo迁移到独立模块:
- project/
- ├── notebooks/
- ├── src/
- │ └── project_name/
- │ ├── readers.py
- │ ├── cleaning.py
- │ ├── analysis.py
- │ ├── plotting.py
- │ └── storage.py
- ├── tests/
- ├── pyproject.toml
- └── uv.lock
复制代码
marimo负责交互探索,PyCharm维护底层代码,两者互补。
## 数据读取与清洗:pathlib与pandas
使用pathlib.Path管理文件路径,避免跨平台分隔符问题:
- from pathlib import Path
- data_folder = Path('data')
- for file in data_folder.rglob('*.csv'):
- print(file.name, file.stem, file.suffix)
复制代码
读取CSV或Excel时统一为DataFrame:
- import pandas as pd
- df = pd.read_csv('data.csv')
- # 或 df = pd.read_excel('data.xlsx')
复制代码
数据清洗不仅是删除空值,还包括统一列名、去除空格、类型转换等:
- df = df.rename(columns=lambda c: c.strip().replace(' ', '_').replace('/', '_'))
- df['value'] = pd.to_numeric(df['value'], errors='coerce')
复制代码
原始数据应保持只读,目录结构建议:
- data/
- ├── raw/
- ├── interim/
- └── processed/
复制代码
## 数据分析与数值计算
pandas适合表格筛选、分组、合并、时间序列处理;NumPy提供数组运算和矩阵操作;SciPy在此基础上扩展了插值、优化、信号处理等功能。当任务超出简单表格运算时,优先检查SciPy标准实现。
## 数据可视化
静态图表用Matplotlib,细节控制能力强;交互图表用Plotly。建议将重复绘图逻辑封装为函数,统一字体、尺寸和颜色。
## 数据存储:按类型选择格式
CSV适合交换和人工查看,但无法保留数据类型和元数据。结构化记录频繁查询用SQLite:
- import sqlite3
- conn = sqlite3.connect('records.db')
- df.to_sql('table_name', conn, if_exists='replace')
复制代码
多维科学数据用xarray+NetCDF:
- import xarray as xr
- ds = xr.Dataset({'temperature': (['lat', 'lon'], data_array)})
- ds.to_netcdf('processed.nc')
- ds_read = xr.open_dataset('processed.nc')
复制代码
NetCDF保留坐标、维度和属性。复杂属性只使用简单类型。大型分析型表格可选Parquet。
## 工作流程建议
1. 在marimo中探索和验证思路。
2. 将稳定逻辑封装为函数。
3. 用PyCharm拆分到独立模块并添加测试。
4. 在marimo中导入模块完成交互分析。
5. 使用uv管理依赖和运行环境。
6. 原始数据、处理代码与结果分别管理,确保可复现。
可复现性比“能运行”更重要:记录数据来源、依赖版本、处理步骤、参数设置。将pyproject.toml和uv.lock纳入版本控制,避免依赖手工执行顺序。
## 工具职责分工
| 类别 | 工具 | 用途 |
|------|------|------|
| 项目和依赖管理 | uv | Python版本、依赖、虚拟环境、锁文件 |
| 交互式分析 | marimo | 数据探索、过程检查、结果展示 |
| 工程化开发 | PyCharm | 脚本开发、调试、重构、测试、数据库操作 |
| 路径管理 | pathlib | 文件遍历、跨平台路径 |
| 表格数据处理 | pandas | 读取、清洗、转换、合并、统计 |
| 数值计算 | NumPy/SciPy | 数组运算、拟合、优化、科学计算 |
| 静态可视化 | Matplotlib | 学术绘图、精细排版 |
| 交互可视化 | Plotly | 数据探索、网页展示 |
| 多维数据管理 | xarray | 坐标、维度、变量、元数据 |
| 关系型数据管理 | SQLite | 结构化记录、关系、索引 |
| 表格交换存储 | CSV/Parquet | 数据交换、分析型表格 |
| 科学数据存储 | NetCDF | 多维数据、坐标与元数据 |
## 总结
这套工作流的重点不是单一工具,而是让工具承担最擅长的任务:marimo保证交互分析的可复现性,PyCharm提供工程化能力,uv简化依赖管理,pandas/NumPy/SciPy构建数据处理基础,Matplotlib/Plotly满足可视化需求,SQLite/NetCDF/CSV按需存储。随着项目发展,这一体系能确保数据来源清楚、处理过程可检、运行环境可重建、结果可复现。 |