55 lines
2.2 KiB
Python
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}')
|