Spaces:
Sleeping
Sleeping
| title: CSV Data Cleaning Environment | |
| emoji: π§Ή | |
| colorFrom: blue | |
| colorTo: green | |
| sdk: docker | |
| app_port: 8000 | |
| pinned: false | |
| # CSV Cleaner Environment | |
| A real-world **data cleaning** OpenEnv environment where AI agents learn to clean messy CSV datasets through structured commands. Built on the [OpenEnv](https://github.com/meta-pytorch/OpenEnv) framework. | |
| ## Motivation | |
| Data cleaning is one of the most common and time-consuming tasks in real-world data work. This environment trains AI agents to perform systematic data wrangling β fixing column types, handling missing values, removing duplicates, renaming columns, and filtering invalid rows β simulating tasks that data engineers and analysts do daily. | |
| ## Environment Description | |
| The agent receives a messy CSV dataset and a cleaning objective. Each step, the agent issues one cleaning command via MCP tools. The environment applies the command, returns the updated dataset state, and provides progressive reward based on how close the dataset is to the target clean version. | |
| ## Action Space (MCP Tools) | |
| | Tool | Parameters | Description | | |
| |------|-----------|-------------| | |
| | `get_dataset_info` | β | View columns, types, null counts, sample values | | |
| | `rename_column` | `old_name`, `new_name` | Rename a column | | |
| | `cast_column` | `column`, `dtype` | Cast to `int`, `float`, `str`, `datetime` | | |
| | `fill_missing` | `column`, `strategy`, `value?` | Fill nulls. Strategy: `mean`, `median`, `mode`, `constant`, `zero` | | |
| | `drop_missing` | `column?` | Drop rows with nulls (empty = all columns) | | |
| | `drop_duplicates` | `columns?` | Remove duplicate rows (comma-separated or all) | | |
| | `filter_rows` | `column`, `operator`, `value` | Filter rows. Operators: `==`, `!=`, `>`, `<`, `>=`, `<=`, `contains` | | |
| | `strip_whitespace` | `column` | Strip leading/trailing whitespace | | |
| | `replace_values` | `column`, `old_value`, `new_value` | Replace values in a column | | |
| ## Observation Space | |
| Each observation includes: | |
| - **columns**: List of `{name, dtype, null_count, unique_count, sample_values}` | |
| - **row_count**: Current number of rows | |
| - **duplicate_count**: Number of duplicate rows | |
| - **task_description**: What needs to be cleaned | |
| - **last_action_result**: Success/error message from last command | |
| - **progress**: Score from 0.0 to 1.0 representing cleaning completion | |
| ## Tasks | |
| | Task | Difficulty | Max Steps | Description | | |
| |------|-----------|-----------|-------------| | |
| | `fix_column_types` | Easy | 10 | Fix 4 columns with wrong types (stringβint/float/datetime) | | |
| | `clean_missing_duplicates` | Medium | 15 | Fill missing values with appropriate strategies + remove duplicates | | |
| | `full_pipeline` | Hard | 20 | Rename columns, fix types, strip whitespace, fill missing, normalize values, filter invalid rows, remove duplicates | | |
| ## Reward Function | |
| - **Progressive**: Each step computes similarity to target dataset (column types, null counts, duplicates, row count, column names) | |
| - **Reward = score_delta**: the improvement in score since the last step | |
| - **Completion bonus**: +0.1 when progress β₯ 0.95 | |
| - **Score range**: Final score always in [0.0, 1.0] | |
| ## Setup & Usage | |
| ### Install | |
| ```bash | |
| pip install -e . | |
| ``` | |
| ### Run Server Locally | |
| ```bash | |
| uvicorn server.app:app --host 0.0.0.0 --port 8000 | |
| ``` | |
| ### Docker Build & Run | |
| ```bash | |
| docker build -t csv-cleaner-env . | |
| docker run -p 8000:8000 csv-cleaner-env | |
| ``` | |
| ### Run Inference | |
| ```bash | |
| export HF_TOKEN=your_token_here | |
| export IMAGE_NAME=csv-cleaner-env | |
| python inference.py | |
| ``` | |
| ### Environment Variables | |
| | Variable | Required | Default | Description | | |
| |----------|----------|---------|-------------| | |
| | `API_BASE_URL` | No | `https://router.huggingface.co/v1` | LLM API endpoint | | |
| | `MODEL_NAME` | No | `Qwen/Qwen2.5-72B-Instruct` | Model identifier | | |
| | `HF_TOKEN` | Yes | β | API key | | |
| | `IMAGE_NAME` | Yes* | β | Docker image name (*for inference) | | |
| | `CSV_CLEANER_TASK` | No | `fix_column_types` | Default task | | |
| ## Baseline Scores | |
| | Task | Baseline Score | Model | | |
| |------|---------------|-------| | |
| | `fix_column_types` | ~0.80 | Qwen2.5-72B-Instruct | | |
| | `clean_missing_duplicates` | ~0.65 | Qwen2.5-72B-Instruct | | |
| | `full_pipeline` | ~0.45 | Qwen2.5-72B-Instruct | | |
| ## Project Structure | |
| ``` | |
| csv_cleaner_env/ | |
| βββ __init__.py # Package exports | |
| βββ models.py # Pydantic Action/Observation models | |
| βββ client.py # MCPToolClient wrapper | |
| βββ openenv.yaml # OpenEnv manifest | |
| βββ pyproject.toml # Dependencies | |
| βββ Dockerfile # Container definition | |
| βββ inference.py # Baseline inference script | |
| βββ README.md # This file | |
| βββ server/ | |
| βββ __init__.py | |
| βββ app.py # FastAPI entry point | |
| βββ csv_cleaning_environment.py # Core environment | |
| βββ tasks.py # Task definitions & graders | |
| ``` | |
| ## License | |
| MIT | |