File size: 3,573 Bytes
925a036
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217b763
 
 
 
 
 
 
 
 
 
 
 
 
925a036
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Data Janitor Env β€” 5-Minute Quickstart
======================================

Run from the repo root:
    python examples/quickstart.py

No server, no Docker, no API key needed. Pure in-process execution.
"""

import sys, os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

from gym_env import DataJanitorGymEnv

# ── 1. Create environment (in-process, no server needed) ────────────────────
env = DataJanitorGymEnv(task_id="fix_basics", mode="text")
obs, info = env.reset()

print("=" * 60)
print("TASK: Fix the Basics")
print("=" * 60)
print(f"Initial quality score : {info['quality_score']:.2%}")
print(f"Issues detected       : {len(info['issues'])}")
print()

# ── 2. Manual cleaning sequence ─────────────────────────────────────────────
cleaning_steps = [
    env.action_from_dict("drop_duplicates", params={"subset": ["employee_id"]}),
    env.action_from_dict("convert_type",   column="age",        params={"target_type": "int"}),
    env.action_from_dict("normalize_text", column="email",      params={"operation": "trim"}),
    env.action_from_dict("normalize_text", column="email",      params={"operation": "lower"}),
    env.action_from_dict("normalize_text", column="salary",     params={"operation": "regex_replace",
                                                                          "pattern": r"[$,]",
                                                                          "replacement": ""}),
    env.action_from_dict("convert_type",   column="salary",     params={"target_type": "float"}),
    env.action_from_dict("map_values",     column="department", params={"mapping": {
        "Ops": "Operations", "Engg": "Engineering", "OPERATIONS": "Operations",
        "FINANCE": "Finance", "MARKETING": "Marketing", "Mktg": "Marketing",
        "engineering": "Engineering", "finance": "Finance",
        "hr": "HR", "marketing": "Marketing", "sales": "Sales",
    }}),
    env.action_from_dict("submit"),
]

for i, action in enumerate(cleaning_steps, 1):
    import json
    cmd = json.loads(action)["command"]
    obs, reward, terminated, truncated, info = env.step(action)
    print(f"Step {i:2d}: {cmd:20s}  quality={info['quality_score']:.2%}  d={reward:+.4f}")
    if terminated:
        print(f"\nβœ“ Final score: {info['quality_score']:.4f}")
        break

env.close()

# ── 3. Dict (numerical) mode β€” for classical RL ──────────────────────────────
print("\n" + "=" * 60)
print("NUMERICAL MODE DEMO (for classical RL)")
print("=" * 60)

env2 = DataJanitorGymEnv(task_id="fix_basics", mode="dict")
vec_obs, info = env2.reset()
print(f"Observation vector shape : {vec_obs.shape}")
print(f"Observation values       : {vec_obs}")
print(f"Action space             : {env2.action_space}")
print(f"Action table size        : {env2.get_action_count()} pre-defined actions")
print()

# Run through the optimal action sequence (action indices 1..10)
for action_idx in range(1, env2.get_action_count()):
    vec_obs, reward, terminated, truncated, info = env2.step(action_idx)
    cmd, col, _ = env2.action_table[action_idx]
    print(f"  Action {action_idx:2d}: {cmd}({col or ''})  -> quality={info['quality_score']:.2%}  d={reward:+.4f}")
    if terminated:
        print(f"\nβœ“ Final score: {info['quality_score']:.4f}")
        break

env2.close()
print("\nDone! See examples/train_rl_agent.py to train a policy.")