چیت‌شیت

کیفیت داده‌ها و گیت‌های کنترلی دیتاست

Data Quality and Dataset Gates

بارگذاری و تقسیم داده با سید، ترمیم سلول‌های CSV، اعتبارسنجی ردیف‌ها با قرارداد، ممیزی نشت داده و تمرین مایگریشن.

  • ۱۲ بخش
  • ۱ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. آنچه هر گیت کنترلی می‌سازد
  2. اجرا و نمره‌دهی
  3. پرسش فقط‌خواندنی از CSV
  4. تمرین مایگریشن
  5. تقسیم داده با سید
  6. توابع پروژه
  7. ورژن‌بندی فایل‌های حجیم
  8. پیش‌فرض‌ها و محدودیت‌ها
  9. خطاها و راه‌حل‌ها
  10. قواعد در کد
  11. سوالات متداول
  12. نکات کاربردی

آنچه هر گیت کنترلی می‌سازد

مقایسه
عاملترمیم CSVگیت کنترلی قراردادممیزی تقسیم دادهتمرین مایگریشن
خروجی ساخته‌شدهجدول پاک‌سازی‌شده و recipeردیف‌های تاییدشده و قرنطینهگزارش نشت داده به ازای هر رکوردرسید تمرین
ورودیمتن csv، نام‌های مستعار (aliases)، ستون‌های تاریخ (date_columns)فایل JSONL به‌همراه contract.json{train,test} یا {records}دیتابیس، مایگریشن، بازگشت به عقب، پایاها
خروجیفایل‌های cleaned.csv و recipe.jsonفایل‌های accepted.jsonl و quarantine.jsonlفایل split-audit.jsonفایل‌های rehearsal.json و schema-diff.json
سیگنال قبولینبود سلول بلاتکلیفpassed برابر true استusable برابر true استrelease_ready برابر true است
خروج از گیتغیرصفر در صورت شکستخروج با کد 1 برای نقض قاعده، کد 2 برای ورودی نامعتبرخروج با کد 2 در صورت غیرقابل استفاده بودنغیرصفر در صورت شکست
محدودیتفقط تاریخ‌های اسلش‌دار و ISOبدون درک صحت معناییکپی‌های عینی، نه بازنویسی‌هاسیاست SQLite، نه ایزولاسیون سیستم‌عامل

اجرا و نمره‌دهی

دستورها
دستورعملکرد
python3 scripts/project_test.py <project> --init <workspace>ایجاد ورک‌اسپیس؛ اجرای اول ناموفق است
python3 scripts/project_test.py <project> --all --solution --strictبررسی راه‌حل مرجع
python3 cli.py samples/input.json --output demo-outputاجرای ترمیم CSV یا تمرین مایگریشن
python3 cli.py sample.csv --question "sum units by region" --output output/report.htmlپاسخ به سوال درباره‌ی CSV به‌همراه رسید
python3 cli.py samples/input.jsonl --contract samples/contract.json --output demo-outputتقسیم ردیف‌ها به تاییدشده و قرنطینه
python3 cli.py samples/input.json --output split-audit.json --html split-audit.htmlممیزی تقسیم train و test
python3 cli.py --train train.jsonl --test test.jsonl --check --output split-audit.jsonممیزی پارتیشن‌های JSONL در CI
python code/data_utils.pyبارگذاری، تبدیل، تقسیم و اثرانگشت‌نگاری دیتاست

پرسش فقط‌خواندنی از CSV

معماری
سوالاسکیماSQLSQLکد sha256 و SQLsample.csvفرمت UTF-8، کمتر از 2 مگابایتload_csvتعیین REAL یا TEXT برای هر ستونplan_questionگرامر ساده‌ی سوالات--modelپیشنهاد SQL بر اساس اسکیماrun_queryauthorizer، query_only، محدودیت بودجهreport.htmlبه‌همراه رسید .json

تمرین مایگریشن

گام‌به‌گام
  1. اسنپ‌شاتدیتابیس مبدا را فقط‌خواندنی باز کنید و در حافظه بکاپ بگیرید.
  2. اسنپ‌شاتاسکیما، تعداد ردیف‌ها، SHA-256 محتوای ردیف‌ها و توالی‌ها را ثبت کنید.
  3. تمرینمایگریشن را صرفاً روی نسخه‌ی درون حافظه اعمال کنید.
  4. تمریندستورات ATTACH، DETACH، PRAGMA، جداول مجازی و توابع فایلی را مسدود کنید.
  5. آزمون بازگشت به عقبمایگریشن و بازگشت به عقب را روی یک بکاپ یک‌بارمصرف اجرا کنید.
  6. برگشت‌پذیریبدون خطا و برابری کامل اسنپ‌شات بازگردانی‌شده با نسخه‌ی قبلی.
  7. رسیدبررسی هر پایا. مقدار release_ready نیازمند تایید همه‌ی آن‌ها و بازگشت به عقب است.

تقسیم داده با سید

کد
python
dataset = load_dataset("stanfordnlp/imdb", split="train")
split = dataset.train_test_split(test_size=0.2, seed=42)
train_val = split["train"].train_test_split(test_size=0.125, seed=42)
train_ds = train_val["train"]             # 70 درصد کل ردیف‌ها
val_ds = train_val["test"]                # 10 درصد
test_ds = split["test"]                   # 20 درصد
dataset.to_parquet("imdb_train.parquet")  # بهترین فرمت ذخیره‌سازی
load_dataset("wikimedia/wikipedia", "20231101.en", split="train", streaming=True)

توابع پروژه

کار و کد
وظیفهکد
پروفایل ستون‌های CSVprofile(text)
پیش‌نمایش تغییرات سلول‌هاpreview(table, recipe)
اعمال ترمیم‌های بازبینی‌شدهrepair(table, recipe, decisions=None)
بررسی یک رکوردrow_issues(row, contract)
یافتن گروه‌های تکراریduplicate_rows(rows, contract)
ممیزی دو پارتیشنaudit(train, test)
تقسیم بر اساس هش گروهsplit_groups(records, test_fraction=0.2, seed='course')
اجرای خواندن مقیدrun_query(data, sql, max_rows=100, max_steps=100000)

ورژن‌بندی فایل‌های حجیم

دستورها
دستورعملکرد
git lfs track "*.safetensors"ذخیره‌ی فایل خارج از git به‌کمک پوینتر
dvc add data/training_set.parquetساخت یک فایل پوینتر کوچک .dvc
dvc remote add -d myremote s3://my-bucket/dvc-storeتنظیم مخزن راه‌دور DVC
dvc pushآپلود داده‌های ردیابی‌شده به مخزن راه‌دور
snapshot_download("sentence-transformers/all-MiniLM-L6-v2")کش کردن کامل مخزن مدل

پیش‌فرض‌ها و محدودیت‌ها

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
--limit100ردیف‌های نتیجه، حداکثر 1000
max_steps100000بودجه‌ی دستورات SQLite
`load_csv` rows10000کمتر از 2 مگابایت، حداکثر 50 ستون
--seedcourseسید هش گروه برای --split
Contract rows100000سقف ورودی API
SQL deadlinetwo-secondدستورات را محدود می‌کند، نه بکاپ‌ها را
`make_splits` seed42داده‌ی آموزش 0.8، اعتبارسنجی 0.1
Local storage10 GBاستفاده از فضای ابری بالاتر از آن

خطاها و راه‌حل‌ها

عیب‌یابی
  • "ragged row"

    علت
    تعداد سلول‌های ردیف نادرست است
    راه‌حل
    ردیف مبدا را اصلاح کنید
  • بلاتکلیف بودن به علت "ambiguous date"

    علت
    هر دو بخش 12 یا کمترند و با هم تفاوت دارند
    راه‌حل
    در تصمیم‌گیری‌ها تاریخ را با فرمت ISO وارد کنید
  • "stale review"

    علت
    جدول یا recipe پس از بازبینی تغییر کرده است
    راه‌حل
    پیش‌نمایش جدید را دوباره بازبینی کنید
  • "Query rejected: "

    علت
    کوئری SQL از مرز مجاز خواندن خارج شده است
    راه‌حل
    یک دستور SELECT واحد روی data بنویسید
  • "Aggregate column must contain finite numeric values"

    علت
    نوع ستون TEXT است
    راه‌حل
    تجمیع روی ستون با نوع REAL انجام شود
  • خروج گیت قرارداد --check با کد 1

    علت
    ردیف‌ها در قرنطینه قرار دارند
    راه‌حل
    فایل review.html را بخوانید. جداگانه برای ردیف‌ها تصمیم بگیرید
  • مقدار usable در تقسیم برابر false است

    علت
    نشت داده در محتوا یا گروه
    راه‌حل
    تقسیم بر اساس گروه با فلگ --split
  • مقدار release_ready برابر false است

    علت
    بازگشت به عقب دقیق و کامل نیست
    راه‌حل
    دستورات SQL بازگشت به عقبی بنویسید که ردیف‌ها را دقیقاً بازگرداند

قواعد در کد

مفهوم‌ها
ترتیب دستورالعمل (recipe)
برای هر ستون ابتدا trim، سپس alias و بعد date.
تغییرات
ثبت ردیف، ستون، مقدار قبلی و بعدی برای هر تغییر.
عدم تبدیل اجباری نوع
فیلدهای عدد صحیح و اعشاری مقدار بولی true را نمی‌پذیرند.
تکراری‌ها
گزارش همه‌ی ردیف‌های دارای تداخل، از جمله اولین ردیف.
گیت کنترلی
دیتاست بدون ردیف‌های قرنطینه و بدون ایرادات ساختاری پاس می‌شود.
اثرانگشت
اعمال NFKC، casefold و ادغام فاصله‌ها، سپس اجرای SHA-256.
تقسیم گروهی
محاسبه‌ی SHA-256 از سید و گروه تقسیم بر 2**256؛ کمتر از کسر مشخص‌شده test است.
فرمت‌ها
استفاده از Parquet برای ذخیره‌سازی، Arrow در حافظه و CSV و JSON برای تبادل داده.

سوالات متداول

پرسش و پاسخ
آیا نرمال‌سازی موارد بازنویسی‌شده را شناسایی می‌کند؟
خیر. تنها نسخه‌های عینی نرمال‌شده را می‌یابد.
آیا تمرین، دیتابیس مبدا را تغییر می‌دهد؟
خیر. مبدا هرگز با دسترسی نوشتن باز نمی‌شود.
آیا مدل کوئری SQL خود را آزادانه اجرا می‌کند؟
خیر. احراز دسترسی در SQLite اجرای آن را کنترل می‌کند.
آیا می‌توان ردیف‌های قرنطینه را بلافاصله حذف کرد؟
خیر. پارتیشن‌ها شواهد هستند، نه مجوزی برای حذف سریع.
چرا سید تعیین کنیم؟
سید یکسان همواره تقسیم داده‌ی کاملاً مشابهی تولید می‌کند.

نکات کاربردی

نکته‌ها
  • بازپخش recipe روی یک جدول دیگر با دستور --recipe recipe.json.
  • خواندن cleaned.csv با csv.DictReader به‌عنوان مصرف‌کننده‌ی نهایی.
  • پیش از بارگذاری خروجی‌ها، منتظر اتمام اجرای کامل گیت کنترلی بمانید.
  • ورودی را در کنار خروجی نگه دارید تا امکان بازتولید آن برای دیگران فراهم باشد.
  • وزن‌های مدل را با .gitignore خارج از git نگه دارید. برای بازتولید اجراها از DVC استفاده کنید.