Skip to content

Commit 1787acc

Browse files
committed
vylepseni logiky selekce dieselu
1 parent e30e99e commit 1787acc

File tree

5 files changed

+56
-39
lines changed

5 files changed

+56
-39
lines changed

kod/preprocessing.py

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,7 @@ def parse_mereni(element, namespaces):
674674
rizeny_obd_element = safe_find(emisni_system_element, 'm:rizenyOBD', namespaces)
675675
rizeny_element = safe_find(emisni_system_element, 'm:rizeny', namespaces)
676676
nerizeny_element = safe_find(emisni_system_element, 'm:nerizeny', namespaces)
677-
emise_record['EmisniSystem'] = "Rizeny_Obd" if rizeny_obd_element is not None else "Rizeny" if rizeny_element is not None else "Nerizeny" if nerizeny_element is not None else None
677+
emise_record['EmisniSystem'] = 'Rizeny_Obd' if rizeny_obd_element is not None else 'Rizeny' if rizeny_element is not None else 'Nerizeny' if nerizeny_element is not None else None
678678
emise_record['Obd_KomunikacniProtokol'] = safe_get(rizeny_obd_element, 'm:komunikacniProtokol', namespaces)
679679
emise_record['Obd_Vin'] = safe_get(rizeny_obd_element, 'm:VIN', namespaces)
680680
emise_record['Obd_PocetDtc'] = safe_get(rizeny_obd_element, 'm:pocetDTC', namespaces) if not None else safe_get(rizeny_element, 'm:pocetDTC', namespaces)
@@ -714,8 +714,6 @@ def parse_mereni(element, namespaces):
714714
def parse_to_parquet(source_dir, file_parser, no_threads, verbosity, delete):
715715
# Vyhledání souborů pro parsování
716716
xml_files = sorted(list(source_dir.glob('*.xml')), key=date_from_file_path)
717-
# if not xml_files:
718-
# raise FileNotFoundError(f'Žádně .xml soubory nebyly nalezeny v {source_dir}.')
719717
if verbosity > Verbosity.QUIET:
720718
print(f'Nalezeno {len(xml_files)} .xml souborů. Spouštím {no_threads} vláken.')
721719

@@ -903,37 +901,33 @@ def parse_measurements_to_parquet(dataset_dir, measurements_subdir, no_threads,
903901

904902
#--------------------------------------------------------------------------------------------------------------
905903

906-
def split_measurements(mereni_dir, diesel_personal_dir, verbosity):
904+
def split_measurements(mereni_dir, diesel_dir, verbosity):
907905
source_files = list(mereni_dir.iterdir())
908906
if verbosity > Verbosity.QUIET:
909907
print(f'Nalezeno {len(source_files)} souborů obsahující data o měření. Zahajuji jejich filtrování')
910908

911-
create_directory(diesel_personal_dir, verbosity)
909+
create_directory(diesel_dir, verbosity)
912910

913911
for file in source_files:
914912
# Přeskočení souboru, pokud už byl zpracován
915-
target_file = diesel_personal_dir / file.name
913+
target_file = diesel_dir / file.name
916914
if skip_file(target_file, verbosity):
917915
continue
918916

919917
df = pl.read_parquet(file, schema=mereni_schema)
920918

921-
j1939_cols = [name for name in mereni_schema.keys() if 'J1939' in name]
922919
obd_zazeh_cols = [name for name in mereni_schema.keys() if 'Obd_Readiness_Zazeh' in name]
923-
# Podmínka pro záznam osobního dieselového vozidla
924-
diesel_personal_cond = [
925-
# Alespoň jedno výústění dieselu bylo změřeno (a žádné vyústění jiného pohonu neměřeno)
926-
pl.col('Benzin_PocetVyusteni').eq('0') & pl.col('Nafta_PocetVyusteni').ne('0') & pl.col('Plyn_PocetVyusteni').eq('0'),
927-
# U diagnostických chybových kódů pro užitková vozidla nebyl proveden pokus o testování
928-
pl.all_horizontal(pl.col(j1939_cols).is_null()),
929-
# U diagnostických chybových kódů pro zážehová vozidla nebyl proveden pokus o testování
930-
pl.all_horizontal(pl.col(obd_zazeh_cols).is_null())
931-
]
920+
obd_vznet_cols = [name for name in mereni_schema.keys() if 'Obd_Readiness_Vznet' in name]
921+
obd_j1939_cols = [name for name in mereni_schema.keys() if 'Obd_Readiness_J1939' in name]
932922

933923
# Sloupce, které nesou význam pro naftová vozidla
934924
diesel_columns = nafta_schema.keys()
935-
936-
df_diesel_personal = df.filter(diesel_personal_cond).select(diesel_columns)
925+
# Vytvoření datasetu pro dieselová vozidla
926+
df_diesel_personal = (df.filter(pl.col('Vozidlo_Palivo').str.to_lowercase().is_in(['nm', 'n']))
927+
.with_columns(pl.any_horizontal(pl.col(obd_j1939_cols).is_not_null()).cast(pl.String).alias('Obd_Readiness_J1939_Pritomno'),
928+
pl.any_horizontal(pl.col(obd_zazeh_cols).is_not_null()).cast(pl.String).alias('Obd_Readiness_Zazeh_Pritomno'))
929+
.select(diesel_columns)
930+
)
937931
df_diesel_personal.write_parquet(target_file)
938932

939933
# Oznámění úspěchu uživateli
@@ -968,20 +962,20 @@ def split_measurements(mereni_dir, diesel_personal_dir, verbosity):
968962
ADR_TYPE_SUBDIR = 'adr_typy'
969963
MEASUREMENTS_ALL_SUBDIR = 'mereni_all'
970964
NO_PARSE_PROCESSES = 4
971-
DIESEL_PERSONAL_SUBDIR = 'nafta_osobni'
965+
DIESEL_SUBDIR = 'nafta_osobni'
972966

973967

974968
explain_verbosity(VERBOSITY)
975969

976-
# print('——————————————————————————————————PROHLÍDKY VOZIDEL STK A SME:——————————————————————————————————\n')
977-
# downloaded_inspection_dates = downloaded_dates([INSPECTIONS_DIR / 'gz', INSPECTIONS_DIR / 'xml', INSPECTIONS_DIR / 'parquet' / INSPECTIONS_SUBDIR])
978-
# download_files(INSPECTIONS_DIR / 'gz', PARENT_DATASET_INSPECTIONS, START_DATE, END_DATE, downloaded_inspection_dates, NO_DOWNLOAD_THREADS, MAX_DOWNLOAD_ATTEMPTS, verbosity=VERBOSITY)
979-
# extract_files(INSPECTIONS_DIR / 'gz', INSPECTIONS_DIR / 'xml', NO_EXTRACT_THREADS, verbosity=VERBOSITY)
980-
# parse_inspections_to_parquet(INSPECTIONS_DIR, INSPECTIONS_SUBDIR, DEFECTS_SUBDIR, ACTIONS_SUBDIR, ADR_TYPE_SUBDIR, NO_PARSE_PROCESSES, VERBOSITY)
981-
982-
# print('\n——————————————————————————————————DATA Z MĚŘÍCÍCH PŘÍSTROJŮ:——————————————————————————————————\n')
983-
# downloaded_measurement_dates = downloaded_dates([MEASUREMENTS_DIR / 'gz', MEASUREMENTS_DIR / 'xml', MEASUREMENTS_DIR / 'parquet' / MEASUREMENTS_ALL_SUBDIR])
984-
# download_files(MEASUREMENTS_DIR / 'gz', PARENT_DATASET_MEASUREMENTS, START_DATE, END_DATE, downloaded_measurement_dates, NO_DOWNLOAD_THREADS, MAX_DOWNLOAD_ATTEMPTS, verbosity=VERBOSITY)
985-
# extract_files(MEASUREMENTS_DIR / 'gz', MEASUREMENTS_DIR / 'xml', NO_EXTRACT_THREADS, verbosity=VERBOSITY)
986-
# parse_measurements_to_parquet(MEASUREMENTS_DIR, MEASUREMENTS_ALL_SUBDIR, NO_PARSE_PROCESSES, VERBOSITY, False)
987-
split_measurements(MEASUREMENTS_DIR / 'parquet' / MEASUREMENTS_ALL_SUBDIR, MEASUREMENTS_DIR / 'parquet' / DIESEL_PERSONAL_SUBDIR, VERBOSITY)
970+
print('——————————————————————————————————PROHLÍDKY VOZIDEL STK A SME:——————————————————————————————————\n')
971+
downloaded_inspection_dates = downloaded_dates([INSPECTIONS_DIR / 'gz', INSPECTIONS_DIR / 'xml', INSPECTIONS_DIR / 'parquet' / INSPECTIONS_SUBDIR])
972+
download_files(INSPECTIONS_DIR / 'gz', PARENT_DATASET_INSPECTIONS, START_DATE, END_DATE, downloaded_inspection_dates, NO_DOWNLOAD_THREADS, MAX_DOWNLOAD_ATTEMPTS, verbosity=VERBOSITY)
973+
extract_files(INSPECTIONS_DIR / 'gz', INSPECTIONS_DIR / 'xml', NO_EXTRACT_THREADS, verbosity=VERBOSITY)
974+
parse_inspections_to_parquet(INSPECTIONS_DIR, INSPECTIONS_SUBDIR, DEFECTS_SUBDIR, ACTIONS_SUBDIR, ADR_TYPE_SUBDIR, NO_PARSE_PROCESSES, VERBOSITY, False)
975+
976+
print('\n——————————————————————————————————DATA Z MĚŘÍCÍCH PŘÍSTROJŮ:——————————————————————————————————\n')
977+
downloaded_measurement_dates = downloaded_dates([MEASUREMENTS_DIR / 'gz', MEASUREMENTS_DIR / 'xml', MEASUREMENTS_DIR / 'parquet' / MEASUREMENTS_ALL_SUBDIR])
978+
download_files(MEASUREMENTS_DIR / 'gz', PARENT_DATASET_MEASUREMENTS, START_DATE, END_DATE, downloaded_measurement_dates, NO_DOWNLOAD_THREADS, MAX_DOWNLOAD_ATTEMPTS, verbosity=VERBOSITY)
979+
extract_files(MEASUREMENTS_DIR / 'gz', MEASUREMENTS_DIR / 'xml', NO_EXTRACT_THREADS, verbosity=VERBOSITY)
980+
parse_measurements_to_parquet(MEASUREMENTS_DIR, MEASUREMENTS_ALL_SUBDIR, NO_PARSE_PROCESSES, VERBOSITY, False)
981+
split_measurements(MEASUREMENTS_DIR / 'parquet' / MEASUREMENTS_ALL_SUBDIR, MEASUREMENTS_DIR / 'parquet' / DIESEL_SUBDIR, VERBOSITY)

kod/schemas.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,4 +528,9 @@
528528
'Nafta_Mereni3_OtackyVolnobezne_Vysledek': pl.String,
529529
'Nafta_Mereni3_Teplota_Hodnota': pl.String,
530530
'Nafta_Mereni3_Teplota_Vysledek': pl.String,
531+
# Pro kontrolu validity dat
532+
'Benzin_PocetVyusteni': pl.String,
533+
'Plyn_PocetVyusteni': pl.String,
534+
'Obd_Readiness_J1939_Pritomno': pl.String,
535+
'Obd_Readiness_Zazeh_Pritomno': pl.String,
531536
}

kod/utils.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def create_directory(dir_name, verbosity):
3131
def delete_path(path, verbosity):
3232
if path.is_dir():
3333
if verbosity > Verbosity.QUIET:
34-
print(f'Mažu: "{path}".')
34+
print(f'\nMažu: "{path}".')
3535
path.rmdir()
3636
else:
3737
if verbosity > Verbosity.NORMAL:
@@ -80,7 +80,7 @@ def cast_mereni(df):
8080
pl.col('Vysledek_TesnostPlynovehoZarizeni').replace_strict(bool_map, return_dtype=pl.Boolean),
8181
pl.col('Vysledek_Vyhovuje').replace_strict(bool_map, return_dtype=pl.Boolean),
8282
pl.col('PristiProhlidka').str.replace(r'T.*', '').cast(pl.Date),
83-
pl.col('EmisniSystem').cast(pl.Enum('Nerizeny', 'Rizeny', 'Rizeny_Obd'))
83+
pl.col('EmisniSystem').cast(pl.Enum(['Nerizeny', 'Rizeny', 'Rizeny_Obd'])),
8484
pl.col('Obd_PocetDtc').cast(pl.Int32),
8585
pl.col('Obd_VzdalenostDtc').cast(pl.Int32),
8686
pl.col('Obd_CasDtc').cast(pl.Int32),
@@ -90,6 +90,22 @@ def cast_mereni(df):
9090
# Skupiny sloupců
9191
pl.col('^.*(RucniZadani|Podporovano|Otestovano)$').replace_strict(bool_map, return_dtype=pl.Boolean),
9292
pl.col('^.*Hodnota$').str.strip_chars().cast(pl.Float32),
93-
pl.col('^.*Vysledek$').exclude('Obd_Readiness_Vysledek').cast(pl.Int8)
93+
pl.col('^.*Vysledek$').exclude('Obd_Readiness_Vysledek').cast(pl.Int8),
94+
pl.col('^.*Pritomno$').replace_strict(bool_map, return_dtype=pl.Boolean),
9495
])
9596

97+
98+
# Konverze času v sekundách na string v přirozeném formátu
99+
def sec_to_hms(x, _):
100+
result = ''
101+
if x <= 0:
102+
x = -x
103+
result = result + '- '
104+
h = int(x // 3600)
105+
m = int((x % 3600) // 60)
106+
s = int(x % 60)
107+
if h > 0:
108+
return result + f"{h}h {m}m"
109+
if m > 0:
110+
return result + f"{m}m {s}s"
111+
return result + f"{s}s"

poznamky/TODO

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
automaticke stazeni a zpracovani stanic stk a sme
22
cast datatype strict false
3-
ukladani v id forme a nasledne prevedeni zpet
3+
; ukladani v id forme a nasledne prevedeni zpet
44
popsat nekonzistence v datech
55
- OBD_Readiness neodpovidajici typu paliva
66
- Prazdne protokoly - ma pohon na jednu vec pro vic veci
7-
dostat rozparsovane do pozadovaneho formatu
7+
; dostat rozparsovane do pozadovaneho formatu
88
pocet mereni u nafty pridat
99
k nafte pridat vozidla, ktera maji nevalidni zaznamy - neuspech
10-
sjednotit vypisi pri spusteni celeho
10+
sjednotit vypisy pri spusteni celeho
11+
feature engineering - delka misto konce - zacatek zda svatek, rocni obdobi, cas dne
12+
lepe oddelit uzitkova vozidla - hodne traktoru
13+
1114

1215
ANALYZOVAT:
1316
zda se v case zlepsuje compliance
@@ -48,12 +51,11 @@ minimalni a maximalni hodnoty jenom nekde - viz notebooklm
4851
slouceny vyusteni - V žádné z větví nesmí být překročeny povolené limity, výsledné hodnoty do protokolu o měření emisí vozidel se uvádějí pro každou z měřených veličin nepříznivější vůči limitu.
4952
ruzne strategie pro slouceni
5053
vycleneny nakladaky s J1939 protokolem (az na vyjimky jako dodavky s motorem homologovanym pro nakaladaky predstavuje spolehlive rozlisovaci kriterium)
51-
vyfiltrovany diesely - prazdne bude potreba pridat
54+
vyfiltrovany diesely - na zaklade reportu n, nm
5255

5356

5457
Metodika rozlišuje 4 hlavní kategorie vozidel podle toho, jak kombinují zdroje energie:
5558
1. Vícepalivová (Bi-fuel): Nejčastější typ (Benzín + LPG/CNG). Má dvě oddělené nádrže a může přepínat paliva. Řízení funguje na principu Master-Slave, kde hlavní (benzínová) jednotka řídí tu plynovou,.
5659
2. Duální vozidla: Specifikum pro diesely s přidaným plynem. Motor běží vždy na naftu (základ) a plyn se pouze přidává do sání. Nelze jet čistě na plyn.
5760
3. Flexifuel: Vozidlo s jednou nádrží na proměnlivou směs paliv (typicky Benzín + Ethanol E85). Řídicí jednotka se sama přizpůsobí aktuálnímu složení.
5861
4. Hybridy (HEV): Spalovací motor + elektromotor. Pro emise je klíčový spalovací motor, který se často musí přepnout do speciálního servisního módu, aby běžel trvale,.
59-
Legislativní špek: Pokud má auto na plyn benzínovou nádrž menší než 15 litrů, papírově se bere jako jednopalivové.

0 commit comments

Comments
 (0)