Files
2026-11-13 22:02:30 +03:00

55 lines
2.2 KiB
Python

"""Синтетические заказы, не реальные продажи. Детерминированно по 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}')