Spaces:
Sleeping
Sleeping
File size: 4,949 Bytes
b8c6f28 0d7c387 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | ---
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
|