Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI | |
| from env.environment import DataCleaningEnv | |
| app = FastAPI() | |
| TASKS = [ | |
| { | |
| "id": "task1", | |
| "name": "Basic Data Cleaning", | |
| "difficulty": "easy", | |
| "objective": "Handle missing values, remove duplicates, fix simple type issues, and preserve dataset structure.", | |
| "grader": "env.graders.task1_grader.grade_task1", | |
| "grader_path": "env/graders/task1_grader.py", | |
| "grader_function": "grade_task1", | |
| "task_number": 1 | |
| }, | |
| { | |
| "id": "task2", | |
| "name": "Intermediate Data Cleaning", | |
| "difficulty": "medium", | |
| "objective": "Normalize numeric columns, reduce correlation issues, and preserve useful records.", | |
| "grader": "env.graders.task2_grader.grade_task2", | |
| "grader_path": "env/graders/task2_grader.py", | |
| "grader_function": "grade_task2", | |
| "task_number": 2 | |
| }, | |
| { | |
| "id": "task3", | |
| "name": "Full Data Cleaning Pipeline", | |
| "difficulty": "hard", | |
| "objective": "Perform end-to-end cleaning with null handling, duplicate removal, structure preservation, and minimal data loss.", | |
| "grader": "env.graders.task3_grader.grade_task3", | |
| "grader_path": "env/graders/task3_grader.py", | |
| "grader_function": "grade_task3", | |
| "task_number": 3 | |
| } | |
| ] | |
| TASK_BY_ID = {task["id"]: task for task in TASKS} | |
| env = DataCleaningEnv(task=1) | |
| def parse_task(payload): | |
| payload = payload or {} | |
| task_value = payload.get("task", payload.get("task_id", "task1")) | |
| if isinstance(task_value, int): | |
| if task_value in [1, 2, 3]: | |
| return task_value | |
| return 1 | |
| task_value = str(task_value).lower() | |
| if task_value in TASK_BY_ID: | |
| return TASK_BY_ID[task_value]["task_number"] | |
| if task_value in ["1", "2", "3"]: | |
| return int(task_value) | |
| return 1 | |
| def root(): | |
| return { | |
| "name": "data-cleaning-env-final", | |
| "tasks": TASKS, | |
| "message": "OpenEnv data cleaning environment with 3 tasks and graders." | |
| } | |
| def tasks(): | |
| return { | |
| "count": len(TASKS), | |
| "tasks": TASKS | |
| } | |
| def reset(payload: dict = None): | |
| global env | |
| task_number = parse_task(payload) | |
| env = DataCleaningEnv(task=task_number) | |
| obs = env.reset() | |
| return { | |
| "task": f"task{task_number}", | |
| "task_number": task_number, | |
| "observation": obs, | |
| "available_tasks": TASKS | |
| } | |
| def step(action: dict): | |
| obs, reward, done, info = env.step(action) | |
| return { | |
| "obs": obs, | |
| "reward": reward, | |
| "done": done, | |
| "info": info | |
| } | |
| def state(): | |
| current_state = env.state() | |
| current_state["task"] = f"task{env.task}" | |
| current_state["available_tasks"] = TASKS | |
| return current_state | |
| def submit(): | |
| return env.submit_cleaned_data(env.dirty_df) | |