Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 10 / 14 = 71 %

  • Úspešnosť riešenia: 4,15 / 7 = 59%

Úlohou bolo vytvoriť funkciu normalizuj s jedným parametrom denne_prenosy, ktorá zabezpečí dve veci:

1. Nahradenie podprahových hodnôt: Všetky hodnoty rýchlostí, ktoré sú podprahové (t.j., menšie alebo rovné 0), sa musia nahradiť nulou. To simuluje, že príliš slabý alebo negatívny signál je v podstate výpadok.

# Najprv nahradíme všetky hodnoty <= 0 nulou upravene = [] for prenos in denne_prenosy: upraveny = [r if r > 0 else 0 for r in prenos] upravene.append(upraveny)

Riešenie prechádza cez každý jednotlivý prenos (prenos) a pomocou list comprehension vytvára nový zoznam (upraveny). V rámci tohto kroku sa implementuje podmienka: ak je rýchlosť signálu r > 0, ponechá sa pôvodná hodnota; inak (ak je r <= 0), nahradí sa nulou. Výsledkom je nový zoznam zoznamov upravene, ktorý už neobsahuje žiadne záporné ani nulové hodnoty okrem tých, ktoré boli explicitne nahradené nulou.

2. Normalizácia: Následne sa všetky hodnoty znormalizujú do intervalu <0,1>.

Normalizácia je kľúčová, pretože umožňuje porovnať rôzne sady dát, aj keď sú v rôznych rozsahoch (napríklad jeden prenos má max 50 a druhý max 300). Normalizácia zabezpečí, že:

  • Najmenšia relevantná hodnota (v tomto prípade 0) sa zmení na 0.
  • Najvyššia hodnota zo všetkých prenosov za deň sa zmení na 1.
  • Všetky ostatné hodnoty sa pomerne rozložia medzi 0 a 1.
# Nájdeme maximálnu hodnotu zo všetkých (po úprave) max_hodnota = max((r for prenos in upravene for r in prenos), default=0)

Pre normalizáciu na interval <0,1> je kľúčové nájsť globálnu maximálnu hodnotu zo všetkých prenosov za celý deň. Táto hodnota sa potom stane 1. Riešenie používa list comprehension (r for prenos in upravene for r in prenos) na efektívne prechádzanie cez všetky rýchlosti v celom zozname zoznamov upravene bez nutnosti vytvoriť obrovský dočasný zoznam. Funkcia max() nájde najväčšiu rýchlosť a ak sú všetky hodnoty nuly (napr. prázdny vstup alebo všetky rýchlosti boli ?0) default=0 zabezpečí, že max_hodnota bude 0.

# Ak je max 0, všetky hodnoty sú nuly ? normalizácia zostáva rovnaká, aby nedošlo k deleniu nulou if max_hodnota == 0: return upravene

Ak je maximálna hodnota 0, znamená to, že všetky rýchlosti signálu za celý deň boli podprahové (pôvodne ?0) a boli nahradené nulami. V takom prípade by delenie r / max_hodnota viedlo k chybe delenia nulou. Riešenie chybu ošetrí tak, že jednoducho vráti pôvodne upravené dáta (upravene), ktoré už obsahujú len nuly, čím je normalizácia (všetko je 0) splnená.

# Normalizujeme normalizovane = [] for prenos in upravene: norm_prenos = [r / max_hodnota if r > 0 else 0 for r in prenos] normalizovane.append(norm_prenos) return normalizovane

Ak je max_hodnota > , normalizácia prebieha. Opäť sa prechádza cez každý upravený prenos. Každá rýchlosť r sa vydelí nájdenou max_hodnota. To zaručí, že ak r je rovné max_hodnota, výsledok bude 1. Ak je r niečo medzi 0 a max_hodnota, výsledok bude v intervale (0,1).
Podmienka if r > 0 else 0 na konci je dôležitá: zaručuje, že aj po normalizácii zostanú hodnoty, ktoré boli na začiatku normalizácie nastavené na 0, aj naďalej nulové.

Vaše najčastejšie chyby

Bežným problémom bolo, že riešenie ale funguje len pre jeden zoznam - v zmysle zadania sa očakávala práca so zoznamom záznamov (teda zoznamom zoznamov) od všetkých senzorov. Taktiež sa stávalo, že riešenie nezvláda poruchové(t.j.podprahové alebo nulové) hodnoty a nebola na vstupe hraničná hodnota alebo sa s ňou vôbec nepracovalo.