| 1 | import csv
|
|---|
| 2 | import random
|
|---|
| 3 | from datetime import datetime, timedelta, date
|
|---|
| 4 |
|
|---|
| 5 | N = 10_000_000
|
|---|
| 6 | OUTPUT_FILE = "kazna.csv"
|
|---|
| 7 |
|
|---|
| 8 | # Најран датум на инсталација на камера
|
|---|
| 9 | CAMERAS_START_DATE = datetime.strptime("2022-03-15", "%Y-%m-%d").date()
|
|---|
| 10 |
|
|---|
| 11 | TODAY = date.today()
|
|---|
| 12 |
|
|---|
| 13 | amounts = [
|
|---|
| 14 | 2500, 3000, 3500, 4500, 5000,
|
|---|
| 15 | 7000, 9000, 12000, 15000,
|
|---|
| 16 | 20000, 25000, 30000,
|
|---|
| 17 | 45000, 60000
|
|---|
| 18 | ]
|
|---|
| 19 |
|
|---|
| 20 |
|
|---|
| 21 | def random_date_after_camera_installation():
|
|---|
| 22 | days_between = (TODAY - CAMERAS_START_DATE).days
|
|---|
| 23 | return CAMERAS_START_DATE + timedelta(days=random.randint(0, days_between))
|
|---|
| 24 |
|
|---|
| 25 |
|
|---|
| 26 | def random_deadline(datum):
|
|---|
| 27 | return datum + timedelta(days=random.choice([8, 15, 30, 45, 60]))
|
|---|
| 28 |
|
|---|
| 29 |
|
|---|
| 30 | def generate_status(datum, rok):
|
|---|
| 31 | r = random.random()
|
|---|
| 32 |
|
|---|
| 33 | # Ако рокот е поминат
|
|---|
| 34 | if rok < TODAY:
|
|---|
| 35 |
|
|---|
| 36 | if r < 0.70:
|
|---|
| 37 | return 1 # платена
|
|---|
| 38 |
|
|---|
| 39 | elif r < 0.90:
|
|---|
| 40 | return 2 # задоцнета / проблематична
|
|---|
| 41 |
|
|---|
| 42 | else:
|
|---|
| 43 | return 0 # сè уште неплатена
|
|---|
| 44 |
|
|---|
| 45 | # Ако рокот НЕ е поминат
|
|---|
| 46 | else:
|
|---|
| 47 |
|
|---|
| 48 | if r < 0.55:
|
|---|
| 49 | return 0 # pending
|
|---|
| 50 |
|
|---|
| 51 | elif r < 0.95:
|
|---|
| 52 | return 1 # paid
|
|---|
| 53 |
|
|---|
| 54 | else:
|
|---|
| 55 | return 2 # problematic
|
|---|
| 56 |
|
|---|
| 57 |
|
|---|
| 58 | def random_amount():
|
|---|
| 59 | r = random.random()
|
|---|
| 60 |
|
|---|
| 61 | # Најчести помали казни
|
|---|
| 62 | if r < 0.45:
|
|---|
| 63 | return random.choice([
|
|---|
| 64 | 2500, 3000, 3500, 4500, 5000
|
|---|
| 65 | ])
|
|---|
| 66 |
|
|---|
| 67 | # Средни казни
|
|---|
| 68 | elif r < 0.80:
|
|---|
| 69 | return random.choice([
|
|---|
| 70 | 7000, 9000, 12000, 15000
|
|---|
| 71 | ])
|
|---|
| 72 |
|
|---|
| 73 | # Поголеми казни
|
|---|
| 74 | elif r < 0.95:
|
|---|
| 75 | return random.choice([
|
|---|
| 76 | 20000, 25000, 30000
|
|---|
| 77 | ])
|
|---|
| 78 |
|
|---|
| 79 | # Ретки многу големи казни
|
|---|
| 80 | else:
|
|---|
| 81 | return random.choice([
|
|---|
| 82 | 45000, 60000
|
|---|
| 83 | ])
|
|---|
| 84 |
|
|---|
| 85 |
|
|---|
| 86 | with open(OUTPUT_FILE, "w", newline="", encoding="utf-8") as f:
|
|---|
| 87 |
|
|---|
| 88 | writer = csv.writer(f)
|
|---|
| 89 |
|
|---|
| 90 | writer.writerow([
|
|---|
| 91 | "datum",
|
|---|
| 92 | "status",
|
|---|
| 93 | "rok_na_plakanje",
|
|---|
| 94 | "iznos_za_plakanje"
|
|---|
| 95 | ])
|
|---|
| 96 |
|
|---|
| 97 | for i in range(1, N + 1):
|
|---|
| 98 |
|
|---|
| 99 | datum = random_date_after_camera_installation()
|
|---|
| 100 |
|
|---|
| 101 | rok = random_deadline(datum)
|
|---|
| 102 |
|
|---|
| 103 | status = generate_status(datum, rok)
|
|---|
| 104 |
|
|---|
| 105 | iznos = random_amount()
|
|---|
| 106 |
|
|---|
| 107 | writer.writerow([
|
|---|
| 108 | datum.strftime("%Y-%m-%d"),
|
|---|
| 109 | status,
|
|---|
| 110 | rok.strftime("%Y-%m-%d"),
|
|---|
| 111 | iznos
|
|---|
| 112 | ])
|
|---|
| 113 |
|
|---|
| 114 | if i % 100_000 == 0:
|
|---|
| 115 | print(f"{i} kazni generated...")
|
|---|
| 116 |
|
|---|
| 117 | print("CSV file generated:", OUTPUT_FILE) |
|---|