"""Синтетические заказы, не реальные продажи. Детерминированно по seed.""" import argparse import csv from datetime import date, timedelta from pathlib import Path import random FIELDS = ('order_id', 'line_id', 'order_date', 'category', 'quantity', 'unit_price') def generate(output, seed=42): rng = random.Random(seed) rows = [] categories = ('Книги', 'Электроника', 'Дом') formats = ('%Y-%m-%d', '%d.%m.%Y', '%Y/%m/%d') for day in range(30): if day == 12: # intentionally absent calendar day continue for index in range(10): price = rng.randint(10000, 150000) quantity = rng.randint(1, 4) if day == 22: # analytical signal deliberately planted, not bad source data quantity *= 20 rows.append([f'SYN-{day:02d}-{index:02d}', '1', (date(2026, 1, 1) + timedelta(days=day)).strftime(formats[index % 3]), ' ' + categories[index % 3] + ' ', str(quantity), f'{price // 100}.{price % 100:02d}']) rows.append(rows[0].copy()) conflict = rows[1].copy() conflict[4] = '99' rows.append(conflict) defects = [('category', ''), ('quantity', ''), ('order_date', '02/03/2026'), ('order_date', '2026-02-30'), ('quantity', '0'), ('quantity', '-2'), ('unit_price', '0'), ('unit_price', '12.345'), ('unit_price', 'NaN')] for index, (field, value) in enumerate(defects): row = rows[2].copy() row[0] = f'SYN-DEFECT-{index}' row[FIELDS.index(field)] = value rows.append(row) output = Path(output) output.parent.mkdir(parents=True, exist_ok=True) with output.open('w', encoding='utf-8', newline='') as stream: writer = csv.writer(stream) writer.writerow(FIELDS) writer.writerows(rows) return len(rows) if __name__ == '__main__': parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--output', type=Path, required=True) parser.add_argument('--seed', type=int, default=42) args = parser.parse_args() print(f'Synthetic CSV: {generate(args.output, args.seed)} rows, seed={args.seed}')