From f9ac9cbfec27f976ba66f9c5ce6beedec8751100 Mon Sep 17 00:00:00 2001 From: spch-GL Date: Tue, 4 Jun 2024 15:58:14 +0200 Subject: [PATCH 1/5] Ignore trash, tient compte des timezone --- comptages/core/report.py | 106 +++++++++++++++++++++++------------ comptages/core/statistics.py | 103 +++++++++++++++++++++------------- 2 files changed, 135 insertions(+), 74 deletions(-) diff --git a/comptages/core/report.py b/comptages/core/report.py index ce9ca00..76f4415 100644 --- a/comptages/core/report.py +++ b/comptages/core/report.py @@ -11,9 +11,8 @@ from comptages.datamodel import models -def simple_print_callback(progress: int): - if progress > 0: - print(f"Generating report... {progress}%") +def simple_print_callback(progress): + print(f"{datetime.now()}: Generating report... {progress}%") def prepare_reports( @@ -23,24 +22,27 @@ def prepare_reports( template="default", sections_ids: Optional[list[str]] = None, callback_progress=simple_print_callback, + sections_days: Optional[dict[str, list[date]]] = None, ): + print(f"{datetime.now()}: _prepare_reports: begin, folder: {file_path}") current_dir = os.path.dirname(os.path.abspath(__file__)) if template == "default": template_name = "template.xlsx" template_path = os.path.join(current_dir, os.pardir, "report", template_name) assert count - _prepare_default_reports(file_path, count, template_path, callback_progress) + _prepare_default_reports(file_path, count, template_path, callback_progress, sections_days) elif template == "yearly": template_name = "template_yearly.xlsx" template_path = os.path.join(current_dir, os.pardir, "report", template_name) assert year assert sections_ids _prepare_yearly_report( - file_path, year, template_path, sections_ids, callback_progress + file_path, year, template_path, sections_ids, callback_progress, sections_days ) elif template == "yearly_bike": pass + print(f"{datetime.now()}: _prepare_reports: ended, folder: {file_path}") def _prepare_default_reports( @@ -51,23 +53,29 @@ def _prepare_default_reports( sections_days: Optional[dict[str, list[date]]] = None, ): """Write default reports to disk (1 per section in count, per week)""" + print(f"{datetime.now()}: _prepare_default_reports: begin, count: {count}") # We do by section and not by count because of special cases. sections = models.Section.objects.filter( lane__id_installation__count=count ).distinct() assert sections + sections_qty = len(list(sections)) - mondays_qty = len(list(_mondays_of_count(count))) - mondays = _mondays_of_count(count) + mondays = list(_mondays_of_count(count)) assert mondays + mondays_qty = len(mondays) - for section in sections: + for j, section in enumerate(sections): for i, monday in enumerate(mondays): # Filter out date based on parameter if sections_days and monday not in sections_days[section.id]: continue - QgsMessageLog.logMessage("Adding to workbook", "Report", Qgis.Info) - progress = int(100 / mondays_qty * (i - 1)) + output = os.path.join( + file_path, f"{section.id}_{monday.strftime('%Y%m%d')}_r.xlsx" + ) + QgsMessageLog.logMessage(f"{datetime.now()} - Preparing reports: Adding workbook {i+j*mondays_qty} ({output})", "Comptages", Qgis.Info) + progress = int(100 / mondays_qty / sections_qty * (i+j*mondays_qty)) + #print(f" j:{j}, i:{i}, progress:{progress}") callback_progress(progress) workbook = load_workbook(filename=template_path) @@ -76,11 +84,10 @@ def _prepare_default_reports( _data_speed(count, section, monday, workbook) _data_category(count, section, monday, workbook) _remove_useless_sheets(count, workbook) - output = os.path.join( - file_path, "{}_{}_r.xlsx".format(section.id, monday.strftime("%Y%m%d")) - ) workbook.save(filename=output) + + print(f"{datetime.now()}: _prepare_default_reports: ended, count: {count}") def _prepare_yearly_report( @@ -89,13 +96,19 @@ def _prepare_yearly_report( template_path: str, sections_ids: list[str], callback_progress, + sections_days: Optional[dict[str, list[date]]] = None, ): """Write default reports to disk (1 per section included in the count)""" + print(f"{datetime.now()}: _prepare_yearly_report: begin, sections_ids: {sections_ids}") # Get first count to be used as example count_qs = models.Count.objects.filter( - id_installation__lane__id_section=sections_ids[0], start_process_date__year=year + id_installation__lane__id_section=sections_ids[0], start_process_date__year__lte=year, end_process_date__year__gte=year ) if not count_qs.exists(): + info_str = f"{datetime.now()}: Aucun comptage trouvé pour cette section {sections_ids[0]} et cette année {year}" + print(info_str) + QgsMessageLog.logMessage(info_str, "Comptages", Qgis.Warning) + return count = count_qs.first() assert count @@ -118,6 +131,7 @@ def _prepare_yearly_report( output = os.path.join(file_path, f"{section.id}_{year}_r.xlsx") workbook.save(filename=output) + print(f"{datetime.now()}: _prepare_yearly_report: ended, sections_ids: {sections_ids}") def _mondays_of_count(count: models.Count) -> Generator[date, None, None]: """Generator that return the Mondays of the count""" @@ -231,20 +245,6 @@ def _data_count_yearly( def _data_day(count: models.Count, section: models.Section, monday, workbook: Workbook): ws = workbook["Data_day"] - # Total - row_offset = 65 - col_offset = 2 - for i in range(7): - df = statistics.get_time_data( - count, - section, - start=monday + timedelta(days=i), - end=monday + timedelta(days=i + 1), - ) - - for row in df.itertuples(): - ws.cell(row=row_offset + row.hour, column=col_offset + i, value=row.thm) - # Monthly coefficients row_offset = 2 col_offset = 2 @@ -271,6 +271,21 @@ def _data_day(count: models.Count, section: models.Section, monday, workbook: Wo value=monthly_coefficients[day.month - 1], ) + # Total (section) + row_offset = 67 + col_offset = 2 + for i in range(7): + df = statistics.get_time_data( + count, + section, + start=monday + timedelta(days=i), + end=monday + timedelta(days=i + 1), + exclude_trash=True, + ) + + for row in df.itertuples(): + ws.cell(row=row_offset + row.hour, column=col_offset + i, value=row.thm) + # Direction 1 row_offset = 5 col_offset = 2 @@ -281,6 +296,7 @@ def _data_day(count: models.Count, section: models.Section, monday, workbook: Wo start=monday + timedelta(days=i), end=monday + timedelta(days=i + 1), direction=1, + exclude_trash=True, ) for row in df.itertuples(): @@ -296,13 +312,14 @@ def _data_day(count: models.Count, section: models.Section, monday, workbook: Wo start=monday + timedelta(days=i), end=monday + timedelta(days=i + 1), direction=1, + exclude_trash=True, ) ws.cell(row=row_offset, column=col_offset + i, value=light.get(True, 0)) ws.cell(row=row_offset + 1, column=col_offset + i, value=light.get(False, 0)) # Direction 2 if len(section.lane_set.all()) == 2: - row_offset = 35 + row_offset = 36 col_offset = 2 for i in range(7): df = statistics.get_time_data( @@ -311,13 +328,14 @@ def _data_day(count: models.Count, section: models.Section, monday, workbook: Wo start=monday + timedelta(days=i), end=monday + timedelta(days=i + 1), direction=2, + exclude_trash=True, ) for row in df.itertuples(): ws.cell(row=row_offset + row.hour, column=col_offset + i, value=row.thm) # Light heavy direction 2 - row_offset = 60 + row_offset = 61 col_offset = 2 for i in range(7): light = statistics.get_light_numbers( @@ -326,6 +344,7 @@ def _data_day(count: models.Count, section: models.Section, monday, workbook: Wo start=monday + timedelta(days=i), end=monday + timedelta(days=i + 1), direction=2, + exclude_trash=True, ) ws.cell(row=row_offset, column=col_offset + i, value=light.get(True, 0)) ws.cell( @@ -345,6 +364,7 @@ def _data_day_yearly( df = statistics.get_time_data_yearly(year, section) if df is None: + print(f"{datetime.now()}:_data_day_yearly - Pas de données pour cette section {section} et cette année {year} /!\\/!\\/!\\") return for i in range(7): @@ -353,7 +373,7 @@ def _data_day_yearly( ws.cell(row=row_offset + row.hour, column=col_offset + i, value=row.thm) # Light heavy section - row_offset = 96 + row_offset = 95 col_offset = 2 df = statistics.get_light_numbers_yearly( section, start=datetime(year, 1, 1), end=datetime(year + 1, 1, 1) @@ -386,7 +406,7 @@ def _data_day_yearly( ws.cell(row=row_offset + row.hour, column=col_offset + i, value=row.thm) # Light heavy direction 1 - row_offset = 32 + row_offset = 31 col_offset = 2 df = statistics.get_light_numbers_yearly( section, start=datetime(year, 1, 1), end=datetime(year + 1, 1, 1), direction=1 @@ -406,7 +426,7 @@ def _data_day_yearly( # Direction 2 if len(section.lane_set.all()) == 2: - row_offset = 66 + row_offset = 37 col_offset = 2 df = statistics.get_time_data_yearly(year, section, direction=2) @@ -417,7 +437,7 @@ def _data_day_yearly( ws.cell(row=row_offset + row.hour, column=col_offset + i, value=row.thm) # Light heavy direction 2 - row_offset = 92 + row_offset = 63 col_offset = 2 df = statistics.get_light_numbers_yearly( section, @@ -551,6 +571,7 @@ def _data_speed( end=monday + timedelta(days=7), speed_low=range_[0], speed_high=range_[1], + exclude_trash=True, ) for row in res: @@ -568,6 +589,7 @@ def _data_speed( start=monday, end=monday + timedelta(days=7), v=v, + exclude_trash=True, ) for row in df.itertuples(): ws.cell( @@ -579,7 +601,12 @@ def _data_speed( col_offset = 19 df = statistics.get_average_speed_by_hour( - count, section, direction=1, start=monday, end=monday + timedelta(days=7) + count, + section, + direction=1, + start=monday, + end=monday + timedelta(days=7), + exclude_trash=True, ) for row in df.itertuples(): ws.cell(row=row_offset + row.Index, column=col_offset, value=row.speed) @@ -597,6 +624,7 @@ def _data_speed( end=monday + timedelta(days=7), speed_low=range_[0], speed_high=range_[1], + exclude_trash=True, ) for row in res: @@ -614,6 +642,7 @@ def _data_speed( start=monday, end=monday + timedelta(days=7), v=v, + exclude_trash=True, ) for row in df.itertuples(): ws.cell( @@ -627,7 +656,12 @@ def _data_speed( col_offset = 19 df = statistics.get_average_speed_by_hour( - count, section, direction=2, start=monday, end=monday + timedelta(days=7) + count, + section, + direction=2, + start=monday, + end=monday + timedelta(days=7), + exclude_trash=True, ) for row in df.itertuples(): ws.cell(row=row_offset + row.Index, column=col_offset, value=row.speed) diff --git a/comptages/core/statistics.py b/comptages/core/statistics.py index b7fa68e..c4683ba 100644 --- a/comptages/core/statistics.py +++ b/comptages/core/statistics.py @@ -1,7 +1,8 @@ from typing import Any -import pandas as pd +from pandas import DataFrame, cut from functools import reduce from datetime import timedelta, datetime +from pytz import timezone from django.db.models import F, CharField, Value, Q, Sum, QuerySet from django.db.models.functions import ExtractHour, Trunc, Concat @@ -54,25 +55,24 @@ def get_time_data( .annotate(thm=Sum("times")) .values("import_status", "date", "hour", "thm") ) + print(f"statistics.py : get_time_data - qs.query={str(qs.query)}") - df = pd.DataFrame.from_records(qs) + df = DataFrame.from_records(qs) if not df.empty: df["date"] = df["date"].dt.strftime("%a %d.%m.%Y") df["import_status"].replace({0: "Existant", 1: "Nouveau"}, inplace=True) + return df def get_time_data_yearly( year, section: models.Section, lane=None, direction=None -) -> pd.DataFrame: +) -> DataFrame: """Vehicles by hour and day of the week""" start = datetime(year, 1, 1) end = datetime(year + 1, 1, 1) start, end = tuple([utils.to_time_aware_utc(d) for d in (start, end)]) - print("year=", year) - print("section=", section) - # By lane/direction grouped per hour qs = models.CountDetail.objects.filter( @@ -84,15 +84,14 @@ def get_time_data_yearly( if lane is not None: qs = qs.filter(id_lane=lane) - print("lane=", lane) if direction is not None: qs = qs.filter(id_lane__direction=direction) - print("direction=", direction) - print("qs=", qs) - print("qs.count=", qs.count()) + #print("get_time_data_yearly - qs=", qs) + #print("get_time_data_yearly - qs.count=", qs.count()) if not qs.exists(): + print(f"statistics.py : get_time_data_yearly - Nothing found for Year: {year}, Section: {section}, Lane: {lane}, Direction: {direction}.") return None # Vehicles by day and hour @@ -105,16 +104,16 @@ def get_time_data_yearly( .values("import_status", "date", "hour", "thm") ) if not qs.exists(): - print( - f"Year: {year}. Section: {section}. Lane: {lane}. Direction: {direction}. Query: {str(qs.query)}" - ) + print(f"statistics.py : get_time_data_yearly - Nothing found !!! for Year: {year}. Section: {section}. Lane: {lane}. Direction: {direction}. !!!)") - print("qs annot=", qs) - print("qs.count=", qs.count()) + print(f"statistics.py : get_time_data_yearly - qsa.query={str(qs.query)}") + #print("get_time_data_yearly - qsa annot=", qs) + #print("get_time_data_yearly - qsa.count=", qs.count()) - df = pd.DataFrame.from_records(qs) - df = df.groupby([df["date"].dt.dayofweek, "hour"]).thm.sum() - df = df.reset_index() + df = DataFrame.from_records(qs) + if not df.empty: + df = df.groupby([df["date"].dt.dayofweek, "hour"]).thm.sum() + df = df.reset_index() return df @@ -128,7 +127,7 @@ def get_day_data( exclude_trash=False, start=None, end=None, -) -> tuple[pd.DataFrame, int]: +) -> tuple[DataFrame, int]: if not start: start = count.start_process_date if not end: @@ -165,15 +164,15 @@ def get_day_data( .annotate(tj=Sum("times")) .values("date", "tj", "import_status") ) + print(f"statistics.py : get_day_data - qs.query=", str(qs.query)) - df = pd.DataFrame.from_records(qs) - + df = DataFrame.from_records(qs) mean = 0 if not df.empty: mean = df["tj"].mean() df["import_status"].replace({0: "Existant", 1: "Nouveau"}, inplace=True) - return df, int(mean) + return df, mean def get_category_data( @@ -182,7 +181,7 @@ def get_category_data( status=definitions.IMPORT_STATUS_DEFINITIVE, start=None, end=None, -) -> pd.DataFrame: +) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -215,8 +214,9 @@ def get_category_data( .order_by("cat_code") .values("cat_name", "cat_code", "cat_name_code", "value") ) + print(f"statistics.py : get_category_data - qs.query={str(qs.query)}") - df = pd.DataFrame.from_records(qs) + df = DataFrame.from_records(qs) return df @@ -226,7 +226,7 @@ def get_speed_data( exclude_trash=False, start=None, end=None, -) -> pd.DataFrame: +) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -243,16 +243,17 @@ def get_speed_data( if exclude_trash: qs = qs.exclude(id_category__trash=True) + + print(f"statistics.py : get_speed_data - qs.query={str(qs.query)}") - df = pd.DataFrame.from_records(qs.values("speed", "times", "import_status")) - + df = DataFrame.from_records(qs.values("speed", "times", "import_status")) if df.empty: return df df = df.groupby( [ "import_status", - pd.cut( + cut( df["speed"], bins=[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 999], labels=[ @@ -290,6 +291,7 @@ def get_light_numbers( direction=None, start=None, end=None, + exclude_trash=False, ) -> dict: if not start: start = count.start_process_date @@ -305,6 +307,9 @@ def get_light_numbers( timestamp__lt=end, ) + if exclude_trash: + qs = qs.exclude(id_category__trash=True) + if lane is not None: qs = qs.filter(id_lane=lane) @@ -316,6 +321,7 @@ def get_light_numbers( .annotate(value=Sum("times")) .values_list("id_category__light", "value") ) + print(f"statistics.py : get_light_numbers - qs.query={str(qs.query)}") res = {} for r in qs: @@ -325,7 +331,7 @@ def get_light_numbers( def get_light_numbers_yearly( section: models.Section, lane=None, direction=None, start=None, end=None -) -> pd.DataFrame: +) -> DataFrame: qs = models.CountDetail.objects.filter( id_lane__id_section=section, id_category__isnull=False, @@ -341,8 +347,9 @@ def get_light_numbers_yearly( qs = qs.annotate(date=Trunc("timestamp", "day")) qs = qs.values("date", "id_category__light").annotate(value=Sum("times")) + print(f"statistics.py : get_light_numbers_yearly - qs.query={str(qs.query)}") - df = pd.DataFrame.from_records(qs) + df = DataFrame.from_records(qs) df = df.groupby([df["date"].dt.dayofweek, "id_category__light"]).value.sum() return df.reset_index() @@ -357,6 +364,7 @@ def get_speed_data_by_hour( end=None, speed_low=0, speed_high=15, + exclude_trash=False, ) -> "ValuesQuerySet[models.CountDetail, Any]": if not start: start = count.start_process_date @@ -372,6 +380,9 @@ def get_speed_data_by_hour( timestamp__lt=end, ) + if exclude_trash: + qs = qs.exclude(id_category__trash=True) + if count is not None: qs = qs.filter(id_count=count) @@ -388,6 +399,7 @@ def get_speed_data_by_hour( .values("hour", "value") .values_list("hour", "value") ) + print(f"statistics.py : get_speed_data_by_hour - qs.query={str(qs.query)}") return qs @@ -400,7 +412,8 @@ def get_characteristic_speed_by_hour( start=None, end=None, v=0.15, -) -> pd.DataFrame: + exclude_trash=False, +) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -414,6 +427,9 @@ def get_characteristic_speed_by_hour( timestamp__lt=end, ) + if exclude_trash: + qs = qs.exclude(id_category__trash=True) + if count is not None: qs = qs.filter(id_count=count) @@ -428,8 +444,9 @@ def get_characteristic_speed_by_hour( .order_by("hour", "speed") .values("hour", "speed") ) + print(f"statistics.py : get_characteristic_speed_by_hour - qs.query={str(qs.query)}") - df = pd.DataFrame.from_records(qs.values("hour", "speed")) + df = DataFrame.from_records(qs.values("hour", "speed")) if not df.empty: df = df.set_index("hour") df = df.groupby("hour").quantile(v, interpolation="lower") @@ -444,7 +461,8 @@ def get_average_speed_by_hour( start=None, end=None, v=0.15, -) -> pd.DataFrame: + exclude_trash=False, +) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -472,8 +490,9 @@ def get_average_speed_by_hour( .order_by("hour", "speed") .values("hour", "speed") ) + print(f"statistics.py : get_average_speed_by_hour - qs.query={str(qs.query)}") - df = pd.DataFrame.from_records(qs.values("hour", "speed")) + df = DataFrame.from_records(qs.values("hour", "speed")) if not df.empty: df = df.set_index("hour") df = df.groupby("hour").mean("speed") @@ -519,6 +538,7 @@ def get_category_data_by_hour( .values("hour", "value") .values_list("hour", "value") ) + print(f"statistics.py : get_category_data_by_hour - qs.query={str(qs.query)}") return qs @@ -528,10 +548,12 @@ def get_special_periods(first_day, last_day) -> QuerySet[models.SpecialPeriod]: Q((Q(start_date__lte=first_day) & Q(end_date__gte=last_day))) | (Q(start_date__lte=last_day) & Q(end_date__gte=first_day)) ) + print(f"statistics.py : get_special_periods - qs.query={str(qs.query)}") + return qs -def get_month_data(section: models.Section, start, end, direction=None) -> pd.DataFrame: +def get_month_data(section: models.Section, start, end, direction=None) -> DataFrame: qs = models.CountDetail.objects.filter( id_lane__id_section=section, timestamp__gte=start, timestamp__lt=end ) @@ -543,10 +565,13 @@ def get_month_data(section: models.Section, start, end, direction=None) -> pd.Da .annotate(tm=Sum("times")) .values("month", "tm", "import_status") ) + if direction is not None: qs = qs.filter(id_lane__direction=direction) - df = pd.DataFrame.from_records(qs) + print(f"statistics.py : get_month_data - qs.query={str(qs.query)}") + + df = DataFrame.from_records(qs) return df @@ -556,8 +581,9 @@ def get_valid_days(year: int, section: models.Section) -> int: where a day is deemed valid just in case there are at least 14 1-hour blocks between 6pm and 4pm with at least 1 vehicle. """ - start = datetime(year, 1, 1) - end = datetime(year + 1, 1, 1) + tz = timezone("Europe/Zurich") + start = tz.localize(datetime(year, 1, 1)) + end = tz.localize(datetime(year + 1, 1, 1)) iterator = ( models.CountDetail.objects.filter( id_lane__id_section=section, @@ -571,6 +597,7 @@ def get_valid_days(year: int, section: models.Section) -> int: .order_by("date") .values("date", "hour", "tj") ) + print(f"statistics.py : get_valid_days - iterator.query={str(iterator.query)}") def count_valid_blocks(acc: dict, item: dict) -> dict[str, int]: date = item["date"] From 5eb92846743e7e56f8dbf33b53510520d92a5b2d Mon Sep 17 00:00:00 2001 From: spch-GL Date: Tue, 4 Jun 2024 16:06:05 +0200 Subject: [PATCH 2/5] exclude trash 2, correction template --- comptages/core/report.py | 96 +++++++++++--- comptages/core/statistics.py | 182 +++++++++++++++----------- comptages/report/template_yearly.xlsx | Bin 185389 -> 187466 bytes 3 files changed, 184 insertions(+), 94 deletions(-) diff --git a/comptages/core/report.py b/comptages/core/report.py index 76f4415..e80be55 100644 --- a/comptages/core/report.py +++ b/comptages/core/report.py @@ -242,7 +242,12 @@ def _data_count_yearly( ws["B14"] = lanes[1].direction_desc -def _data_day(count: models.Count, section: models.Section, monday, workbook: Workbook): +def _data_day( + count: models.Count, + section: models.Section, + monday, + workbook: Workbook + ): ws = workbook["Data_day"] # Monthly coefficients @@ -353,15 +358,22 @@ def _data_day(count: models.Count, section: models.Section, monday, workbook: Wo def _data_day_yearly( - count: models.Count, section: models.Section, year: int, workbook: Workbook -): + count: models.Count, + section: models.Section, + year: int, + workbook: Workbook + ): ws = workbook["Data_day"] # Total (section) row_offset = 69 col_offset = 2 - df = statistics.get_time_data_yearly(year, section) + df = statistics.get_time_data_yearly( + year, + section, + exclude_trash=True, + ) if df is None: print(f"{datetime.now()}:_data_day_yearly - Pas de données pour cette section {section} et cette année {year} /!\\/!\\/!\\") @@ -376,7 +388,10 @@ def _data_day_yearly( row_offset = 95 col_offset = 2 df = statistics.get_light_numbers_yearly( - section, start=datetime(year, 1, 1), end=datetime(year + 1, 1, 1) + section, + start=datetime(year, 1, 1), + end=datetime(year + 1, 1, 1), + exclude_trash=True, ) for i in range(7): @@ -395,9 +410,15 @@ def _data_day_yearly( row_offset = 5 col_offset = 2 - df = statistics.get_time_data_yearly(year, section, direction=1) + df = statistics.get_time_data_yearly( + year, + section, + direction=1, + exclude_trash=True, + ) if df is None: + print(f"{datetime.now()}:_data_day_yearly - Pas de données pour cette section:{section}, cette direction:{direction} et cette année:{year} /!\\/!\\/!\\") return for i in range(7): @@ -409,7 +430,11 @@ def _data_day_yearly( row_offset = 31 col_offset = 2 df = statistics.get_light_numbers_yearly( - section, start=datetime(year, 1, 1), end=datetime(year + 1, 1, 1), direction=1 + section, + start=datetime(year, 1, 1), + end=datetime(year + 1, 1, 1), + direction=1, + exclude_trash=True, ) for i in range(7): @@ -429,7 +454,12 @@ def _data_day_yearly( row_offset = 37 col_offset = 2 - df = statistics.get_time_data_yearly(year, section, direction=2) + df = statistics.get_time_data_yearly( + year, + section, + direction=2, + exclude_trash=True, + ) for i in range(7): day_df = df[df["date"] == i] @@ -444,6 +474,7 @@ def _data_day_yearly( start=datetime(year, 1, 1), end=datetime(year + 1, 1, 1), direction=2, + exclude_trash=True, ) for i in range(7): @@ -467,7 +498,12 @@ def _data_month_yearly( end = datetime(year + 1, 1, 1) # Section - df = statistics.get_month_data(section, start, end) + df = statistics.get_month_data( + section, + start, + end, + exclude_trash=True, + ) row_offset = 14 col_offset = 2 @@ -476,7 +512,13 @@ def _data_month_yearly( ws.cell(row=row_offset, column=col_offset + col.Index, value=col.tm) # Direction 1 - df = statistics.get_month_data(section, start, end, direction=1) + df = statistics.get_month_data( + section, + start, + end, + direction=1, + exclude_trash=True, + ) row_offset = 4 col_offset = 2 @@ -485,7 +527,13 @@ def _data_month_yearly( ws.cell(row=row_offset, column=col_offset + col.Index, value=col.tm) # Direction 2 - df = statistics.get_month_data(section, start, end, direction=2) + df = statistics.get_month_data( + section, + start, + end, + direction=2, + exclude_trash=True, + ) row_offset = 9 col_offset = 2 @@ -720,6 +768,7 @@ def _data_speed_yearly( end=end, speed_low=range_[0], speed_high=range_[1], + exclude_trash=True, ) for row in res: @@ -731,7 +780,13 @@ def _data_speed_yearly( col_offset = 16 for i, v in enumerate(characteristic_speeds): df = statistics.get_characteristic_speed_by_hour( - None, section, direction=1, start=start, end=end, v=v + None, + section, + direction=1, + start=start, + end=end, + v=v, + exclude_trash=True, ) for row in df.itertuples(): ws.cell( @@ -743,11 +798,12 @@ def _data_speed_yearly( col_offset = 19 df = statistics.get_average_speed_by_hour( - count, + None, section, direction=1, start=start, end=end, + exclude_trash=True, ) for row in df.itertuples(): ws.cell(row=row_offset + row.Index, column=col_offset, value=row.speed) @@ -758,13 +814,14 @@ def _data_speed_yearly( col_offset = 2 for i, range_ in enumerate(speed_ranges): res = statistics.get_speed_data_by_hour( - count, + None, section, direction=2, start=start, end=end, speed_low=range_[0], speed_high=range_[1], + exclude_trash=True, ) for row in res: @@ -776,7 +833,13 @@ def _data_speed_yearly( col_offset = 16 for i, v in enumerate(characteristic_speeds): df = statistics.get_characteristic_speed_by_hour( - count, section, direction=2, start=start, end=end, v=v + None, + section, + direction=2, + start=start, + end=end, + v=v, + exclude_trash=True, ) for row in df.itertuples(): ws.cell( @@ -790,11 +853,12 @@ def _data_speed_yearly( col_offset = 19 df = statistics.get_average_speed_by_hour( - count, + None, section, direction=2, start=start, end=end, + exclude_trash=True, ) for row in df.itertuples(): ws.cell(row=row_offset + row.Index, column=col_offset, value=row.speed) diff --git a/comptages/core/statistics.py b/comptages/core/statistics.py index c4683ba..2898f80 100644 --- a/comptages/core/statistics.py +++ b/comptages/core/statistics.py @@ -13,14 +13,14 @@ def get_time_data( - count, - section, - lane=None, - direction=None, - start=None, - end=None, - exclude_trash=False, -): + count, + section, + lane=None, + direction=None, + start=None, + end=None, + exclude_trash=False, + ): if not start: start = count.start_process_date if not end: @@ -66,8 +66,12 @@ def get_time_data( def get_time_data_yearly( - year, section: models.Section, lane=None, direction=None -) -> DataFrame: + year, + section: models.Section, + lane=None, + direction=None, + exclude_trash=False, + ) -> DataFrame: """Vehicles by hour and day of the week""" start = datetime(year, 1, 1) end = datetime(year + 1, 1, 1) @@ -82,6 +86,9 @@ def get_time_data_yearly( timestamp__lt=end, ) + if exclude_trash: + qs = qs.exclude(id_category__trash=True) + if lane is not None: qs = qs.filter(id_lane=lane) @@ -119,15 +126,15 @@ def get_time_data_yearly( def get_day_data( - count: models.Count, - section=None, - lane=None, - direction=None, - status=None, - exclude_trash=False, - start=None, - end=None, -) -> tuple[DataFrame, int]: + count: models.Count, + section=None, + lane=None, + direction=None, + status=None, + exclude_trash=False, + start=None, + end=None, + ) -> tuple[DataFrame, int]: if not start: start = count.start_process_date if not end: @@ -176,12 +183,12 @@ def get_day_data( def get_category_data( - count: models.Count, - section: models.Section, - status=definitions.IMPORT_STATUS_DEFINITIVE, - start=None, - end=None, -) -> DataFrame: + count: models.Count, + section: models.Section, + status=definitions.IMPORT_STATUS_DEFINITIVE, + start=None, + end=None, + ) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -221,12 +228,12 @@ def get_category_data( def get_speed_data( - count: models.Count, - section: models.Section, - exclude_trash=False, - start=None, - end=None, -) -> DataFrame: + count: models.Count, + section: models.Section, + exclude_trash=False, + start=None, + end=None, + ) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -285,14 +292,14 @@ def get_speed_data( def get_light_numbers( - count: models.Count, - section: models.Section, - lane=None, - direction=None, - start=None, - end=None, - exclude_trash=False, -) -> dict: + count: models.Count, + section: models.Section, + lane=None, + direction=None, + start=None, + end=None, + exclude_trash=False, + ) -> dict: if not start: start = count.start_process_date if not end: @@ -330,8 +337,13 @@ def get_light_numbers( def get_light_numbers_yearly( - section: models.Section, lane=None, direction=None, start=None, end=None -) -> DataFrame: + section: models.Section, + lane=None, + direction=None, + start=None, + end=None, + exclude_trash=False, + ) -> DataFrame: qs = models.CountDetail.objects.filter( id_lane__id_section=section, id_category__isnull=False, @@ -339,6 +351,9 @@ def get_light_numbers_yearly( timestamp__lt=end, ) + if exclude_trash: + qs = qs.exclude(id_category__trash=True) + if lane is not None: qs = qs.filter(id_lane=lane) @@ -356,16 +371,16 @@ def get_light_numbers_yearly( def get_speed_data_by_hour( - count: models.Count, - section: models.Section, - lane=None, - direction=None, - start=None, - end=None, - speed_low=0, - speed_high=15, - exclude_trash=False, -) -> "ValuesQuerySet[models.CountDetail, Any]": + count: models.Count, + section: models.Section, + lane=None, + direction=None, + start=None, + end=None, + speed_low=0, + speed_high=15, + exclude_trash=False, + ) -> "ValuesQuerySet[models.CountDetail, Any]": if not start: start = count.start_process_date if not end: @@ -405,15 +420,15 @@ def get_speed_data_by_hour( def get_characteristic_speed_by_hour( - count: models.Count, - section: models.Section, - lane=None, - direction=None, - start=None, - end=None, - v=0.15, - exclude_trash=False, -) -> DataFrame: + count: models.Count, + section: models.Section, + lane=None, + direction=None, + start=None, + end=None, + v=0.15, + exclude_trash=False, + ) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -454,15 +469,15 @@ def get_characteristic_speed_by_hour( def get_average_speed_by_hour( - count: models.Count, - section: models.Section, - lane=None, - direction=None, - start=None, - end=None, - v=0.15, - exclude_trash=False, -) -> DataFrame: + count: models.Count, + section: models.Section, + lane=None, + direction=None, + start=None, + end=None, + v=0.15, + exclude_trash=False, + ) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -476,6 +491,9 @@ def get_average_speed_by_hour( timestamp__lt=end, ) + if exclude_trash: + qs = qs.exclude(id_category__trash=True) + if count is not None: qs = qs.filter(id_count=count) @@ -501,14 +519,14 @@ def get_average_speed_by_hour( def get_category_data_by_hour( - count: models.Count, - section: models.Section, - category, - lane=None, - direction=None, - start=None, - end=None, -) -> "ValuesQuerySet[models.CountDetail, Any]": + count: models.Count, + section: models.Section, + category, + lane=None, + direction=None, + start=None, + end=None, + ) -> "ValuesQuerySet[models.CountDetail, Any]": if not start: start = count.start_process_date if not end: @@ -553,7 +571,12 @@ def get_special_periods(first_day, last_day) -> QuerySet[models.SpecialPeriod]: return qs -def get_month_data(section: models.Section, start, end, direction=None) -> DataFrame: +def get_month_data( + section: models.Section, + start, end, + direction=None, + exclude_trash=False, + ) -> DataFrame: qs = models.CountDetail.objects.filter( id_lane__id_section=section, timestamp__gte=start, timestamp__lt=end ) @@ -566,6 +589,9 @@ def get_month_data(section: models.Section, start, end, direction=None) -> DataF .values("month", "tm", "import_status") ) + if exclude_trash: + qs = qs.exclude(id_category__trash=True) + if direction is not None: qs = qs.filter(id_lane__direction=direction) diff --git a/comptages/report/template_yearly.xlsx b/comptages/report/template_yearly.xlsx index 4cd05b44c799e10c7b7715bee1c6b8677006cbeb..8de2ff9dee84ff033015063a5b9ae8f21a641523 100644 GIT binary patch delta 130215 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 z zwK+%jqpdt6^eoK=B2@|OmW~RBPVl?fsV?1S)s@1W-hEWE|M-QWQe@`xRmm&8JpFX| zp6fiAia}@9(ShvIfg5$$-H*1*RFt|!Z{QV6)xJdR=Y=mdJxL9Q!$z1D2I55j%I({D zb)G!1DG^)H&B)f;Gaskq(9A!InXPtQs4fwfl;Tg3ifjxnkAVUhM^ic|RL?V|rt}z9 z23O`2X0gX>y~bJ`9)yP2)g1oSB3g$Q1&|%1b&|)T<%H z@}KSwPU3Ib8-3nd=pVhyVx+Z4nb4!&6lTf8i4V%#9$}h_R>JHNW>E{35}w+uBSs1v z5bpY(*DsovwW`M)P5Vm^w44y|8kz-JA;W}5mnQISz}x2mL6!&zPUjOB_pT;`RHqk2 z>^6~Uk)r37qE?AZfx=kk-S(g~`be7KJ0i^XIn}_5DH=&9nL~NO`z3?st7gL0|HAcuY z3)(P1DgNM?G`pAz5L0yj`GXR_unBdcJf&PM^hfZ4J@-q$Lt&CI74&*k$|~>bff41| zbka8y4u2_NPLYu;A-1;i4R7EAP$Hr4AAyzb^JY#sF7W%EY;ZW?kKksh=tWqkQ zJ9(p5Z&Kys`=Mv)tII%-T6&G4iB(8-gU7?fRkU}<9kO_B(hS8D)bun19V(Vdm8WU=cN;9N%7DU?J2yW}z*nP=r!Fqepv2 zX6(aoM#KY?s)6Mh^$p~Jx-Y&^|I*=T@Ax;9hOaDOcFTz}L(JHSra8q|u3dPQ50_n0 zaFQXjnpX2}=5tjdZx~E{80>G?K;=sG6ebL)T=~}ur`ZjFRszy|`Wp%!rlzUH_E$x= zYlDeJ1#yE9d-850eZ?VnuVM9Tim>L8Cly88ohey+4^^TFwgzVy@c83SJo3W3~*qd%}^l;^cN0R zL>I*zIvY7EZ;sgnqQmC+LTmG?ags@{!;k9NQIDk@BY? z;nAS|<%0#Am(dTd+Sr@5#fnCiYvWj-9mvs)4;uBaR@=xIpC9A_l9!=hqE9Ivu&RHF zK4sia)HREbeaHEJUUa{6B_<^qJ%M&$j8*xwd*1?8&ch_JGv`-Q{3j^=z9 zekOF`85_{TjT-gGod0S;>u2A>A&5DceQ!bB7Rhrl2Qt~x;k=xxGVpldeCg>&sJ#2J zwz0^f-jLRyqiN*;*O0Vgkmm4cz{U@Bc|0`a;lf0q^F$e3k0f_971o4|ae~sA?ey(0}%2~X4u^p#p;W}&0cuAtH zj4qy4h}FhL&vz5p?0JaS7(rGQl>Iztxoyvt5$Fw&4c^Ynx!j(a*1u_ajvHxZAIhiaiJ=%)3gAeH#5 z4YjIx)n6!4v-Gb*?C<`H)s`*FI=BL-asE1X$x3L+cES1gPyw2?jSw0{pj;M1u?UBs+(2jl0W02;lo0}l8d24EXCijH1;1BD zS2(XRNHuBQN6?KV7_}}4S1aY%Jx4myuX$}-u1%%2dIi0RJj2N$PiLm)E^f0=e}#QK z&Wu<>Q}-XZV8yCTXoDt^`S#XsP}J`eirCb9;j~KRRfitrg5NtjFjm6zeR$p-kr7x` z$U;C67B8_u7_#NAB@xLFjFb41C|aC}+6&fK{eg@eVl{DXqPgWK)jy`9i$*n?6WV%J ziu22N>jhSnva(<d`yT!v1l8go>dM41yz3y*Z(2R8*;<~T0-*lpz>OgYs zT7o^-8t=t>#}`JyD8&I3`z%W#ub_mcZ#H;+rF8EKXLrvZ=zuX5fjVunD9=;Q&;)(` z-f!sm%e!&zUsYy$c&Dr2WXSUh+->Xy(LTlpWZz%$6_fh9$(w~tv!R;A9u%~r?rlU> z)V?0jDYGsi-U4n0(2}K4k8HWv4gn($X^hyx0;R}H#83-{J?9UmfmxGpYp8lZ$-xBV z6}S=q+ML91@d2u8WF4%1<6+7RL|%VmXSY}TY?u2pa$h9YZK6hpr5F?HGOI!dEjjC~ zO}TYv5n@QlC`}lvb@6a-L<1M&wY;pcD%CRbjOQ1H+OBZdF9vKRSwDy4oH9b|boBPI z={uxg_Kv^A*PWXVg=53HtkZlH}%rD zx9=XTtEF84Zm_Q`HeSu)pY&2-R;}wot(yDWcQ1r7>rcSu>0^gnp6-7SU2G!s2jA4s zMgpxvPmfI$t`3*&a<>pzztX?{j69+KaD}*&rT(^)G!S%met2{tHW#IJg?t#mxjAmr zS}$krk}q3_ivspbGfJl9KG;s(GZRWD#(0tc5!CE3p z$oP}N6mPK6cs&S2w>( zRwlvu0p0X!JPcvP172yHN!s&u>jVMnnaJFrCUGv^M2pKimX%L9sYbCjEA(E0sfyS< z=SFZ(xfrn*U6CzyCp#-Da|ve%H(EY5Qq& z_w4RCPY#Z$F_+pbSz_Dye49{r(ztG6C+4`_m#&Kif>tVl3N|D0DZZ?orf$KlwAid{ z;GL$mJ(jmdd4eQcl5g}9J6Mbx@C%GF?QBWF`uW%m?c~tRTm;GJr+DA?cR+d4#gBiP0x>RA8599@zsS>!&N}Z zW1Q=8(>i9q8SeleCo1!Ls#4dK)sGQ9y=t0hvtli=Z4OhNxLR#GU47V?v+0tk)@z2J zJ!NaL@j#mDJ@(xm1Il>&2J$Z$5t$KatfuyR4HFJ;M@*VL5ZMLXutCo;y0<5MpGxHW zBu$XAO9$tRuDn>1>Ri0Z&Mr`6&4BQb6B7RWkyj%i`*Y)p-%=R1c&Ag8_tUOnjii6= zNL5Iqbd<;9v6pslDt=N!=&bxzJdU+msxk0b5gz-?2C1RF23Xdkw3>RNOkNQldMC4f zcYrd?nw)Js+-gz|mjJC=ga4DEX8#<5xkeBQ&Kr zu4&@|Bzq1N^T6OfjYitI4CM8Z4+~!J{*!R=L3EOtTJZ_*e0jCje6v+E?aI}LZ2jrB zIu_3dlMFpw=U*_39uG5f@=0`=sF{nBsY)$jb6>z8YuJ$CM0b3DAw1kw7o1d0*<9io zyc=nY@$wcN@=WQ$T}5T@mYV+|43lAx`WQ@3^jL^_QV%fL?Jnx%FOg$WyH2c=|N3Op z$u|ROZZV6MGlvytBSI=YTgDy0?h%IX#BRpx)2kLzP5~St>6o$olqbdg$2|Y)N_cuaB4KiEqkJxR{goi z=$8V0qAby(?8ULo=fdKKA^Sh>eI>~0R)C}GPK5yCF$FUS;El^xCl;a+7dR8qIvm8Y zJ;o4!ighe8tbgP95R4s?#sF?-*H5OsdyypBG4yqh~8Xt z=Y?R`Lh_VwbivLX@#}$p{?6NAx_2YDsboZmi=&Uw=7G z)@SHqa;`}hxaGO$Th*@40k@a?sB<=&gMghPAp`w z!VjSE?|eI?z#NulFy{aLvyA_DW2&%84@!wlhVGOpMAGd^2Yp*6`lOSjhbIeVNJ)dt->e6C>EvJ@>m1Pt#3h-isMpTFlaUkh(^6=WZ*!+bnn_?s%6(3 zrxMai=ydDCK;QxmmOSR~ZCg148p|WPWAv2~B^tC8tmC;wKy>wQP%ljCR^s1{AAxV9 zYjw{AxfMZudO&?D8p10Z@~azY{5uP}*De~u4$VhFuX5DB?rH-NY&YIsJ7FZ|%3;N; z{TNlh*TRAgRosUZWi0Uc+G9+KCQ63!UX#3Sj1v>Ob8XrUE?{)63JpFRC3LB_lA|`~ z9J+U{ZFEf#ReN<21W*>C=*C*MwXYP`-~ic9%b*o-#J?n<`+-E zhoxK^2Cw4P8t?oo9W%njoQC!^KHUQJr`6L~yCLOFn5sHHZWblhr^*pnU#4CQ$X8F1 zkn|`nX=02|2%r~O8mpaoEIa(NvMPyL{#j{}{67C(w=g3iC&PVe4IKhop1YD;g@TTH(!Td zI|ZT$zMGPhjR?{p`H&5~3)bSvrwX~DX)N&j9!{!yY6dH=4M{J>l6Qie?5OX?xEmqe z#E_Zf_?}!lNmdGkOE*kJzMMQx8}K#}UFaiPSK?`4k(?0hNW#}4E_&@YuWQczihbC! zx-ad~J@do4J+VJzR!`q4*!DZJIfgZn%722H@V^yMW&lIU1}Gu;zH9p>7<~mGk)WyUvXE!g5rYZY@w%du9+;b*D}#D@v$ zjn>8kwV#?8igSQX)SKax zY|}iG4_;|`9lw|y=(NnThCY=~HkPVtW`$`?`ogy!Wu<2!NPj4xdS*a2SO7{;w`GxM zSPmfUg+MUVb2jR@Ovq0BkyEh_87U@Iem#Xw_HILSc8->+gP`$t-j;W-ZKM?ufJAH- z_YV#f&v`o6yY@T-!&3#&@M{9f!95QzX|JCV%=A~9-o5BW7eA`;b1tJnH%8c{Jp%Xt zx{e2A)92hxOCz1N|H7I5lJ|+v7B#kOM+p_0%%{Ujs|*cAw$M(um3%g8YGJ=q7`%Yf z;NzlW8S^=(AvH)m=r=q4$qAI6aX4qul+r5Ev38s=zxEWq$r&5}2@*gr?VC*O+MGzF zi>ANMS{#`AjVG_&zHT09aj;5?=Efl8o1gX(!Kor$ zE&P`5+m$t62=X}O>1Wn7i_y|hj@bZ2iYaSfiPg%!a>&z4QefVMk;a!ylyn%3-UoLu z8`aW~v)_WD#gj~vbdXrP|H5f_)uOmW%vTF3VE4|QE+lio!9KV@iYKwDgmC(xQQgI8 z5({11H5vtV&1N#b_2k)v?cHIau7qVD@W@W4;L}`IQBO zYSU2!*9h>hD2KjNO}`byd^9y3TOC2UC0>m_Xru`+9vfKZRQzyCRe|^$Bu^-pSql!; zNAo${Z2K}&O{mpJ(>dI%`=fwg8H#Ml11RI&*=gLpD&R3>58!aGPWs8E2s-r}bn-Dg zi6Gnh{gXu{7I2{2*p9|l*R|A?%-Z<{Yh`(tXrGu|9(cvANVrahd>$r;i{Fn8Td5+u zvQns3k2NuWKI@lw$|~O&uC@K%CB8dM5!Y$Ir~e4};rx7vnwK9T zR4Dr%0&a+0QhAHB8V>_z0+K@!K|2m}V^X4;XuFN?Y!g~AY3J`c>D7= zzxB^P#?RtjG-^3?;^nKYB@d&EP|Xakm=8!ou?IH;=PGkZg3(}DQIlfd%W#`H24aW? ze|eKGyv@cx(CiM7=n;%}@1@fDnislWS-De(6X?x`DlGEWNX60U4+@Y>oZYJ*ozuTXJD5D% zDM}`NAKtN)Jr2uD%}L2+6rDJHdk_fvFk}eVLY&1^(Rx`K#e=-M;sBg$hJ91f!T0Iq z@vHFK?tO)U1YlqZ6EAnQ)!z@8UxClXULKP{$S%d=ov;EMyazQj#(CQ*+L)9Q+%cE1 zqda@!ia^`L*f-@$7n;x}%~+<*M)Gwgky``B|k@@=Jzp7Sy{eDBI3O!eX@cjQ8qVzvxtDipIrJmuUw1vfTdBo^plm- znfH(vYi;Xm{RsyruCcER$^;K16V9>x4`kFcyxK=)`1t7S;~pn5k*cE+?&+*Lj3})! z-V#^89Tzv(tJODSIL@~AM=WCLPc48uSIEY@Uj?MOW7rBt>yIU_!vQ^GEwtEF2N$)* zbytNSgfy3{KgLU}vY^1r{-3)q*Gos{2MTjN#cnBuQ*zadl02Fue&j+~H ze2pN)OJQ*H*LaWj<*TZEY$FZ3^nC5oUO1k{P|eivm;T$;i>qtWIWy7nap;EmSqH@> z@uN9Y3vRCTBCBm0nDl5ERhMi!ArM3a)t|wz8HZqrc&mSdVKWb55rJ1jg25$|L4NF} zLFP9w2?md0cn99!Etp1b2S7v>de@-KV-dH~z#ncl+^A~%;iwI5#<%<+e zH#!u59&}c4C+x1Vd_lT4uOwOzW=seLmEm@A-oR!^=R<&MNGHFRJOWs^A;udbQUp5@ z@L0JsVt}}e0*s0Etu&hGNBU5~hrDYLp|&$+VR=`@7K;?EGKwF^t+^D4&jWlgIR#^? zdaH^CcADG+)1Rc?3kH`&2KKR^hM1qkBp3{ZSrReIj~I@h9Agb+7sXc-!uoy}RTMSH zqv`A(gCxeE5SEV7w6~`sK#Y8TRAqWd(*q>UMMPnyjISfbl912CVAq)=BaaBr!{AUE zWcib#Tm?IYhf$HqO}-^Dz!{=+O40Pr!06{eXTx;|?TL6BrPsbTEZB&~^HxGqPL)Is zvLr@d4(OqP01xZ?uok&fcNyf`%{Rfwdmhvd@&71$>wu`5!0+1_cS}loYso@cX{M^WNV%zkBXKn?28d_R7y%&sxvk%v=ba zMLoz&BdfHJ-09Qa$Hk*%DE@(vLv_1<<3bb%`$p;S6XKOg=1pxF&bpCEnl5nZ$9+kzKGyDt6e#%}J5u8!#KB2(!5w;h{b-sKge{sbrJ%QE2T zAVw-y(&H&bzuu#t#Y02#?en91LzAGd!+^7ayBC8LB4*)~B$cRG$&H5!vFIbCe*>-O zq&YvsxdZ6YBaAkSX3DFl6JlH6>H`)We;R-|jUK~CqYGR<7CpR~ed`tOq|jld8T4(Tx)_B^v4$+kRml^8!ixM6Sk>OP&VQ?O+Rzk%9v>Y6*pD zBu^830+>r05A`%kS_uJ6vfUOftArp;RfnofGel2C`3A~P%EQO(fi)vP~ zb#IFRF7Pv;L2(~4Dwh3pyKdq+a1j;Y77>Ow5Sj#^NZ5rl z-~!2OY-JkcLe#KqcXtTioBhq~W~{C3?WA(kCO_TnDNH;a{mKJkKa>5f;8^xloR3P0$OAD}B>yZcU{M%cz(fI<7}X8Pvuo z{!Bb-tNOD1&~Lo-l4f?a4C6}#(NFX+5Y=Dm#HNqbi5{sx63+_;(V7avIOyj^fxwT` zx*cc$W_@PHkT*Ei_9G=|R@~m=M!_CX+80#AJJRKcZDX4kG_x&b=zSJ|yW7Xb*4aa( zpf+*Xo(a38YU|B(^()Rcd4o zA5C3g?wtbyQcsQ2;~D%JQW)BGTX@_37=a643Ts zMK>gE&pBA6qy$_`P`xOl{?#exK35^SYrGk7ysmNh2o&!e-wvYIz4SN)cqRzVMm2dH zEFyk8iiRVi0ki#ey~Vc?0oyr0n#6{xMjjCBF~eTP@by^$vOP-FD)BExHPxVDU^H_k zA|L{mJwqpv{w+^AR$Y1fvhjlP2o7L67?=Q3KAdiI8UJ|X)&GS{9s#s4V1}|Qt#agU zYFSIVHgEIf93oMcuf4u#ky+KYwe0uA5 zh6$&pW-tT? zTzQUQ7uOIln00uHipxm3`doR8WMM;e7|i&>k3+z$!N(yy2nO@CBy7ytqUY7a3T{TF zPz1;li;NbW_RIsNmhqh+&av*e6UP;urq{|fwlX7N^-}xOw1ve@p0bYCF+t6a ztg5M{!u9>c3Jo3m#3$J{ib2LIOVqVOpiQiitoD6>HvW4%MLni4I z2!2?E`#A?eMl~U)32+Mj^$~u34q3^BJm1Il)jU^Lxsmy-FJ6rkTGQ+Zxo?gOwvJWf zNmV1FKPD^It1VMc^jO0trDhbG7UkS5KDU$rLA!mXC(hc9DUG6DBB`vRqlczVV;3*Z z$V?ut1btuH6LOpM4}(p=@cnVQzddhpAYV@R%1e6-(ZzC;k=`~Nm!?uCI~+lKGLBPs z+lO3JZmjdIFa zEOv7$iynebm+KXINT&V--Aj%GMnSW0lJ0afw8gW3_#$TXQgPSH+awS_`(G(Q{)5D; z#qkparZEccXSsJYgIKAU_X*u{-`CsRYY7>Bi!`bEpIJ93Vy4P>*0-BCYLa&?=Pm1g zQd;=639Snj?(H_;R*MKV$gvV)X;|MF3OPmhXslf=?In71+HI!y6kJYNP#S*h5dO=7 zcHpB-wjFJVAuVM5BaV3$j+;c5TWO&mIMXn$#U$<>5q%l4Y@mHCGgwr%TCBV~(7u_f zrYmUvPvPWqMD;H{`@T@wZL_?*Go`7YT>;S0u}!M2uO&NBMg`HaH$V#Z2_pqhL;*=> zNRAK6{#lF%SA7s^lpcTb^Nu-HMpTI<-Bwbxtq7Af6(l1H*&Rv>T=IY=Hu1SPAf4ES zds`^={_%ycP98Dvlj4rIh@^bJMY~q;+g2!9UvfCUmRv)LergcW0Ob{xxxy$f9kBTE z;A0Z>{Le>{jA&%^Iuh@CIG}a|?#Bt=hw$f=_}5MZ`WBVTWLr`JMF%Y(?X(3!_}4JC zEnI)8E=2k*Tx_Yqt5JID8)aJS&bK<$*O{8=U=r_k`kpXj>T51dbZM&VD-HDSn;~K^ zZB&a5UJ+KHI)G7d$9x{X&z}cykmvSgP^8sO_`ao0Aj8YUsi1{AHe^Lr15xMY`J270 zxX4(;h&yqZ%&0PA6#`LRSe2nszOYfG$75J?Dg$65b=Zx3B)YWz>K}Hf9KWej4QnZR zwxegMYN4tRHssW=+UJ^joC3 z12$B7Aj>UMd?vG8U|Bs2`;W!saV?4b8n1|4$Yxc8$=-(IUh_ze`~{4f*;3~Ff5`E? zge2eKtm-Dipwg$fE9o_KpY0LLLdNo}CK z^QS_B*#phL2xlY7z*hujX^5X9;JysgQWzwaJz!Td+(aIkttrtmCUgYqD)TKJvgMiV(i{}GRKk9fS^Cn{tKyAZdas*$~=N*70fXL+Ge$Em(8*)SS!8WHd;DUGA9i{)m`a?X-*Q)hNM;Wie zJIl{mZRvjy;29t%A{!0736&RLk1{93>dC?gdL%?)ko?9_gmbZgh7V4tRG? zFh6l<(uUI{R4Trg2*Y+^P#e8eoXvv#ooH?0n<@d=B=rA-Zc3ueybUvu{pz#-E$QaJ zCFNiSNC$fTzq}6%9nykF^QW>}E!lW$M1Wce^2D>mYdWPN*iKe+0L8(7Qv@RBUlbpE z;Tj_)ATQDN^o`=9TpTXPZu}` z4)kE1DXhO9!oz@r^kh)`ELPta zMiBB?jsubci6R;;<@n<}MkbMo|Dbpayd4Wq0>Q)g5d^?yfl$b?1pubpQ$cqK(DwlrO=aac+dinU?EW{J07W0!8(WIQRy~+dJ$nEy0XTsH zIBCM11LzB34V!DghvhL1)DOEe;o?JgA- zMm~$VZ7y_Ti%j>!4_4PMU^;@z$;Ss>*Y`2xE`F;3b*&|uU^O|{XV-NU%%ZvvdTltp z;doq?vWh!(PesVB)!8yuR>d#TabFAA(woK5oIPjOajJhdquwAlPIle+Osj4 zJbTsOHm)Gj-MFpFb)Bg%2)z(w{l2jN5dty=%5TrAWkk9W#}RnkmFh;mQct7I9v#P{ zIEPb2I)>$1XQ7FA)qbmCaqo(Y%M99ZBU0WpHuCZJUXy4H%>Pq;|4T{;4^R5L66+lq z4CYWTJ3IS`SWtG{HgF#)*MMtXSnOVeDk!_-iIS>Lg9kqTxHyeWkNR#z7MWc;irjgF z>%?tZmj{9RgW0_gm9k-`CIya`^=%(K?p^K-4SVK3>T)umLXJz#%|*%^i8fZ_ZLcQJ z4q@)XHcklp(sV9X6r`5%b`-8~4*A%W-0aUHT(<*aSPdplr+^gjVb}qY0Q-;`E6Qg_ zxuc13UWBG+$l)>=buzpWksFIuW7gZQZCE3@y`x1_k9x|yO}~=-dJWknz8?Ffz(=8+ zO{WH7DAAzg^Pr@h?Z|^Pf7&OA`}vFUt<0wSxvQ+p?~Q9MMM#r70@|_`S zJ^t^u??W|i*ASJj{mR|UuXMj$mRU4!unk2=Q3~JOH#auS=lY?CqiIt$~N@+ zYVk$Nn=Q6L;-w?$tT?gggMuNe*S0Zd6OK}ye`zGAmu9ZcwZ!p`#TWlu_qwwL*))sG zO#8ZUsTj^0IR2WZL~+NGgoWu&=jGwv>%miVUL%a@NOcHXDb1^_)+aF>=StweTjm8v)vuwhr(-Ij0b&|h6e z_MPN@5NU_}QA~cg-M^K5IJ-J`20vWtEGh}U&06TSzW&;xPCmCYJ+_kf(5y^s8nmWd zvS6RGsya;8toe2cxB>iNQv2 zhnA$59j=y&rmlr9!gZnyeIFGhBepBb1!}P7+xbuTf} zIZS!y6m)r!srt;+S1|gyx0NBw^@bINpWr!qnCCLEKcgh zRmF`T)0*O^W_1_+RE$jR$XT3Ziw|<91hf}d*_|wloeCP&)0#5AZ++KZSc_S1C{WyS zhopRBVL)uK;_wPGzOJr=b{^te14pFvT9e{%lQoIwF55#O-Dk87h znhnN|HpTfa4NSfhRj{Pr@~2mbuZpj3ZCzd_OjdOgnvx83SvrUgFN!u*H}a=8l}ycQ zFD|MWDcbF^If)ln)ih$JHoc#^7;hv*hY%m4Q7$wUd{}tVACrN5=I^e5;&J;EG;Xrz zG33rA^6B=cpcYRCn-g!>SXbn??(IvAsdewZt4rpf$tAC5now?+V+$9c_w$`XGAOMLZL6GB7)`(wzT=yYDeu{y3I4V8rN#oh(%oWt$mildm%iQ zy;KxTE;Q}TMc9$U!9ka`@D%ST!&-Z-80y^XcwYM0U{x@<^ACS;vC2f3C-psA=F9N- zp4B@(u{_P+bg89G;2p{9F2QsNa$$L$OAGBW&o~3SM_zkxUIbiC%yyduZ^#Rf;t+c0 zRcUYW7`GOBtzyh#Yk8ba6L$2^V&F1xzgdZOK`(7p62jlp4Y@I3B`0qZov7i9|0u3QY$;H-`S(g-ifCm`)9-f7qAn9vgTJ_8bl>hlmm_fIS&&VNWx9Ew z^4w@ZPUgJA|OcqXG5D={Jzi32m3FQXVOk*J{&Zp!+dfRxDS6ueTpK^xo-SQVQl z5MsT9X!V%`F&Kjqc3T{W+%(!P(i@E;@6sCl67@+mB{K`WuO7gIp9nx-UL19181vnk zOYa>y5!IZ@=+WC_-Bl{WUAe23zF%SCVSs**>bWL9V}_fuddDPXI68%(lx468w*yi| zp?PV&gHSZcAs&35QH-4k4{5-F9Bg@=GVBhh?z!|Xtsp&<1wy8`aWbbB&*S_r;9vbh3LVRS@bwiMr#=r>}_>5?eq zS0FH{ZMig*)p8&#gEX#$9DM*k{)+s&IR&k9k(5w95y(50j^aHE6Q#LO934e)8E=9< z$fNLOsBd4vd&|sGdLk^)Iq+~w%tI~9w-2GfQUn;nL)f776Ai|@Zwxp_q{(?$C zE)_XgM65rHS!hjyWh1r15JB{@T49A|>X~h>Bt^^=P3rhqLuMABa#uL(5fbp+FB_XJ zx2Mb^gmK&yt7;b99z5&wclSo`cC02+0ktJBqYe~~OvdD~B;=xRfgjh)P+SHx zP&A>yC$!io31KkpC$u;y2_-5n3o@kF5yE=_U)jk-1RsLp4yLEzS=&#qA%YJ>9F@9F z7a)c=gv1@W&7Ig45c01DV=y5XqNA9V#F0)fWV9});wldPd^*@|oHu-WZRYme`hDP< z*_;hkhdn>B0WQ|(8A=7<$Ol#IFkzsWrw02cxdPAmD1zIuKqGqoLdw_TLvw;k;KEMd@aLJ5;0@#>GftV>=7(4WsQ#0dW_2b(Yl=Z-q zs$nP)VtrO4UC(6s~MyZOQGkDg5C-60bt()V@6@lKruxB4uprbfvZV^hH@Ik8V9opp+XOy zIXDLJz10z-y3qblq@MRsx%5mDcyfp}0jI6PWX!0{ZBMttq}cqDJy$&pilUDu1||6P zJ}QO@D7Nho3vxPq97$B{0C>$)pF}*W3e5RCGDN=$a0j3V0MNghf2}qFA2o8FjDPa^ ze{(y*8me!=8bk={{v6$bg&r#-{31Lwr*Paj#kaGpb?Ch-PRSt%cI*~g2e<Z zspafxY?XwK01gJYn?c&bc20cpT^{v?O}YIm16p_}h<=IsA9aNk)%nzgSVE(_ZF~L+ z$kt_=w!lLp=bOrD%srNjqvRe$Z zhcBa48A^24h&pYZD_|}%I!&vV?h8l&)=U5eZtdU$F^JfM0Yj`?ydiM+Ypt?`*9K}Y zg)pXWDIAtkYuHkM_nAFkquFM$9O&b97x}l}w{5lD<6i(?C&u!?Fd_W>{e^py>^2MV zztH$1BK_nFJ>BD4|FFL-m4^zPrMr>?{_~Lm<|ts%UwnvjZ@g-BpP>PwXPe~}sO~iZ za0Li5eCsXHd-vzvS3S7?gCX@5-+xkY8Ybjsv*=}1(lvbj3{|UQ!VU@q8-U57&u_Xj8 zm4$Mhd7w>O=2Ds8j7~F;2K%PlQ^FG%?Nbz2GBd@q{TCl~q1@N;1N@rUeCuDc3m3Gn z_0aN6E^6R%TQYlDdf=hJlRm*X6Wy;FEHJ=&#p9Lq-`U}ojNReFfF!DjHvKA>%iM1{ zFWsCHo(3`oQ>;%bJT$xTF>5UZ@UQs{2$Si-125m%{+4O@)=+~dfrEA2_l*LUt$<_+ z3y@!G1pgwpeh**zJ&oCnc^Y;Xa?k} ztqQb3-f=BfM?aP|m}Y)AdT7+BC_d}C(^c$%f?vs0s3nu-l{onIzd_n?4YBVz ziF4;$b>EVr$ND)L8!74RcFwU!p?)PNG}0}0s0%Olnm-ba>yuBft=o(h{wYk&UJHcB z2&K_X0dXE`0=YxNWgW8+7vxORrFJxgURWHj6qHn`1EQJ;>AjO8?1&tAVm1*DDTYh&{$6)41 zE*}f*{RqlVrT!3ef9QRHF0UA1Z6vvuLzhLg9s(oL=MvM;SY-yF2;ay?ROSqZFF(^;c? z7QP-1f*5!3@Z6eaqINW24_`d@YVNE{DV$+BzL2&2)Aa31-k#?9U^4iwNFP_#d#sja zL8g>VQZP7Ego~Q7{nztN6qIN6j3v0E=jsz~!wMq0*TZO9xz1l)R^JN{YsBJh{nQLz zdfTUBP^c-xa!O@$u;;b*+@rmt)Y-BnGc0AHK^)>q-m6@tGI=20%MZ%dPm^!H#F*=I zUAG`wS>-i;+8f<%;Nd^v>V(0(Y6F|(3Cf-?c%0Plx(KW$yncL>nbFkZF$CmwtS;dr4rRSMQpkXt_DX6{8X^Cye#=CSW z`2_ezr4_Fa=fyKSP5DewnFuQ7ficebbEEI4(%nm!LXwAvw>@sn?nhhHG&;V2*w1RK zSTe{<6Ry->1a~nGLUL;gvI>{kZmza|m8Ygx5TY1&2q!m}Rjl{d=rP)q>ng5JJkgLH zKB{YR`v~_t9oe=6!Y6fB3~$Jd`8CKccw80H!;~!latiJ)9hszqPs(rm%lyE;Emi+C zTKmM1d-JJidbd~MK$0E1@jh0j;;Gr&+@RXkC9_;MvS~ZU9ICp^pKtBYh->b1-8uVJ zc*flf)o#%WRn5{Y%Tpd38W-Lftb<090ExHr*+(ehI&q8`1}!{g z!S5LUd@cM$B6adN+q)U7!R>?Ub8{VWNBc1KvDz|1fsef<&hzKvdrF8|rv*eqoe${h|AoKh2u6xB2sKt2D3p#pj9#32`sU)ZOH_8PO#Sm8}tB zA}gMsC^;nq`1Z|FNQ03CnNir3~LIPS56%~Ak>?y8}au7UH(^!0k3Ur ziuHye6q`X^qSpad3O2MGeAoU1!>zrxrb`b0{~K-9kej-_KP_%;x01f&mynLGDbo9c zt!=&H#$tkrnnBH|)}Kv`+j~##jQ(7-7;qf93u+yD9*%?COHVIrHlDi+WsmRj@l@7FU%ueoSp@nwr&GY*R7PwA*8MLM(Rr z(AdfA^u!>-{#LZ!=>)wY2YA7=%2&b(n)y3}Q0MiY zBztRWEJR$vLGngUIp8q~Jp_sCd&Xm zdq7xF5N>-!xUTkea)G_Cm8hUyFX}0$oJ$SPwGO8Oq>E%%Ty&m0!Y{PsvVM8wL_x)9 zZ1|HYF^sY{-~!_ek8sUtO>)jug^#_J2Lr*+z#AYFR+m%%|p&a~oBhCH4MPt=Z5^rb|9Ss-$2ejR-+<5TO>%BV9( zd$A}?%Q4*SY>INA)h&2iLC3kqn{iO`@w>bBBHDq@e6t;aXH`?9&=m$+ptt~^In4>6 zu<+R>jH{tQVHcufR#?y#brADZWF3*NxS{|E81@fB#OgI7QxTtL@u5yz!92E1ZBQyZ z@+RESDhG=d!`)B zDq}Oau@op$VFIuMT^RddH(NYvYXQZA+vp*Sys#~4UN6gt^p`6rL@|52h@yo!bN-8` zT8eLrmhir0-OH1n39%m;edDE-8RCLXFD8iHeT%ML-wEf&w&Q zHy=h$JjAULf2W12#y?xc$5+(FQt}6SV!ORk8|$-gsq}qUBd=?d>FZr;0U@~MABCU< zgn*1l?_EJlO^Q4NMyF{22{Oa%z_7Ar%MQP!SB$d9BcoImN_F<1H4VXL@U58@7*P9V z;(}D*=8sJJ)C-^{P77@cHjCp(qu;D;Wj&*q;MhnRc^jEY`^`Q+_0`r$9&JAv<@(sS zc0EHJV;3So)%Z15yln4V5}x#s3>U zSorU(UVuKiQB>|mJ=cA<`l4Pnd|7L4Nd;|WX^w)4!X2k%T&$i+sp|_F@bo$u2&0^vg2AHcF$y(<85U#ltr(5FME6tKyI6k((bw^Ec4 zcd?f#3sQGr#mo?at$YHY92MB28BGOS_KZ4y8WD>OIZ69z_D;Xdw}2&5t>MZNYx#p3 z(eN+5E}*voz~9yz=EDByzDR)6T~fFRfaa6T%8f_vyD;tmhORq?Z)ml#Hg<4JCd2}J zFs^R?mgvIyR+7M;PFn9xq1mXp{gIC)mQez8)pf0<6@}I!eoDw+2U@OYkg93v#3v5w z#fSPTeerUsUHLt{Ss6J)SsW)kB)bcWaZ8L$_1$GWP2~Bzi3PMiVn9=!QK}Bb0-8!L zc*bXg6eWkT>)ZMN1q^^L(DQ8i49Jqr-HE8Z?PJjXf%L^s36`!BBWKKE0L}RysghzK z9)>3Me;6?r*S&$JOR&K+g1W8K4Y12ZRkW}`Z9wA$jE zx56@1rovcTv{klLQ!2BvyYbqop<+c?K!E!yWhlnbCc4!|rULtONfzj!iSD~3i>JUJ zG3_|`Eg)CN@PEc&JyQasK)21PSTEpsi$>}DY0M&0eT(#wMiWKi3Me*cKa%JQS4yG} zPz-RliB6dJl<^iN_5gi55J0IAu=ci$q&RPS7S9$c7y#g?tl^|sQQD)8Sx`t;fKCiZ zH9#l!kxNNf!e0yL|4EmxAw?c2tSJ6UXw&Af^>dk; zbwwIR8)!!rRlNWDO?L3nk(>%T@dfNsm9yI*V6_0uXr~EVu!dwIz~XrVL|mqu*iYKD zWW`7__rEyEJnp~M45ylE=}VH>k~%Vb3-a7bnxX`Be@xc^Ygj7$7aPhfBYo`>U`OHd z-$Q>laPCNPfcioP@Qngip^sARtQ+zfMNH&O*t8hT6XvwAOaIzei3IjlEMbvWeD3iJ zsbYvPb{ok(-Gmd~iBB8PL@WLuQ1~iQ0_cW?Tqgz;`3$y#QvFNyzma$O*c7KfaKZ~4 zya2GRPWL1TE5jN{!?SkfFkrv5l7Ecf_qQEtRN8-w679Co)ZW}s*A;a0#nEXdwaDB5 z(|#0;xnW#7hy$JwVyz~|n^jXnG2x>$@t4y`((lB!LKtw$V2dq4zHE^F;T!3{*&wEd z`U3VFbq6J+9)1N=!t5$i@;#MH`r%ZR_h$f=+kUn*XN zyvrKtqyt#*0v19L0G^L~U#;OmSWkX-R%KI;%4W)qunijgw^)Wb%av05U;AEp9rx^T*wcOB*TZ`@ahO&6MY)+OUNlh@ihq?qdW&V5P=m1m!+5#@jp=C=>#6 z*@2ce35`)+A%;S8W-pRnmjX}$0y=490Wia3%~&q-h>W-6dECtatUv=S+)uWvU`f*h zb$avuai*Bdzjjvs%7WBxgMr5D2KB&BW@#l?3&he($A+ZJo+M_v${S4PR!v9)6(JLM z`++s+2o1Iy4dP8Vsx1pkMMdLkmfR9bjr0hxu5w$dYGYDadTy6>?GzM((omj5s;JR1 zV$;t1;!nm{R&-q?;U=Pywdk+d-ERi8?Q0$j*Gbs(rxBJkZ+b)S26?HiJ41aRx({7RW{t*tAElpt#N95I^Ya8muz;42R z8;OR=)Z)R%b?S~Ey+2DUp0{=#;(kLjU31jtM z((X>!w0uPJ>89SP-nFzq{v0!F-bVS>rSakuVafih`yei-YsRILoDQ*9Q(Vty8pEZg zxN<244z4`aw>ok)je<&>?I6sBS%6?q`JHGJ8`(=E)!UQBIKC$~#ZflfG51!eEv9v3 z0&k!!o(3QJrl2m|ZLP=#c-Oe+ZEpR!JPqRQs*=CVvLzgTnI)EpeWp2S_UWcEG1R#* z;S?^9ikLgbrnJ;%+opIr;JT6^L0KcYT^{;= zA_?seTffX(7b~}7$0o<4KS&OdRQa%_Z>lyfav-%j8R!zbg}lhg3gaAW%qa4>_Vab0 z*3j;CNcYUyCzG(n4Naiea(JMD* z-kW(aOib0OM=oL*kP}jG?NIxPavcBlYag4iwF)5(Ix#v44xj6 z++}gZ$SSZ(_$;3jeV^)Uq`wx0FfN;cu)zY8_%cLN`xNDsTM@2&%#3q(Btw%tR^*v@ z@7lKn?$>-*WJT?u1rzKQ?{QZg$GPFamcSOO`@LB2Iub0ejIPehLMw7(Y}3${TacdgLOVxQ$U&Qmh@UMkmMkD>T}ok z$;fqEKCkR+mW$qlT9UQEjsXn3+a2l&P2xRM0TF>=fA0N-=Uu~57*R!APxIX*wI&C>6P56l7^u}BWFUWTwko0CN zoBHBA;;%31%js)Jcm=|t#KE4!vd6uW_h;Ew4-^D7>(n>rwh84~73%fk=8j^tMl#+v zchpN86IF_m^epr~MW*eoi+B82kX^+MN@kSqgwXW|Y`b5I=T*N8^A1r7iNBB7u;t20 zbe;SJ`EgQF(<67#yHmZ%M3DMOMqp@HA$?Zt z&?8$}@DT)m3q~1jGW1=wXM{rD20a^MN^1~iKc$Br{7k;zXwhjF7`(3Kc;_0SJZO+e z-QTcME%BDyUEWWC{H0r+Z8-G2L)C_MQE(zFCEZO;gQ-8?#vyBiyT2jlIcN|*Wmua( z&1cp8S+`?KfNa{~k{jCblAC6wij61^VsjJXHB0u}Oy2$r*FOrv8sId@=yp7P-$qFA z`+%k%kQJj|ODDDo!g?FtL|U6O`o;@|0(7|}9B#g+Wu^NaS)9WT_4?z3U&8m)h+F-H z&GZnFQ0RU3lc-${S_f#!esd`wDeG_knCJdrW7^^EPWU7%E}s#Tnri2W!?%EpbC?G& zsHL?H`!3RIPm$ntB=bBoL|H5%%%nQGdut;}MKwq=FkQ)fc zl<6~-nS4OIerh%Us{{rg2EzwCdBr}e;3s)@=xjoXaMzvijUgqA+R;3Hf`$G_yAH~- z++*xaMO0NKxF6rx)+^I3j7p-s)lsFHb!}rB|1i%0&q92t+v|)2?d$Du#*TW zp|wc8H7E1V2XP@ChY@pId8-^IIjc$y*5HJeh<=^bnYQ2kB!{yu z1lO!Fg#(kxwpt;TG|axJ^b=Cgr_nq7z|BZoxo;bcxC4?};pq7u+2}T_%jBAiku(03~||f-|dln<)=B6yKkerF)0k3+zM{CxjT1$Yf}gY8UbNEX+({sM!vd#`c3-zF?b$_=H^U z!C|$(Mye1#tcCRQ9^*AO#Jxs#ktU8@v-3vrb0Yv7XuK99e=+f5_2$fA!j}jdQdwmo zy{+>c6=8}SeVueiJb%NKJ$w8@Dvt2CQRnw%^td0xCGhX_H$44QTh2OG400@<#oVHo zv1>~2i~LH4t24=k`%!7U`}F#HYeX{Yy4x~20+LiSb!ZD|<%b$2bCc^w7Ob&-Ne6yY zs_`?wmZLPA$$J4Z`$(t79Bla~n6=`sDpAg_-j-F$%zotxaUy1H7>pAt7(1<^V8g#lS!lWvs ziI&FFAkpct!D75i*LL|36d^4&CjB_*k!hZa3jV!-Hx5*md3ZM!j_w~|~ zN(Pn+N(CbG4BIO_5wdnZ7S^guS3>=|nbiaH(+;Jw5TPHKVrLRhkSbDt91WGS95gNs zyid!o6j^gdKvAHyjSAuL$fteg|5IwZGR4{<{lb%Cs$IL@Ro${=XdY_=u>hRc)3pIm5a_a&LS9HzD^n_y&bA&hQk{M%*GCBZz~o{MM@N}) z+dxr2C&wIInS1ehglxcQeRT8lX2U}qHlBfox`XJA*s1{7upR*@E zRBJ;T#TQXHixS{(kIXqcRV6?jE3Z$b-|+1U-R4V?{T93aThWGq;wMfD7_+91rc%WN$2d>C}-w8+wTLqA7iomm;f(~88US)sn{KTe>Gv|SOF zd7{Y)CdPSg7umY<$qbD!Mef~dneA5=t@mRk@RN~=WTo)20;-Oh7U>@Mfg%?yRC2>N z2{cF8FZDuIR9#aqUsx%1e+wXpok!#OQ3&~M{8RSutDk4Kr=3^g^GX2~;fm<{-GEKd zTz`$o#0T1$hH9;|rSf*rfd@85hITtak5TQY?Ap=X}F@hG_V9O8WzD z#&a6_&#LuWBbU=Fj{8=WGG?lzkqV!gJYL(An=7LlM19B0=Y494fWtXjB;&bAz6D-| zkRbXBW4kbJ{9YcUW^R06#f;$G+pmfl<`GTqWS6JMEm$;?c)m3xRX3?a$+L$WUtFLr zpk#e7)%*kx%iLn>vs|+v`i$yI-P)p@!Swt=S#V;gkxe{O4AlbEH)Q6?gu#nO9!32O zFBuaT)%oN-%QLooa;IWyOevF7=>Y*1h_D){c<-lpl-bDW$n3#yGC%7U3%yzHZu3=?(CK_3cq!o)brz9(j;L!3nXknS$1$bagv6c` ziq7_G&osOlL3?u&^(Wt&SJ#FfmzBurn(qRi1m3ldYqrtSt({x2r_5~&bcLgCpq0%V zUt%Wg7RIfh;2Ivt2*XYJ{-Fr8!-L@S%BN?0vu7J}6>n%jFSx#en|4T;{Pb}2@C~N3 z5D+Uk%Roq#?+8B7jIWL^QM}zG5TmTB9vqs%>V4OZX$3zSgk2J|-qtXJ6ZJ#e8*?$? zMWbl&tdIk*sXA(@?(L^!JMcjpD`H62^%lGWS^vA(ublfIe2D)rvI7rOwJ>sr;UAzCO%* z_tkds^OwQ6T+K+&kRdkH+Ck)!m%*g?@0dAD z>~f942xXp_*fba0KW&=GG}7Neeh^GM$6rpoH6wh#)$Ss!&RSRU)?HO%ySFV$cmAB>H4BUl@iH8C%)FGfh=?m3S*76}eVr!fB2H!ks@u^lx8(yU27gC}j>0 z#CLBR^;Sk>ZFLi;=jvq4=LwK|z$pAx+VP5IIz0C2uk2&Sq|GVZC!^dkE|71MwW)2B z@CEzDL2T%2d@H2AD8+m>D^MAcA?~#XW$RQ)8F4$fw3G~Ob6*GWfDMjeC|f8PGbte^ zS?i1YbJV-;FVQOD>fEsH1mQe5G} z>1QE^0jAlP%}CPrs_f&d*`h-=B;~{34U+FYz~%wJ`JcGi5#Dhzqf3(Llxj>t>f^RW$q$-i+7;OUF`Jzo&XsW^otuGSBPeRV{tqZs{& z7hNpTl>Q<_fA^yqW7K9Mq$N#>BeJgwxQMqMP~(EVm}w&JVc{% z+O^oJ4jeV~-WC}uo(LnB#f9C3c(Z~y7E-aYxseLz;lqQl6EV-Er*KK@lgGOAORH=t znP2aS>fAh)rkRsbZdHs6o=HaDMU`~#L0dUYe!<7jrTu`vx2PBlNnA`Sz{KXI{QUzz^kG(pPro%pPn2wRgYs-u8@1`eFtF@0#m5S@Mj9;xtn?$`> znsc@jdHLBi(@75KUCf$HH^v;@NS(`G9-dnKKa{<7R9sEdFNy|t0tA8$?oM!bcXxLu zID>0&4FrNqaQ8rPLXaW21r6?Q;coK0&v(yz&s}G&^T*Vz-MhQ$SJl<-*VGzdyBkCoW^d3qR@j&9kRPbzAeV}-IM@Yj2W)ih2CRSTi*W+ zCjBFhBInq6q&91kd|CwU?1b^!mvQ8cglkSSCh#2ks+dkoO11M_k)D18*Rkvt|JqrN zZ4_^2smNt!-_oci+pdwIF&9n-2!yRB413290mstny2vL&6~Vw!%*WPmpqoLzy5U!}@W|qF;q5vp(5Ht4mGN&X z!oaVNl&i-!G9^E`SCex<6&>H<#N^1CP;GO)HYK|5Kl z2g?!2<)i6HtR+<2DZX3!J@VC~(c1-Xajg~b$ zg+gnYC9*mC{QEKm>g`SGAm7Q(ud{I^RiU)^0Sz5(1z`Viqe7E+Iy4iFQ=4wXo&59n zt}cQGcaVEtKAmpP>OXI#bX$uZ*<}0^Z@Y$E(UmD(6~53vvZB2j!gMlPasM-BEK@{{ zI<>NA-wO>^oSGL75fS&I!F-DaHvkJRRi!Clc}f>3#nt~K?xI6nRmqDcSmCqJ`G>QH zlz08&_x>MC_kQ}e2!8P9@0j!-%LXf|pQu!m(WfFi4)S++x3+yeP-D)&Y3o6qk)w?y z+iK){+ek=Nl7z?q3`~8eQ@LDdm>vN>lr1FliACH+su!J-HvzT%y}aPc6a6+ znm3z4C3n=a-Dr4c6Ro-&j+)XO#&wiPn6cgg70)N%|84BCgO=8>wcn=`gZqzrY5;Gb zx1hk≪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 bI81^tNYH?{79b(11OEsCNT4@@fZqQBQD7tf From a8fe8003ea7d8758902d08c83a45adcbebead87f Mon Sep 17 00:00:00 2001 From: spch-GL Date: Tue, 4 Jun 2024 16:10:31 +0200 Subject: [PATCH 3/5] =?UTF-8?q?Correction=20calculs=20Mobilit=C3=A9=20Douc?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- comptages/report/yearly_report_bike.py | 595 ++++++++++++++++++------- 1 file changed, 426 insertions(+), 169 deletions(-) diff --git a/comptages/report/yearly_report_bike.py b/comptages/report/yearly_report_bike.py index cf53658..547a803 100644 --- a/comptages/report/yearly_report_bike.py +++ b/comptages/report/yearly_report_bike.py @@ -1,35 +1,41 @@ -from datetime import datetime +from datetime import datetime, timedelta from functools import reduce -import os +from os import path from typing import Any, Iterable, Optional, Union from decimal import Decimal +from qgis.core import Qgis, QgsMessageLog - -from django.db.models import Sum, F -from django.db.models.functions import Cast, TruncDate -from django.db.models.fields import DateField +from django.db.models import Sum, F, Avg #, Count, ExpressionWrapper +#from django.db.models.fields import DateField, IntegerField from django.db.models.functions import ( - Cast, +# Cast, ExtractHour, ExtractIsoWeekDay, ExtractMonth, TruncDate, ) -from django.db.models import Sum, Avg + from openpyxl import load_workbook -from comptages.core import definitions -from comptages.datamodel.models import CountDetail, Section, Lane, ClassCategory +from comptages.core import definitions, utils #, statistics +from comptages.datamodel.models import CountDetail, Section, Lane, ClassCategory, Category from comptages.datamodel.models import Count as modelCount class YearlyReportBike: - def __init__(self, path_to_output_dir, year, section_id): + def __init__(self, path_to_output_dir, year, section_id, classtxt): # TODO: pass section or section id? self.path_to_output_dir = path_to_output_dir self.year = year self.section_id = section_id + self.classtxt = classtxt + self.seasons = { + "printemps": [3, 4, 5], + "été": [6, 7, 8], + "automne": [9, 10, 11], + "hiver": [12, 1, 2], + } def total_runs_by_directions(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": # Get all the count details for section and the year @@ -48,8 +54,31 @@ def total_runs_by_directions(self) -> "ValuesQuerySet[CountDetail, dict[str, Any .values("weekday", "id_lane__direction", "total") ) + def tjms_by_weekday_category(self, direction=None) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": + # Get all the count details for section and the year + # Test/GL + qs = CountDetail.objects.filter( + id_lane__id_section__id=self.section_id, + timestamp__year=self.year, + import_status=definitions.IMPORT_STATUS_DEFINITIVE, + ) + if direction is not None: + qs = qs.filter(id_lane__direction=direction) + + # Total by day of the week (1->monday, 7->sunday) and by category (0->14) + results = ( + qs.annotate(weekday=ExtractIsoWeekDay("timestamp")) + .values("weekday") + .annotate(tjm=Sum("times")) + .values("weekday", "id_category__code", "tjm") + ) + print(f"yearly_report_bike.py: tjms_by_weekday_category - results.query:{str(results.query)}") + return results + + def tjms_by_weekday_hour(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": # Get all the count details for section and the year + # Doesn't produce correct results because of 2 aggregation qs = CountDetail.objects.filter( id_lane__id_section__id=self.section_id, timestamp__year=self.year, @@ -60,20 +89,24 @@ def tjms_by_weekday_hour(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": # real days (with sum) and then aggregate by weekday (with average) # Total by day of the week (0->monday, 6->sunday) and by hour (0->23) - result = ( + results = ( qs.annotate(date=TruncDate("timestamp")) .values("date") - .annotate(Sum("times")) - .annotate(weekday=ExtractIsoWeekDay("date")) - .values("weekday") - .annotate(tjm=Avg("times")) - .annotate(hour=ExtractHour("timestamp")) + .annotate(tj=Sum("times")) + .values("date", "tj") + .annotate( + weekday=ExtractIsoWeekDay("date"), + hour=ExtractHour("timestamp") + ) + .values("weekday", "hour") + .annotate(tjm=Avg("tj")) .values("weekday", "hour", "tjm") ) - return result + print(f"yearly_report_bike.py : tjms_by_weekday_hour - results.query:{str(results.query)}") + return results def total_runs_by_hour_and_direction( - self, directions=(1, 2), weekdays=(0, 1, 2, 3, 4, 5, 6) + self, directions=(1, 2), weekdays=(1, 2, 3, 4, 5, 6, 7) ) -> dict[int, Any]: # Get all the count details for section and the year qs = CountDetail.objects.filter( @@ -94,6 +127,7 @@ def total_runs_by_hour_and_direction( ) .values("runs", "hour", "direction", "section") ) + print(f"yearly_report_bike.py : total_runs_by_hour_and_direction - results.query:{str(results.query)}") def partition(acc: dict, val: dict) -> dict: hour = val["hour"] @@ -126,6 +160,7 @@ def total_runs_by_hour_one_direction(self, direction: int) -> dict[int, Any]: .annotate(day=ExtractIsoWeekDay("timestamp")) .order_by("day") ) + print(f"yearly_report_bike.py : total_runs_by_hour_one_direction - results.query:{str(results.query)}") def reducer(acc: dict, val: dict) -> dict: day = val["day"] @@ -134,14 +169,15 @@ def reducer(acc: dict, val: dict) -> dict: if day not in acc: acc[day] = {} - if hour not in acc: - acc[day][hour] = val["runs"] - + if hour not in acc[day]: + acc[day][hour] = {} + + acc[day][hour] = val["runs"] return acc return reduce(reducer, results, {}) - def tota_runs_by_hour_weekday_one_direction( + def total_runs_by_hour_weekday_one_direction( self, direction: int ) -> "ValuesQuerySet[Countdetail, dict[str, Any]]": qs = CountDetail.objects.filter( @@ -150,7 +186,7 @@ def tota_runs_by_hour_weekday_one_direction( id_lane__direction=direction, import_status=definitions.IMPORT_STATUS_DEFINITIVE, ) - return ( + results = ( qs.annotate(hour=ExtractHour("timestamp")) .values("hour") .annotate(runs=Sum("times")) @@ -158,6 +194,8 @@ def tota_runs_by_hour_weekday_one_direction( .annotate(day=ExtractIsoWeekDay("timestamp")) .order_by("day") ) + print(f"yearly_report_bike.py : total_runs_by_hour_weekday_one_direction - results.query:{str(results.query)}") + return results def tjms_by_weekday_and_month( self, @@ -173,19 +211,106 @@ def tjms_by_weekday_and_month( # real days (with sum) and then aggregate by weekday (with average) # Total by day of the week (0->monday, 6->sunday) and by month (1->12) - result = ( + results = ( qs.annotate(date=TruncDate("timestamp")) .values("date") - .annotate(Sum("times")) - .annotate(weekday=ExtractIsoWeekDay("timestamp")) - .values("weekday") - .annotate(tjm=Avg("times"), month=ExtractMonth("timestamp")) - .values("weekday", "month", "tjm") + .annotate(daily_runs=Sum("times")) + .values("date", "daily_runs") + .annotate(week_day=ExtractIsoWeekDay("timestamp")) + .values("date", "daily_runs", "week_day") + .annotate(month=ExtractMonth("timestamp")) + .values("week_day", "month", "daily_runs") + ) + print(f"yearly_report_bike.py : tjms_by_weekday_and_month - results.query:{str(results.query)}") + + # FIXME + # Aggregation via `values()` into `annotate()` all the way to the end result would be more performant. + builder = {} + for item in results: + if item["month"] not in builder: + builder[item["month"]] = {"month": item["month"]} + #print(f"yearly_report_bike.py : tjms_by_weekday_and_month - builder_month:{builder}") + builder[item["month"]][item["week_day"]] = { + "days": 1, + "runs": item["daily_runs"], + "tjm": 0, + "week_day": item["week_day"], + } + elif item["week_day"] not in builder[item["month"]]: + builder[item["month"]][item["week_day"]] = { + "days": 1, + "runs": item["daily_runs"], + "tjm": 0, + "week_day": item["week_day"], + } + else: + builder[item["month"]][item["week_day"]]["days"] += 1 + builder[item["month"]][item["week_day"]]["runs"] += item["daily_runs"] + builder[item["month"]][item["week_day"]]["tjm"] = ( + builder[item["month"]][item["week_day"]]["runs"] + / builder[item["month"]][item["week_day"]]["days"] + ) + + return builder + + def runs_by_weekday_and_month(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": + # Get all the count details for section and the year + qs = CountDetail.objects.filter( + id_lane__id_section__id=self.section_id, + timestamp__year=self.year, + import_status=definitions.IMPORT_STATUS_DEFINITIVE, + ) + + # Group by month, week_day + results = ( + qs.annotate(month=ExtractMonth("timestamp"), + week_day=ExtractIsoWeekDay("timestamp")) + .values("month", "week_day") + .annotate(daily_runs=Sum("times")) + .values("month", "week_day", "daily_runs") + ) + print(f"yearly_report_bike.py : runs_by_weekday_and_month - results.query:{str(results.query)}") + + return results + + def nb_weekday_by_month(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": + # Get all the count details for section and the year + qs = CountDetail.objects.filter( + id_lane__id_section__id=self.section_id, + timestamp__year=self.year, + import_status=definitions.IMPORT_STATUS_DEFINITIVE, + ) + + # Group by date then by month, week_day + results = ( + qs.annotate(date=TruncDate("timestamp")) + .values("date") + .annotate(daily_runs=Sum("times")) + .values("date", "daily_runs") + .annotate(month=ExtractMonth("timestamp"), + week_day=ExtractIsoWeekDay("timestamp") + ) + .values("date", "month", "week_day") +# .order_by("date") ) + print(f"yearly_report_bike.py : nb_weekday_by_month - results.query:{str(results.query)}") + + def reducer(acc: dict, item) -> dict: - return result + if item["month"] not in acc: + acc[item["month"]] = {} - def tjms_by_day(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": + if item["week_day"] not in acc[item["month"]]: + acc[item["month"]][item["week_day"]] = 0 + + acc[item["month"]][item["week_day"]] += 1 + + return acc + + # Collecting + return reduce(reducer, results, {}) + + def total_runs_by_day(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": # Get all the count details for section and the year qs = CountDetail.objects.filter( id_lane__id_section__id=self.section_id, @@ -194,14 +319,17 @@ def tjms_by_day(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": ) # Group by date - result = ( - qs.annotate(date=Cast("timestamp", DateField())) + results = ( + qs.annotate(date=TruncDate("timestamp")) .values("date") - .annotate(tjm=Sum("times")) - .values("date", "tjm") + .annotate(daily_runs=Sum("times")) + .values("date", "daily_runs") +# .order_by("date") ) + print(f"yearly_report_bike.py : total_runs_by_day - results.query:{str(results.query)}") + #print(f"yearly_report_bike.py : total_runs_by_day - results:{results}") - return result + return results def tjms_total_runs_by_day_of_week(self) -> dict[str, Any]: # Get all the count details for section and the year @@ -210,17 +338,19 @@ def tjms_total_runs_by_day_of_week(self) -> dict[str, Any]: timestamp__year=self.year, import_status=definitions.IMPORT_STATUS_DEFINITIVE, ) - result = ( + results = ( qs.annotate(date=TruncDate("timestamp")) .values("date") .annotate(daily_runs=Sum("times"), week_day=ExtractIsoWeekDay("timestamp")) .values("week_day", "daily_runs") .order_by("week_day") ) + print(f"yearly_report_bike.py : tjms_total_runs_by_day_of_week - results.query:{str(results.query)}") + #print(f"yearly_report_bike.py : tjms_total_runs_by_day_of_week - results.query:{results}") # FIXME # Aggregation via `values()` into `annotate()` all the way to the end result would be more performant. builder = {} - for item in result: + for item in results: if item["week_day"] not in builder: builder[item["week_day"]] = { "days": 1, @@ -231,10 +361,11 @@ def tjms_total_runs_by_day_of_week(self) -> dict[str, Any]: else: builder[item["week_day"]]["days"] += 1 builder[item["week_day"]]["runs"] += item["daily_runs"] - builder[item["week_day"]]["tjm"] = round( + builder[item["week_day"]]["tjm"] = ( builder[item["week_day"]]["runs"] / builder[item["week_day"]]["days"] ) + return builder def total_runs_by_class(self) -> dict[str, Any]: @@ -251,6 +382,7 @@ def total_runs_by_class(self) -> dict[str, Any]: .annotate(runs=Sum("times"), code=F("id_category__code")) .values("day", "runs", "code") ) + print(f"yearly_report_bike.py : total_runs_by_class - results.query:{str(results.query)}") def reducer(acc: dict, i: dict): code = i["code"] @@ -266,7 +398,7 @@ def reducer(acc: dict, i: dict): return reduce(reducer, results, {}) def tjms_by_direction_bike( - self, categories, direction, weekdays=[0, 1, 2, 3, 4, 5, 6] + self, categories, direction, weekdays=[1, 2, 3, 4, 5, 6, 7] ) -> float: qs = CountDetail.objects.filter( id_lane__id_section__id=self.section_id, @@ -277,9 +409,10 @@ def tjms_by_direction_bike( import_status=definitions.IMPORT_STATUS_DEFINITIVE, ) assert qs.exists() - + results = qs.aggregate(res=Sum("times"))["res"] + print(f"yearly_report_bike.py : tjms_by_direction_bike - results.query:{str(results.query)}") # TODO: avoid the division? - return qs.aggregate(res=Sum("times"))["res"] / 365 + return results / 365 def total(self, categories=[1]) -> float: qs = CountDetail.objects.filter( @@ -287,8 +420,10 @@ def total(self, categories=[1]) -> float: id_category__code__in=categories, import_status=definitions.IMPORT_STATUS_DEFINITIVE, ) + results = qs.aggregate(res=Sum("times"))["res"] + print(f"yearly_report_bike.py : total - results.query:{str(results.query)}") - return qs.aggregate(res=Sum("times"))["res"] + return results def max_day(self, categories=[1]) -> tuple[str, Any]: qs = ( @@ -297,11 +432,12 @@ def max_day(self, categories=[1]) -> tuple[str, Any]: id_category__code__in=categories, import_status=definitions.IMPORT_STATUS_DEFINITIVE, ) - .annotate(date=Cast("timestamp", DateField())) + .annotate(date=TruncDate("timestamp")) .values("date") .annotate(total=Sum("times")) .order_by("-total") ) + print(f"yearly_report_bike.py : max_day - qs.query:{str(qs.query)}") return qs[0]["total"], qs[0]["date"] @@ -317,6 +453,7 @@ def max_month(self, categories=[1]) -> tuple[str, Any]: .annotate(total=Sum("times")) .order_by("-total") ) + print(f"yearly_report_bike.py : max_month - qs.query:{str(qs.query)}") return qs[0]["total"], qs[0]["month"] @@ -332,13 +469,14 @@ def min_month(self, categories=[1]) -> tuple[str, Any]: .annotate(total=Sum("times")) .order_by("total") ) + print(f"yearly_report_bike.py : min_month - qs.query:{str(qs.query)}") return qs[0]["total"], qs[0]["month"] @staticmethod - def count_details_by_day_month(count: modelCount) -> dict[int, Any]: + def count_details_by_day_month(self, count: modelCount) -> dict[int, Any]: # Preparing to filter out categories that don't reference the class picked out by `class_name` - class_name = "SPCH-MD 5C" + class_name = self.classtxt # Excluding irrelevant categories_name_to_exclude = ("TRASH", "ELSE") categories_ids = ( @@ -356,6 +494,7 @@ def count_details_by_day_month(count: modelCount) -> dict[int, Any]: .values("month", "day") .annotate(Sum("times")) ) + print(f"yearly_report_bike.py : count_details_by_day_month - qs.query:{str(qs.query)}") def reducer(acc, item): month = item["month"] @@ -371,10 +510,11 @@ def reducer(acc, item): @staticmethod def count_details_by_various_criteria( + self, count: modelCount, ) -> dict[str, tuple["ValueQuerySet[CountDetail]", Optional[str]]]: # Preparing to filter out categories that don't reference the class picked out by `class_name` - class_name = "SPCH-MD 5C" + class_name = self.classtxt # Excluding irrelevant categories_name_to_exclude = ("TRASH", "ELSE") categories_ids = ( @@ -382,10 +522,15 @@ def count_details_by_various_criteria( .exclude(id_category__name__in=categories_name_to_exclude) .values_list("id_category", flat=True) ) + print(f"yearly_report_bike.py : count_details_by_various_criteria - categories_ids.query:{str(categories_ids.query)}") + # Base QuerySet base_qs = CountDetail.objects.filter( - id_count=count.id, id_category__in=categories_ids + id_count=count.id, + id_category__in=categories_ids, + timestamp__year=self.year, ) + print(f"yearly_report_bike.py : count_details_by_various_criteria - base_qs.query:{str(base_qs.query)}") # Specialized QuerySets total_runs_in_year = ( @@ -393,17 +538,20 @@ def count_details_by_various_criteria( .values("category_name") .annotate(value=Sum("times")) ) + print(f"yearly_report_bike.py : count_details_by_various_criteria - total_runs_in_year.query:{str(total_runs_in_year.query)}") - qs = ( + busy_date = ( base_qs.annotate( - category_name=F("id_category__name"), date=TruncDate("timestamp") + date=TruncDate("timestamp") ) - .values("date", "category_name") + .values("date") .annotate(value=Sum("times")) .order_by("-value") ) - busiest_date = qs.first() - least_busy_date = qs.last() + print(f"yearly_report_bike.py : count_details_by_various_criteria - busy_date.query:{str(busy_date.query)}") + + busiest_date = busy_date.first() + least_busy_date = busy_date.last() assert busiest_date assert least_busy_date @@ -415,6 +563,8 @@ def count_details_by_various_criteria( .values("date", "category_name") .annotate(value=Sum("times")) ) + print(f"yearly_report_bike.py : count_details_by_various_criteria - busiest_date_row.query:{str(busiest_date_row.query)}") + least_busy_date_row = ( base_qs.annotate( date=TruncDate("timestamp"), category_name=F("id_category__name") @@ -423,15 +573,18 @@ def count_details_by_various_criteria( .values("date", "category_name") .annotate(value=Sum("times")) ) + print(f"yearly_report_bike.py : count_details_by_various_criteria - least_busy_date_row.query:{str(least_busy_date_row.query)}") - qs = ( + busy_month = ( base_qs.annotate(month=ExtractMonth("timestamp")) .values("month") .annotate(value=Sum("times")) .order_by("-value") ) - busiest_month = qs.first() - least_busy_month = qs.last() + print(f"yearly_report_bike.py : count_details_by_various_criteria - busy_month.query:{str(busy_month.query)}") + + busiest_month = busy_month.first() + least_busy_month = busy_month.last() assert busiest_month assert least_busy_month @@ -452,7 +605,7 @@ def count_details_by_various_criteria( .annotate(value=Sum("times")) ) - qs = ( + busiest_hour = ( base_qs.annotate( category_name=F("id_category__name"), date=TruncDate("timestamp"), @@ -463,11 +616,13 @@ def count_details_by_various_criteria( .annotate(value=Sum("times")) .order_by("-value") ) - total_runs_busiest_hour_weekday = qs.exclude(week_day__gt=5) - total_runs_busiest_hour_weekend = qs.exclude(week_day__lt=6) + + total_runs_busiest_hour_weekday = busiest_hour.exclude(week_day__gt=5) + total_runs_busiest_hour_weekend = busiest_hour.exclude(week_day__lt=6) + print(f"yearly_report_bike.py : count_details_by_various_criteria - busiest_weekend_hour.query:{str(total_runs_busiest_hour_weekend.query)}") busiest_weekday = total_runs_busiest_hour_weekday.first() - busiest_weekend = total_runs_busiest_hour_weekend[:2] + busiest_weekend = total_runs_busiest_hour_weekend.first() assert busiest_weekday assert busiest_weekend @@ -481,27 +636,21 @@ def count_details_by_various_criteria( ), "total_runs_busiest_hour_weekday": ( total_runs_busiest_hour_weekday, - str(busiest_weekday["date"]), + f'{busiest_weekday["date"]} {busiest_weekday["hour"]}:00', ), "total_runs_busiest_hour_weekend": ( total_runs_busiest_hour_weekend, - ", ".join(str(item["date"]) for item in busiest_weekend), + f'{busiest_weekend["date"]} {busiest_weekend["hour"]}:00', ), "total_runs_in_year": (total_runs_in_year, None), } @staticmethod - def count_details_by_season(count: modelCount) -> dict[int, Any]: + def count_details_by_season(self, count_id) -> dict[int, Any]: """Break down count details by season x section x class""" - # Assuming seasons to run from 20 to 21 - seasons = { - "printemps": [3, 4, 5], - "été": [6, 7, 8], - "automne": [9, 10, 11], - "hiver": [12, 1, 2], - } + # Assuming seasons to run from 21 to 20 -> month20 = (date - timedelta(days=20)).month # Preparing to filter out categories that don't reference the class picked out by `class_name` - class_name = "SPCH-MD 5C" + class_name = self.classtxt # Excluding irrelevant categories_name_to_exclude = ("TRASH", "ELSE") categories_ids = ( @@ -512,36 +661,36 @@ def count_details_by_season(count: modelCount) -> dict[int, Any]: # Getting data count_details = ( CountDetail.objects.filter( - id_count=count.id, id_category__in=categories_ids + id_count=count_id, + id_category__in=categories_ids, + timestamp__year=self.year, ) .annotate( - section=F("id_lane__id_section"), category_name=F("id_category__name") + date=TruncDate("timestamp"), + category_name=F("id_category__name"), ) - .values("id", "section", "category_name", "times", "timestamp") + .values("date", "category_name") + .annotate(value=Sum("times")) + .values("date", "category_name", "value") ) + print(f"yearly_report_bike.py : count_details_by_season - count_details.query:{str(count_details.query)}") # Preparing to collect data def reducer(acc: dict, detail) -> dict: - timestamp: datetime = detail["timestamp"] + date: datetime = detail["date"] + month20 = (date - timedelta(days=20)).month - for season, _range in seasons.items(): - if timestamp.month in _range and ( - timestamp.month != _range[0] or timestamp.day >= 21 - ): - section_id = detail["section"] + for season, _range in self.seasons.items(): + if month20 in _range : category_name = detail["category_name"] - times = detail["times"] if season not in acc: acc[season] = {} if category_name not in acc[season]: - acc[season][category_name] = {} - - if section_id not in acc[season][category_name]: - acc[season][category_name][section_id] = 0 + acc[season][category_name] = 0 - acc[season][category_name][section_id] += times + acc[season][category_name] += detail["value"] break return acc @@ -573,9 +722,53 @@ def write_to_row( else: cell.value = "-" + @staticmethod + def get_category_data_by_dow( + count: modelCount, + section=None, + categoryid=None, + lane=None, + direction=None, + start=None, + end=None, + ) -> "ValuesQuerySet[models.CountDetail, Any]": + if not start: + start = count.start_process_date + if not end: + end = count.end_process_date + timedelta(days=1) + start, end = tuple([utils.to_time_aware_utc(d) for d in (start, end)]) + + qs = CountDetail.objects.filter( + id_lane__id_section=section, + id_category=categoryid, + timestamp__gte=start, + timestamp__lt=end, + ) + + if count is not None: + qs = qs.filter(id_count=count) + + if lane is not None: + qs = qs.filter(id_lane=lane) + + if direction is not None: + qs = qs.filter(id_lane__direction=direction) + + qs = ( + qs.annotate(week_day=ExtractIsoWeekDay("timestamp")) + .values("week_day", "times") + .annotate(value=Sum("times")) + .values("week_day", "value") + .values_list("week_day", "value") + ) + print("yearly_report_bike.py : get_category_data_by_dow - qs.query=", str(qs.query)) + + return qs + def run(self): - current_dir = os.path.dirname(os.path.abspath(__file__)) - template = os.path.join(current_dir, "template_yearly_bike.xlsx") + print(f"{datetime.now()}: YRB_run - begin... ({self.path_to_output_dir})") + current_dir = path.dirname(path.abspath(__file__)) + template = path.join(current_dir, "template_yearly_bike.xlsx") workbook = load_workbook(filename=template) """ Data_count """ @@ -614,11 +807,11 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: import_status=definitions.IMPORT_STATUS_DEFINITIVE, ) if not count_detail.exists(): - print( - "Aucun conmptage pour cette année ({}) et cette section ({})".format( - self.year, self.section_id + QgsMessageLog.logMessage( + f"{datetime.now()} - Aucun conmptage pour cette année ({self.year}) et cette section ({self.section_id})", + "Comptages", + Qgis.Info ) - ) return count = count_detail[0].id_count @@ -637,62 +830,17 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: ws["B11"] = lanes[0].id_section.place_name - """ AN_TE""" - - ws = workbook["AN_TE"] - - row_offset = 14 - column_offset = 1 - data = self.tjms_by_weekday_hour() - for i in data: - ws.cell( - row=i["hour"] + row_offset, - column=i["weekday"] + column_offset, - value=i["tjm"], - ) - - row_offset = 47 - column_offset = 1 - - data = self.tjms_by_weekday_and_month() - for i in data: - ws.cell( - row=i["month"] + row_offset, - column=i["weekday"] + column_offset, - value=i["tjm"], - ) - - """ CV_LV """ - # Is this superseded by the `Data_yearly_stats` tab ? - - # ws = workbook["CV_LV"] - - # ws["F12"] = self.tjms_by_direction_bike([1], 1) - # ws["G12"] = self.tjms_by_direction_bike([1], 2) - # ws["H12"] = self.tjms_by_direction_bike([2, 3, 4, 5], 1) - # ws["I12"] = self.tjms_by_direction_bike([2, 3, 4, 5], 2) - - # ws["K35"] = self.total() - # ws["J39"] = self.max_day()[0] - # ws["K39"] = self.max_day()[1] - - # ws["J40"] = self.max_month()[0] - # ws["K40"] = self.max_month()[1] - - # ws["J41"] = self.min_month()[0] - # ws["k41"] = self.min_month()[1] - """ Data_year """ ws = workbook["Data_year"] row_offset = 4 column_offset = 1 - data = self.tjms_by_day() + data = self.total_runs_by_day() row = row_offset for i in data: ws.cell(row=row, column=column_offset, value=i["date"]) - ws.cell(row=row, column=column_offset + 1, value=i["tjm"]) + ws.cell(row=row, column=column_offset + 1, value=i["daily_runs"]) row += 1 """ Data_week """ @@ -715,9 +863,9 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: # Data hour > Whole weeks print_area = ws["C5:D28"] data = self.total_runs_by_hour_and_direction(directions=(1, 2)) - for hour, row in enumerate(print_area, 1): - if hour == 24: - hour = 0 + for hour, row in enumerate(print_area, 0): + # if hour == 24: + # hour = 0 for direction, cell in enumerate(row, 1): if hour not in data or direction not in data[hour]: cell.value = 0 @@ -726,10 +874,10 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: # Data hour > Weekends only print_area = ws["C37:D60"] - data = self.total_runs_by_hour_and_direction(directions=(1, 2), weekdays=(5, 6)) - for hour, row in enumerate(print_area, 1): - if hour == 24: - hour = 0 + data = self.total_runs_by_hour_and_direction(directions=(1, 2), weekdays=(6, 7)) + for hour, row in enumerate(print_area, 0): + # if hour == 24: + # hour = 0 for direction, cell in enumerate(row, 1): if hour not in data or direction not in data[hour]: cell.value = 0 @@ -739,9 +887,9 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: # Data hour > Only dir 1 print_area = ws["B69:H92"] data = self.total_runs_by_hour_one_direction(1) - for hour, row in enumerate(print_area, 1): - if hour == 24: - hour = 0 + for hour, row in enumerate(print_area, 0): + # if hour == 24: + # hour = 0 for day, cell in enumerate(row, 1): if day not in data or hour not in data[day]: cell.value = 0 @@ -751,9 +899,9 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: # Data hour > Only dir 2 print_area = ws["B101:H124"] data = self.total_runs_by_hour_one_direction(2) - for hour, row in enumerate(print_area, 1): - if hour == 24: - hour = 0 + for hour, row in enumerate(print_area, 0): + # if hour == 24: + # hour = 0 for day, cell in enumerate(row, 1): if day not in data or hour not in data[day]: cell.value = 0 @@ -764,7 +912,7 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: ws = workbook["Data_yearly_stats"] print_area = ws["B2:G8"] - data = YearlyReportBike.count_details_by_various_criteria(count) + data = self.count_details_by_various_criteria(self, count) column_names = ( "VELO", "MONO", @@ -792,26 +940,135 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: column_names=column_names, ) - """ Data_class """ + """ Section Passages saisonniers pour chaque catégories Adrien""" + row_offset = 22 + column_offset = 2 - ws = workbook["Data_class"] - print_area = ws["B4:H18"] - for code, row in enumerate(print_area, 0): - for day, cell in enumerate(row, 1): - if code not in data or day not in data[code]: - cell.value = 0 - else: - cell.value = data[code][day] + data = self.count_details_by_season(self, count) + for saison in data: + for i, season in enumerate(self.seasons): + if saison == season: + for j, cat in enumerate(column_names): + if cat in data[saison] : + ws.cell( + column=j + column_offset, + row=i + row_offset, + value=data[saison][cat], + ) + + """ Section Passages mensuels Adrien""" + row_offset = 40 + column_offset = 1 + + data = self.runs_by_weekday_and_month() + for i in data: + ws.cell( + column=i["week_day"] + column_offset, + row=i["month"] + row_offset, + value=i["daily_runs"], + ) + + row_offset = 60 + data = self.nb_weekday_by_month() + for mois in data: + for jours in data[mois]: + ws.cell( + column=jours + column_offset, + row=mois + row_offset, + value=data[mois][jours], + ) + + """ Data_category """ + """ Direction Mario""" + ws = workbook["Data_category"] + + start = datetime(self.year, 1, 1) + end = datetime(self.year + 1, 1, 1) + section = Section(self.section_id) + + categories = ( + Category.objects.filter(countdetail__id_count=count) + .distinct() + .order_by("code") + ) + print(f"yearly_report_bike.py : Data_category, Direction Mario, categories.query={str(categories.query)}") + + # Direction 1 + row_offset = 5 + col_offset = 1 + for category in categories: + res = self.get_category_data_by_dow( + count=None, + section=self.section_id, + categoryid=category.id, + lane=None, + direction=1, + start=start, + end=end, + ) + + for row in res: + row_num = row_offset + category.code + col_num = col_offset + row[0] + val=ws.cell(row_num, col_num).value + value = ( + val + row[1] if isinstance(val, (int, float)) else row[1] + ) # Add to previous value because with class convertions multiple categories can converge into a single one + + ws.cell(row=row_num, column=col_num, value=value) + + # Direction 2 + if len(section.lane_set.all()) == 2: + row_offset = 29 + col_offset = 1 + for category in categories: + res = self.get_category_data_by_dow( + None, + section, + categoryid=category.id, + direction=2, + start=start, + end=end, + ) + + for row in res: + row_num = row_offset + category.code + col_num = col_offset + row[0] + val=ws.cell(row_num, col_num).value + value = ( + val + row[1] if isinstance(val, (int, float)) else row[1] + ) # Add to previous value because with class convertions multiple categories can converge into a single one + + ws.cell(row=row_num, column=col_num, value=value) + + # Section + row_offset = 53 + col_offset = 1 + for category in categories: + res = self.get_category_data_by_dow( + count=None, + section=self.section_id, + categoryid=category.id, + lane=None, + direction=None, + start=start, + end=end, + ) - ws = workbook["AN_GR"] - ws.print_area = "A1:Z62" + for row in res: + row_num = row_offset + category.code + col_num = col_offset + row[0] + val=ws.cell(row_num, col_num).value + value = ( + val + row[1] if isinstance(val, (int, float)) else row[1] + ) # Add to previous value because with class convertions multiple categories can converge into a single one - ws = workbook["CAT"] - ws.print_area = "A1:Z62" + ws.cell(row=row_num, column=col_num, value=value) # Save the file - output = os.path.join( + output = path.join( self.path_to_output_dir, "{}_{}_r.xlsx".format(self.section_id, self.year) ) + workbook.save(filename=output) - print(f"Saved report to {output}") + print(f"{datetime.now()}: YRB_run - end: Saved report to {output}") From 35e5bec0abad15765d63a3003c33b135125ae608 Mon Sep 17 00:00:00 2001 From: spch-GL Date: Tue, 4 Jun 2024 17:12:22 +0200 Subject: [PATCH 4/5] corrections de syntaxe --- comptages/core/report.py | 127 +++++++--------- comptages/core/statistics.py | 198 ++++++++++++------------- comptages/report/yearly_report_bike.py | 89 +++++------ 3 files changed, 192 insertions(+), 222 deletions(-) diff --git a/comptages/core/report.py b/comptages/core/report.py index e80be55..772eeb5 100644 --- a/comptages/core/report.py +++ b/comptages/core/report.py @@ -1,11 +1,9 @@ import os from datetime import date, datetime, timedelta -from typing import Generator +from typing import Generator, Optional +from qgis.core import Qgis, QgsMessageLog -from datetime import timedelta, datetime -from typing import Optional from openpyxl import load_workbook, Workbook -from qgis.core import Qgis, QgsMessageLog from comptages.core import statistics from comptages.datamodel import models @@ -75,7 +73,6 @@ def _prepare_default_reports( ) QgsMessageLog.logMessage(f"{datetime.now()} - Preparing reports: Adding workbook {i+j*mondays_qty} ({output})", "Comptages", Qgis.Info) progress = int(100 / mondays_qty / sections_qty * (i+j*mondays_qty)) - #print(f" j:{j}, i:{i}, progress:{progress}") callback_progress(progress) workbook = load_workbook(filename=template_path) @@ -86,7 +83,7 @@ def _prepare_default_reports( _remove_useless_sheets(count, workbook) workbook.save(filename=output) - + print(f"{datetime.now()}: _prepare_default_reports: ended, count: {count}") @@ -133,6 +130,7 @@ def _prepare_yearly_report( print(f"{datetime.now()}: _prepare_yearly_report: ended, sections_ids: {sections_ids}") + def _mondays_of_count(count: models.Count) -> Generator[date, None, None]: """Generator that return the Mondays of the count""" @@ -243,11 +241,11 @@ def _data_count_yearly( def _data_day( - count: models.Count, - section: models.Section, - monday, - workbook: Workbook - ): + count: models.Count, + section: models.Section, + monday, + workbook: Workbook +): ws = workbook["Data_day"] # Monthly coefficients @@ -358,19 +356,18 @@ def _data_day( def _data_day_yearly( - count: models.Count, - section: models.Section, - year: int, - workbook: Workbook - ): + count: models.Count, + section: models.Section, + year: int, + workbook: Workbook +): ws = workbook["Data_day"] # Total (section) row_offset = 69 col_offset = 2 - df = statistics.get_time_data_yearly( - year, + year, section, exclude_trash=True, ) @@ -388,8 +385,8 @@ def _data_day_yearly( row_offset = 95 col_offset = 2 df = statistics.get_light_numbers_yearly( - section, - start=datetime(year, 1, 1), + section, + start=datetime(year, 1, 1), end=datetime(year + 1, 1, 1), exclude_trash=True, ) @@ -409,10 +406,9 @@ def _data_day_yearly( # Direction 1 row_offset = 5 col_offset = 2 - df = statistics.get_time_data_yearly( - year, - section, + year, + section, direction=1, exclude_trash=True, ) @@ -430,9 +426,9 @@ def _data_day_yearly( row_offset = 31 col_offset = 2 df = statistics.get_light_numbers_yearly( - section, - start=datetime(year, 1, 1), - end=datetime(year + 1, 1, 1), + section, + start=datetime(year, 1, 1), + end=datetime(year + 1, 1, 1), direction=1, exclude_trash=True, ) @@ -453,10 +449,9 @@ def _data_day_yearly( if len(section.lane_set.all()) == 2: row_offset = 37 col_offset = 2 - df = statistics.get_time_data_yearly( - year, - section, + year, + section, direction=2, exclude_trash=True, ) @@ -498,46 +493,43 @@ def _data_month_yearly( end = datetime(year + 1, 1, 1) # Section + row_offset = 14 + col_offset = 2 df = statistics.get_month_data( - section, - start, + section, + start, end, exclude_trash=True, ) - row_offset = 14 - col_offset = 2 - for col in df.itertuples(): ws.cell(row=row_offset, column=col_offset + col.Index, value=col.tm) # Direction 1 + row_offset = 4 + col_offset = 2 df = statistics.get_month_data( - section, - start, - end, + section, + start, + end, direction=1, exclude_trash=True, ) - row_offset = 4 - col_offset = 2 - for col in df.itertuples(): ws.cell(row=row_offset, column=col_offset + col.Index, value=col.tm) # Direction 2 + row_offset = 9 + col_offset = 2 df = statistics.get_month_data( - section, - start, - end, + section, + start, + end, direction=2, exclude_trash=True, ) - row_offset = 9 - col_offset = 2 - for col in df.itertuples(): ws.cell(row=row_offset, column=col_offset + col.Index, value=col.tm) @@ -621,7 +613,6 @@ def _data_speed( speed_high=range_[1], exclude_trash=True, ) - for row in res: ws.cell(row=row_offset + row[0], column=col_offset + i, value=row[1]) @@ -647,12 +638,11 @@ def _data_speed( # Average speed direction 1 row_offset = 5 col_offset = 19 - df = statistics.get_average_speed_by_hour( - count, - section, - direction=1, - start=monday, + count, + section, + direction=1, + start=monday, end=monday + timedelta(days=7), exclude_trash=True, ) @@ -674,7 +664,6 @@ def _data_speed( speed_high=range_[1], exclude_trash=True, ) - for row in res: ws.cell(row=row_offset + row[0], column=col_offset + i, value=row[1]) @@ -702,12 +691,11 @@ def _data_speed( # Average speed direction 2 row_offset = 33 col_offset = 19 - df = statistics.get_average_speed_by_hour( - count, - section, - direction=2, - start=monday, + count, + section, + direction=2, + start=monday, end=monday + timedelta(days=7), exclude_trash=True, ) @@ -770,7 +758,6 @@ def _data_speed_yearly( speed_high=range_[1], exclude_trash=True, ) - for row in res: ws.cell(row=row_offset + row[0], column=col_offset + i, value=row[1]) @@ -780,11 +767,11 @@ def _data_speed_yearly( col_offset = 16 for i, v in enumerate(characteristic_speeds): df = statistics.get_characteristic_speed_by_hour( - None, - section, - direction=1, - start=start, - end=end, + None, + section, + direction=1, + start=start, + end=end, v=v, exclude_trash=True, ) @@ -796,7 +783,6 @@ def _data_speed_yearly( # Average speed direction 1 row_offset = 5 col_offset = 19 - df = statistics.get_average_speed_by_hour( None, section, @@ -833,11 +819,11 @@ def _data_speed_yearly( col_offset = 16 for i, v in enumerate(characteristic_speeds): df = statistics.get_characteristic_speed_by_hour( - None, - section, - direction=2, - start=start, - end=end, + None, + section, + direction=2, + start=start, + end=end, v=v, exclude_trash=True, ) @@ -851,7 +837,6 @@ def _data_speed_yearly( # Average speed direction 2 row_offset = 33 col_offset = 19 - df = statistics.get_average_speed_by_hour( None, section, diff --git a/comptages/core/statistics.py b/comptages/core/statistics.py index 2898f80..f3686f7 100644 --- a/comptages/core/statistics.py +++ b/comptages/core/statistics.py @@ -1,9 +1,9 @@ from typing import Any -from pandas import DataFrame, cut from functools import reduce from datetime import timedelta, datetime -from pytz import timezone +from pandas import DataFrame, cut +from pytz import timezone from django.db.models import F, CharField, Value, Q, Sum, QuerySet from django.db.models.functions import ExtractHour, Trunc, Concat @@ -13,14 +13,14 @@ def get_time_data( - count, - section, - lane=None, - direction=None, - start=None, - end=None, - exclude_trash=False, - ): + count, + section, + lane=None, + direction=None, + start=None, + end=None, + exclude_trash=False, +): if not start: start = count.start_process_date if not end: @@ -61,17 +61,17 @@ def get_time_data( if not df.empty: df["date"] = df["date"].dt.strftime("%a %d.%m.%Y") df["import_status"].replace({0: "Existant", 1: "Nouveau"}, inplace=True) - + return df def get_time_data_yearly( - year, - section: models.Section, - lane=None, - direction=None, - exclude_trash=False, - ) -> DataFrame: + year, + section: models.Section, + lane=None, + direction=None, + exclude_trash=False, +) -> DataFrame: """Vehicles by hour and day of the week""" start = datetime(year, 1, 1) end = datetime(year + 1, 1, 1) @@ -95,8 +95,6 @@ def get_time_data_yearly( if direction is not None: qs = qs.filter(id_lane__direction=direction) - #print("get_time_data_yearly - qs=", qs) - #print("get_time_data_yearly - qs.count=", qs.count()) if not qs.exists(): print(f"statistics.py : get_time_data_yearly - Nothing found for Year: {year}, Section: {section}, Lane: {lane}, Direction: {direction}.") return None @@ -114,8 +112,6 @@ def get_time_data_yearly( print(f"statistics.py : get_time_data_yearly - Nothing found !!! for Year: {year}. Section: {section}. Lane: {lane}. Direction: {direction}. !!!)") print(f"statistics.py : get_time_data_yearly - qsa.query={str(qs.query)}") - #print("get_time_data_yearly - qsa annot=", qs) - #print("get_time_data_yearly - qsa.count=", qs.count()) df = DataFrame.from_records(qs) if not df.empty: @@ -126,15 +122,15 @@ def get_time_data_yearly( def get_day_data( - count: models.Count, - section=None, - lane=None, - direction=None, - status=None, - exclude_trash=False, - start=None, - end=None, - ) -> tuple[DataFrame, int]: + count: models.Count, + section=None, + lane=None, + direction=None, + status=None, + exclude_trash=False, + start=None, + end=None, +) -> tuple[DataFrame, int]: if not start: start = count.start_process_date if not end: @@ -171,7 +167,7 @@ def get_day_data( .annotate(tj=Sum("times")) .values("date", "tj", "import_status") ) - print(f"statistics.py : get_day_data - qs.query=", str(qs.query)) + print("statistics.py : get_day_data - qs.query=", str(qs.query)) df = DataFrame.from_records(qs) mean = 0 @@ -183,12 +179,12 @@ def get_day_data( def get_category_data( - count: models.Count, - section: models.Section, - status=definitions.IMPORT_STATUS_DEFINITIVE, - start=None, - end=None, - ) -> DataFrame: + count: models.Count, + section: models.Section, + status=definitions.IMPORT_STATUS_DEFINITIVE, + start=None, + end=None, +) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -228,12 +224,12 @@ def get_category_data( def get_speed_data( - count: models.Count, - section: models.Section, - exclude_trash=False, - start=None, - end=None, - ) -> DataFrame: + count: models.Count, + section: models.Section, + exclude_trash=False, + start=None, + end=None, +) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -250,7 +246,7 @@ def get_speed_data( if exclude_trash: qs = qs.exclude(id_category__trash=True) - + print(f"statistics.py : get_speed_data - qs.query={str(qs.query)}") df = DataFrame.from_records(qs.values("speed", "times", "import_status")) @@ -292,14 +288,14 @@ def get_speed_data( def get_light_numbers( - count: models.Count, - section: models.Section, - lane=None, - direction=None, - start=None, - end=None, - exclude_trash=False, - ) -> dict: + count: models.Count, + section: models.Section, + lane=None, + direction=None, + start=None, + end=None, + exclude_trash=False, +) -> dict: if not start: start = count.start_process_date if not end: @@ -337,13 +333,13 @@ def get_light_numbers( def get_light_numbers_yearly( - section: models.Section, - lane=None, - direction=None, - start=None, - end=None, - exclude_trash=False, - ) -> DataFrame: + section: models.Section, + lane=None, + direction=None, + start=None, + end=None, + exclude_trash=False, +) -> DataFrame: qs = models.CountDetail.objects.filter( id_lane__id_section=section, id_category__isnull=False, @@ -371,16 +367,16 @@ def get_light_numbers_yearly( def get_speed_data_by_hour( - count: models.Count, - section: models.Section, - lane=None, - direction=None, - start=None, - end=None, - speed_low=0, - speed_high=15, - exclude_trash=False, - ) -> "ValuesQuerySet[models.CountDetail, Any]": + count: models.Count, + section: models.Section, + lane=None, + direction=None, + start=None, + end=None, + speed_low=0, + speed_high=15, + exclude_trash=False, +) -> "ValuesQuerySet[models.CountDetail, Any]": if not start: start = count.start_process_date if not end: @@ -420,15 +416,15 @@ def get_speed_data_by_hour( def get_characteristic_speed_by_hour( - count: models.Count, - section: models.Section, - lane=None, - direction=None, - start=None, - end=None, - v=0.15, - exclude_trash=False, - ) -> DataFrame: + count: models.Count, + section: models.Section, + lane=None, + direction=None, + start=None, + end=None, + v=0.15, + exclude_trash=False, +) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -469,15 +465,15 @@ def get_characteristic_speed_by_hour( def get_average_speed_by_hour( - count: models.Count, - section: models.Section, - lane=None, - direction=None, - start=None, - end=None, - v=0.15, - exclude_trash=False, - ) -> DataFrame: + count: models.Count, + section: models.Section, + lane=None, + direction=None, + start=None, + end=None, + v=0.15, + exclude_trash=False, +) -> DataFrame: if not start: start = count.start_process_date if not end: @@ -519,14 +515,14 @@ def get_average_speed_by_hour( def get_category_data_by_hour( - count: models.Count, - section: models.Section, - category, - lane=None, - direction=None, - start=None, - end=None, - ) -> "ValuesQuerySet[models.CountDetail, Any]": + count: models.Count, + section: models.Section, + category, + lane=None, + direction=None, + start=None, + end=None, +) -> "ValuesQuerySet[models.CountDetail, Any]": if not start: start = count.start_process_date if not end: @@ -572,11 +568,11 @@ def get_special_periods(first_day, last_day) -> QuerySet[models.SpecialPeriod]: def get_month_data( - section: models.Section, - start, end, - direction=None, - exclude_trash=False, - ) -> DataFrame: + section: models.Section, + start, end, + direction=None, + exclude_trash=False, +) -> DataFrame: qs = models.CountDetail.objects.filter( id_lane__id_section=section, timestamp__gte=start, timestamp__lt=end ) @@ -607,7 +603,7 @@ def get_valid_days(year: int, section: models.Section) -> int: where a day is deemed valid just in case there are at least 14 1-hour blocks between 6pm and 4pm with at least 1 vehicle. """ - tz = timezone("Europe/Zurich") + tz = timezone("Europe/Zurich") start = tz.localize(datetime(year, 1, 1)) end = tz.localize(datetime(year + 1, 1, 1)) iterator = ( diff --git a/comptages/report/yearly_report_bike.py b/comptages/report/yearly_report_bike.py index 547a803..ceecd34 100644 --- a/comptages/report/yearly_report_bike.py +++ b/comptages/report/yearly_report_bike.py @@ -5,21 +5,24 @@ from decimal import Decimal from qgis.core import Qgis, QgsMessageLog -from django.db.models import Sum, F, Avg #, Count, ExpressionWrapper -#from django.db.models.fields import DateField, IntegerField +from openpyxl import load_workbook +from django.db.models import Sum, F, Avg from django.db.models.functions import ( -# Cast, ExtractHour, ExtractIsoWeekDay, ExtractMonth, TruncDate, ) -from openpyxl import load_workbook - -from comptages.core import definitions, utils #, statistics -from comptages.datamodel.models import CountDetail, Section, Lane, ClassCategory, Category -from comptages.datamodel.models import Count as modelCount +from comptages.core import definitions, utils +from comptages.datamodel.models import ( + CountDetail, + Section, + Lane, + ClassCategory, + Category, + Count as modelCount, +) class YearlyReportBike: @@ -74,8 +77,7 @@ def tjms_by_weekday_category(self, direction=None) -> "ValuesQuerySet[CountDetai ) print(f"yearly_report_bike.py: tjms_by_weekday_category - results.query:{str(results.query)}") return results - - + def tjms_by_weekday_hour(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": # Get all the count details for section and the year # Doesn't produce correct results because of 2 aggregation @@ -171,7 +173,7 @@ def reducer(acc: dict, val: dict) -> dict: if hour not in acc[day]: acc[day][hour] = {} - + acc[day][hour] = val["runs"] return acc @@ -229,7 +231,6 @@ def tjms_by_weekday_and_month( for item in results: if item["month"] not in builder: builder[item["month"]] = {"month": item["month"]} - #print(f"yearly_report_bike.py : tjms_by_weekday_and_month - builder_month:{builder}") builder[item["month"]][item["week_day"]] = { "days": 1, "runs": item["daily_runs"], @@ -250,7 +251,7 @@ def tjms_by_weekday_and_month( builder[item["month"]][item["week_day"]]["runs"] / builder[item["month"]][item["week_day"]]["days"] ) - + return builder def runs_by_weekday_and_month(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": @@ -263,14 +264,14 @@ def runs_by_weekday_and_month(self) -> "ValuesQuerySet[CountDetail, dict[str, An # Group by month, week_day results = ( - qs.annotate(month=ExtractMonth("timestamp"), - week_day=ExtractIsoWeekDay("timestamp")) + qs.annotate(month=ExtractMonth("timestamp"), + week_day=ExtractIsoWeekDay("timestamp")) .values("month", "week_day") .annotate(daily_runs=Sum("times")) .values("month", "week_day", "daily_runs") ) print(f"yearly_report_bike.py : runs_by_weekday_and_month - results.query:{str(results.query)}") - + return results def nb_weekday_by_month(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": @@ -287,14 +288,13 @@ def nb_weekday_by_month(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": .values("date") .annotate(daily_runs=Sum("times")) .values("date", "daily_runs") - .annotate(month=ExtractMonth("timestamp"), - week_day=ExtractIsoWeekDay("timestamp") - ) + .annotate(month=ExtractMonth("timestamp"), + week_day=ExtractIsoWeekDay("timestamp")) .values("date", "month", "week_day") -# .order_by("date") + # .order_by("date") ) print(f"yearly_report_bike.py : nb_weekday_by_month - results.query:{str(results.query)}") - + def reducer(acc: dict, item) -> dict: if item["month"] not in acc: @@ -324,10 +324,9 @@ def total_runs_by_day(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": .values("date") .annotate(daily_runs=Sum("times")) .values("date", "daily_runs") -# .order_by("date") + # .order_by("date") ) print(f"yearly_report_bike.py : total_runs_by_day - results.query:{str(results.query)}") - #print(f"yearly_report_bike.py : total_runs_by_day - results:{results}") return results @@ -346,7 +345,7 @@ def tjms_total_runs_by_day_of_week(self) -> dict[str, Any]: .order_by("week_day") ) print(f"yearly_report_bike.py : tjms_total_runs_by_day_of_week - results.query:{str(results.query)}") - #print(f"yearly_report_bike.py : tjms_total_runs_by_day_of_week - results.query:{results}") + # FIXME # Aggregation via `values()` into `annotate()` all the way to the end result would be more performant. builder = {} @@ -365,7 +364,7 @@ def tjms_total_runs_by_day_of_week(self) -> dict[str, Any]: builder[item["week_day"]]["runs"] / builder[item["week_day"]]["days"] ) - + return builder def total_runs_by_class(self) -> dict[str, Any]: @@ -526,7 +525,7 @@ def count_details_by_various_criteria( # Base QuerySet base_qs = CountDetail.objects.filter( - id_count=count.id, + id_count=count.id, id_category__in=categories_ids, timestamp__year=self.year, ) @@ -549,7 +548,7 @@ def count_details_by_various_criteria( .order_by("-value") ) print(f"yearly_report_bike.py : count_details_by_various_criteria - busy_date.query:{str(busy_date.query)}") - + busiest_date = busy_date.first() least_busy_date = busy_date.last() assert busiest_date @@ -564,7 +563,7 @@ def count_details_by_various_criteria( .annotate(value=Sum("times")) ) print(f"yearly_report_bike.py : count_details_by_various_criteria - busiest_date_row.query:{str(busiest_date_row.query)}") - + least_busy_date_row = ( base_qs.annotate( date=TruncDate("timestamp"), category_name=F("id_category__name") @@ -616,7 +615,7 @@ def count_details_by_various_criteria( .annotate(value=Sum("times")) .order_by("-value") ) - + total_runs_busiest_hour_weekday = busiest_hour.exclude(week_day__gt=5) total_runs_busiest_hour_weekend = busiest_hour.exclude(week_day__lt=6) print(f"yearly_report_bike.py : count_details_by_various_criteria - busiest_weekend_hour.query:{str(total_runs_busiest_hour_weekend.query)}") @@ -661,7 +660,7 @@ def count_details_by_season(self, count_id) -> dict[int, Any]: # Getting data count_details = ( CountDetail.objects.filter( - id_count=count_id, + id_count=count_id, id_category__in=categories_ids, timestamp__year=self.year, ) @@ -681,7 +680,7 @@ def reducer(acc: dict, detail) -> dict: month20 = (date - timedelta(days=20)).month for season, _range in self.seasons.items(): - if month20 in _range : + if month20 in _range: category_name = detail["category_name"] if season not in acc: @@ -789,10 +788,8 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: section_start_dist = render_section_dist(section.start_dist) section_end_dist = render_section_dist(section.end_dist) - ws[ - "B3" - ] = f""" - Poste de comptage : {section.id} + ws["B3"] = f""" + Poste de comptage : {section.id} Axe : {section.owner}:{section.road}{section.way} PR {section.start_pr} + {section_start_dist} m à PR {section.end_pr} + {section_end_dist} m """ @@ -808,8 +805,8 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: ) if not count_detail.exists(): QgsMessageLog.logMessage( - f"{datetime.now()} - Aucun conmptage pour cette année ({self.year}) et cette section ({self.section_id})", - "Comptages", + f"{datetime.now()} - Aucun conmptage pour cette année ({self.year}) et cette section ({self.section_id})", + "Comptages", Qgis.Info ) return @@ -864,8 +861,6 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: print_area = ws["C5:D28"] data = self.total_runs_by_hour_and_direction(directions=(1, 2)) for hour, row in enumerate(print_area, 0): - # if hour == 24: - # hour = 0 for direction, cell in enumerate(row, 1): if hour not in data or direction not in data[hour]: cell.value = 0 @@ -876,8 +871,6 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: print_area = ws["C37:D60"] data = self.total_runs_by_hour_and_direction(directions=(1, 2), weekdays=(6, 7)) for hour, row in enumerate(print_area, 0): - # if hour == 24: - # hour = 0 for direction, cell in enumerate(row, 1): if hour not in data or direction not in data[hour]: cell.value = 0 @@ -888,8 +881,6 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: print_area = ws["B69:H92"] data = self.total_runs_by_hour_one_direction(1) for hour, row in enumerate(print_area, 0): - # if hour == 24: - # hour = 0 for day, cell in enumerate(row, 1): if day not in data or hour not in data[day]: cell.value = 0 @@ -900,8 +891,6 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: print_area = ws["B101:H124"] data = self.total_runs_by_hour_one_direction(2) for hour, row in enumerate(print_area, 0): - # if hour == 24: - # hour = 0 for day, cell in enumerate(row, 1): if day not in data or hour not in data[day]: cell.value = 0 @@ -949,7 +938,7 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: for i, season in enumerate(self.seasons): if saison == season: for j, cat in enumerate(column_names): - if cat in data[saison] : + if cat in data[saison]: ws.cell( column=j + column_offset, row=i + row_offset, @@ -1010,7 +999,7 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: for row in res: row_num = row_offset + category.code col_num = col_offset + row[0] - val=ws.cell(row_num, col_num).value + val = ws.cell(row_num, col_num).value value = ( val + row[1] if isinstance(val, (int, float)) else row[1] ) # Add to previous value because with class convertions multiple categories can converge into a single one @@ -1034,7 +1023,7 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: for row in res: row_num = row_offset + category.code col_num = col_offset + row[0] - val=ws.cell(row_num, col_num).value + val = ws.cell(row_num, col_num).value value = ( val + row[1] if isinstance(val, (int, float)) else row[1] ) # Add to previous value because with class convertions multiple categories can converge into a single one @@ -1058,7 +1047,7 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: for row in res: row_num = row_offset + category.code col_num = col_offset + row[0] - val=ws.cell(row_num, col_num).value + val = ws.cell(row_num, col_num).value value = ( val + row[1] if isinstance(val, (int, float)) else row[1] ) # Add to previous value because with class convertions multiple categories can converge into a single one @@ -1069,6 +1058,6 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: output = path.join( self.path_to_output_dir, "{}_{}_r.xlsx".format(self.section_id, self.year) ) - + workbook.save(filename=output) print(f"{datetime.now()}: YRB_run - end: Saved report to {output}") From da0ebce70821a76a9b557625c06e93b56dc09fbb Mon Sep 17 00:00:00 2001 From: maltaesousa Date: Fri, 21 Jun 2024 17:09:19 +0200 Subject: [PATCH 5/5] black --- comptages/core/report.py | 51 ++++++---- comptages/core/statistics.py | 15 ++- comptages/report/yearly_report_bike.py | 132 +++++++++++++++++-------- 3 files changed, 135 insertions(+), 63 deletions(-) diff --git a/comptages/core/report.py b/comptages/core/report.py index 772eeb5..e8e755e 100644 --- a/comptages/core/report.py +++ b/comptages/core/report.py @@ -29,14 +29,21 @@ def prepare_reports( template_name = "template.xlsx" template_path = os.path.join(current_dir, os.pardir, "report", template_name) assert count - _prepare_default_reports(file_path, count, template_path, callback_progress, sections_days) + _prepare_default_reports( + file_path, count, template_path, callback_progress, sections_days + ) elif template == "yearly": template_name = "template_yearly.xlsx" template_path = os.path.join(current_dir, os.pardir, "report", template_name) assert year assert sections_ids _prepare_yearly_report( - file_path, year, template_path, sections_ids, callback_progress, sections_days + file_path, + year, + template_path, + sections_ids, + callback_progress, + sections_days, ) elif template == "yearly_bike": pass @@ -71,8 +78,12 @@ def _prepare_default_reports( output = os.path.join( file_path, f"{section.id}_{monday.strftime('%Y%m%d')}_r.xlsx" ) - QgsMessageLog.logMessage(f"{datetime.now()} - Preparing reports: Adding workbook {i+j*mondays_qty} ({output})", "Comptages", Qgis.Info) - progress = int(100 / mondays_qty / sections_qty * (i+j*mondays_qty)) + QgsMessageLog.logMessage( + f"{datetime.now()} - Preparing reports: Adding workbook {i+j*mondays_qty} ({output})", + "Comptages", + Qgis.Info, + ) + progress = int(100 / mondays_qty / sections_qty * (i + j * mondays_qty)) callback_progress(progress) workbook = load_workbook(filename=template_path) @@ -96,10 +107,14 @@ def _prepare_yearly_report( sections_days: Optional[dict[str, list[date]]] = None, ): """Write default reports to disk (1 per section included in the count)""" - print(f"{datetime.now()}: _prepare_yearly_report: begin, sections_ids: {sections_ids}") + print( + f"{datetime.now()}: _prepare_yearly_report: begin, sections_ids: {sections_ids}" + ) # Get first count to be used as example count_qs = models.Count.objects.filter( - id_installation__lane__id_section=sections_ids[0], start_process_date__year__lte=year, end_process_date__year__gte=year + id_installation__lane__id_section=sections_ids[0], + start_process_date__year__lte=year, + end_process_date__year__gte=year, ) if not count_qs.exists(): info_str = f"{datetime.now()}: Aucun comptage trouvé pour cette section {sections_ids[0]} et cette année {year}" @@ -128,7 +143,9 @@ def _prepare_yearly_report( output = os.path.join(file_path, f"{section.id}_{year}_r.xlsx") workbook.save(filename=output) - print(f"{datetime.now()}: _prepare_yearly_report: ended, sections_ids: {sections_ids}") + print( + f"{datetime.now()}: _prepare_yearly_report: ended, sections_ids: {sections_ids}" + ) def _mondays_of_count(count: models.Count) -> Generator[date, None, None]: @@ -240,12 +257,7 @@ def _data_count_yearly( ws["B14"] = lanes[1].direction_desc -def _data_day( - count: models.Count, - section: models.Section, - monday, - workbook: Workbook -): +def _data_day(count: models.Count, section: models.Section, monday, workbook: Workbook): ws = workbook["Data_day"] # Monthly coefficients @@ -356,10 +368,7 @@ def _data_day( def _data_day_yearly( - count: models.Count, - section: models.Section, - year: int, - workbook: Workbook + count: models.Count, section: models.Section, year: int, workbook: Workbook ): ws = workbook["Data_day"] @@ -373,7 +382,9 @@ def _data_day_yearly( ) if df is None: - print(f"{datetime.now()}:_data_day_yearly - Pas de données pour cette section {section} et cette année {year} /!\\/!\\/!\\") + print( + f"{datetime.now()}:_data_day_yearly - Pas de données pour cette section {section} et cette année {year} /!\\/!\\/!\\" + ) return for i in range(7): @@ -414,7 +425,9 @@ def _data_day_yearly( ) if df is None: - print(f"{datetime.now()}:_data_day_yearly - Pas de données pour cette section:{section}, cette direction:{direction} et cette année:{year} /!\\/!\\/!\\") + print( + f"{datetime.now()}:_data_day_yearly - Pas de données pour cette section:{section}, cette direction:{direction} et cette année:{year} /!\\/!\\/!\\" + ) return for i in range(7): diff --git a/comptages/core/statistics.py b/comptages/core/statistics.py index f3686f7..54f2d75 100644 --- a/comptages/core/statistics.py +++ b/comptages/core/statistics.py @@ -96,7 +96,9 @@ def get_time_data_yearly( qs = qs.filter(id_lane__direction=direction) if not qs.exists(): - print(f"statistics.py : get_time_data_yearly - Nothing found for Year: {year}, Section: {section}, Lane: {lane}, Direction: {direction}.") + print( + f"statistics.py : get_time_data_yearly - Nothing found for Year: {year}, Section: {section}, Lane: {lane}, Direction: {direction}." + ) return None # Vehicles by day and hour @@ -109,7 +111,9 @@ def get_time_data_yearly( .values("import_status", "date", "hour", "thm") ) if not qs.exists(): - print(f"statistics.py : get_time_data_yearly - Nothing found !!! for Year: {year}. Section: {section}. Lane: {lane}. Direction: {direction}. !!!)") + print( + f"statistics.py : get_time_data_yearly - Nothing found !!! for Year: {year}. Section: {section}. Lane: {lane}. Direction: {direction}. !!!)" + ) print(f"statistics.py : get_time_data_yearly - qsa.query={str(qs.query)}") @@ -455,7 +459,9 @@ def get_characteristic_speed_by_hour( .order_by("hour", "speed") .values("hour", "speed") ) - print(f"statistics.py : get_characteristic_speed_by_hour - qs.query={str(qs.query)}") + print( + f"statistics.py : get_characteristic_speed_by_hour - qs.query={str(qs.query)}" + ) df = DataFrame.from_records(qs.values("hour", "speed")) if not df.empty: @@ -569,7 +575,8 @@ def get_special_periods(first_day, last_day) -> QuerySet[models.SpecialPeriod]: def get_month_data( section: models.Section, - start, end, + start, + end, direction=None, exclude_trash=False, ) -> DataFrame: diff --git a/comptages/report/yearly_report_bike.py b/comptages/report/yearly_report_bike.py index ceecd34..285dd89 100644 --- a/comptages/report/yearly_report_bike.py +++ b/comptages/report/yearly_report_bike.py @@ -57,7 +57,9 @@ def total_runs_by_directions(self) -> "ValuesQuerySet[CountDetail, dict[str, Any .values("weekday", "id_lane__direction", "total") ) - def tjms_by_weekday_category(self, direction=None) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": + def tjms_by_weekday_category( + self, direction=None + ) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": # Get all the count details for section and the year # Test/GL qs = CountDetail.objects.filter( @@ -75,7 +77,9 @@ def tjms_by_weekday_category(self, direction=None) -> "ValuesQuerySet[CountDetai .annotate(tjm=Sum("times")) .values("weekday", "id_category__code", "tjm") ) - print(f"yearly_report_bike.py: tjms_by_weekday_category - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py: tjms_by_weekday_category - results.query:{str(results.query)}" + ) return results def tjms_by_weekday_hour(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": @@ -96,15 +100,14 @@ def tjms_by_weekday_hour(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": .values("date") .annotate(tj=Sum("times")) .values("date", "tj") - .annotate( - weekday=ExtractIsoWeekDay("date"), - hour=ExtractHour("timestamp") - ) + .annotate(weekday=ExtractIsoWeekDay("date"), hour=ExtractHour("timestamp")) .values("weekday", "hour") .annotate(tjm=Avg("tj")) .values("weekday", "hour", "tjm") ) - print(f"yearly_report_bike.py : tjms_by_weekday_hour - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : tjms_by_weekday_hour - results.query:{str(results.query)}" + ) return results def total_runs_by_hour_and_direction( @@ -129,7 +132,9 @@ def total_runs_by_hour_and_direction( ) .values("runs", "hour", "direction", "section") ) - print(f"yearly_report_bike.py : total_runs_by_hour_and_direction - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : total_runs_by_hour_and_direction - results.query:{str(results.query)}" + ) def partition(acc: dict, val: dict) -> dict: hour = val["hour"] @@ -162,7 +167,9 @@ def total_runs_by_hour_one_direction(self, direction: int) -> dict[int, Any]: .annotate(day=ExtractIsoWeekDay("timestamp")) .order_by("day") ) - print(f"yearly_report_bike.py : total_runs_by_hour_one_direction - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : total_runs_by_hour_one_direction - results.query:{str(results.query)}" + ) def reducer(acc: dict, val: dict) -> dict: day = val["day"] @@ -196,7 +203,9 @@ def total_runs_by_hour_weekday_one_direction( .annotate(day=ExtractIsoWeekDay("timestamp")) .order_by("day") ) - print(f"yearly_report_bike.py : total_runs_by_hour_weekday_one_direction - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : total_runs_by_hour_weekday_one_direction - results.query:{str(results.query)}" + ) return results def tjms_by_weekday_and_month( @@ -223,7 +232,9 @@ def tjms_by_weekday_and_month( .annotate(month=ExtractMonth("timestamp")) .values("week_day", "month", "daily_runs") ) - print(f"yearly_report_bike.py : tjms_by_weekday_and_month - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : tjms_by_weekday_and_month - results.query:{str(results.query)}" + ) # FIXME # Aggregation via `values()` into `annotate()` all the way to the end result would be more performant. @@ -254,7 +265,9 @@ def tjms_by_weekday_and_month( return builder - def runs_by_weekday_and_month(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": + def runs_by_weekday_and_month( + self, + ) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": # Get all the count details for section and the year qs = CountDetail.objects.filter( id_lane__id_section__id=self.section_id, @@ -264,13 +277,16 @@ def runs_by_weekday_and_month(self) -> "ValuesQuerySet[CountDetail, dict[str, An # Group by month, week_day results = ( - qs.annotate(month=ExtractMonth("timestamp"), - week_day=ExtractIsoWeekDay("timestamp")) + qs.annotate( + month=ExtractMonth("timestamp"), week_day=ExtractIsoWeekDay("timestamp") + ) .values("month", "week_day") .annotate(daily_runs=Sum("times")) .values("month", "week_day", "daily_runs") ) - print(f"yearly_report_bike.py : runs_by_weekday_and_month - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : runs_by_weekday_and_month - results.query:{str(results.query)}" + ) return results @@ -288,12 +304,15 @@ def nb_weekday_by_month(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": .values("date") .annotate(daily_runs=Sum("times")) .values("date", "daily_runs") - .annotate(month=ExtractMonth("timestamp"), - week_day=ExtractIsoWeekDay("timestamp")) + .annotate( + month=ExtractMonth("timestamp"), week_day=ExtractIsoWeekDay("timestamp") + ) .values("date", "month", "week_day") # .order_by("date") ) - print(f"yearly_report_bike.py : nb_weekday_by_month - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : nb_weekday_by_month - results.query:{str(results.query)}" + ) def reducer(acc: dict, item) -> dict: @@ -326,7 +345,9 @@ def total_runs_by_day(self) -> "ValuesQuerySet[CountDetail, dict[str, Any]]": .values("date", "daily_runs") # .order_by("date") ) - print(f"yearly_report_bike.py : total_runs_by_day - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : total_runs_by_day - results.query:{str(results.query)}" + ) return results @@ -344,7 +365,9 @@ def tjms_total_runs_by_day_of_week(self) -> dict[str, Any]: .values("week_day", "daily_runs") .order_by("week_day") ) - print(f"yearly_report_bike.py : tjms_total_runs_by_day_of_week - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : tjms_total_runs_by_day_of_week - results.query:{str(results.query)}" + ) # FIXME # Aggregation via `values()` into `annotate()` all the way to the end result would be more performant. @@ -381,7 +404,9 @@ def total_runs_by_class(self) -> dict[str, Any]: .annotate(runs=Sum("times"), code=F("id_category__code")) .values("day", "runs", "code") ) - print(f"yearly_report_bike.py : total_runs_by_class - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : total_runs_by_class - results.query:{str(results.query)}" + ) def reducer(acc: dict, i: dict): code = i["code"] @@ -409,7 +434,9 @@ def tjms_by_direction_bike( ) assert qs.exists() results = qs.aggregate(res=Sum("times"))["res"] - print(f"yearly_report_bike.py : tjms_by_direction_bike - results.query:{str(results.query)}") + print( + f"yearly_report_bike.py : tjms_by_direction_bike - results.query:{str(results.query)}" + ) # TODO: avoid the division? return results / 365 @@ -493,7 +520,9 @@ def count_details_by_day_month(self, count: modelCount) -> dict[int, Any]: .values("month", "day") .annotate(Sum("times")) ) - print(f"yearly_report_bike.py : count_details_by_day_month - qs.query:{str(qs.query)}") + print( + f"yearly_report_bike.py : count_details_by_day_month - qs.query:{str(qs.query)}" + ) def reducer(acc, item): month = item["month"] @@ -521,7 +550,9 @@ def count_details_by_various_criteria( .exclude(id_category__name__in=categories_name_to_exclude) .values_list("id_category", flat=True) ) - print(f"yearly_report_bike.py : count_details_by_various_criteria - categories_ids.query:{str(categories_ids.query)}") + print( + f"yearly_report_bike.py : count_details_by_various_criteria - categories_ids.query:{str(categories_ids.query)}" + ) # Base QuerySet base_qs = CountDetail.objects.filter( @@ -529,7 +560,9 @@ def count_details_by_various_criteria( id_category__in=categories_ids, timestamp__year=self.year, ) - print(f"yearly_report_bike.py : count_details_by_various_criteria - base_qs.query:{str(base_qs.query)}") + print( + f"yearly_report_bike.py : count_details_by_various_criteria - base_qs.query:{str(base_qs.query)}" + ) # Specialized QuerySets total_runs_in_year = ( @@ -537,17 +570,19 @@ def count_details_by_various_criteria( .values("category_name") .annotate(value=Sum("times")) ) - print(f"yearly_report_bike.py : count_details_by_various_criteria - total_runs_in_year.query:{str(total_runs_in_year.query)}") + print( + f"yearly_report_bike.py : count_details_by_various_criteria - total_runs_in_year.query:{str(total_runs_in_year.query)}" + ) busy_date = ( - base_qs.annotate( - date=TruncDate("timestamp") - ) + base_qs.annotate(date=TruncDate("timestamp")) .values("date") .annotate(value=Sum("times")) .order_by("-value") ) - print(f"yearly_report_bike.py : count_details_by_various_criteria - busy_date.query:{str(busy_date.query)}") + print( + f"yearly_report_bike.py : count_details_by_various_criteria - busy_date.query:{str(busy_date.query)}" + ) busiest_date = busy_date.first() least_busy_date = busy_date.last() @@ -562,7 +597,9 @@ def count_details_by_various_criteria( .values("date", "category_name") .annotate(value=Sum("times")) ) - print(f"yearly_report_bike.py : count_details_by_various_criteria - busiest_date_row.query:{str(busiest_date_row.query)}") + print( + f"yearly_report_bike.py : count_details_by_various_criteria - busiest_date_row.query:{str(busiest_date_row.query)}" + ) least_busy_date_row = ( base_qs.annotate( @@ -572,7 +609,9 @@ def count_details_by_various_criteria( .values("date", "category_name") .annotate(value=Sum("times")) ) - print(f"yearly_report_bike.py : count_details_by_various_criteria - least_busy_date_row.query:{str(least_busy_date_row.query)}") + print( + f"yearly_report_bike.py : count_details_by_various_criteria - least_busy_date_row.query:{str(least_busy_date_row.query)}" + ) busy_month = ( base_qs.annotate(month=ExtractMonth("timestamp")) @@ -580,7 +619,9 @@ def count_details_by_various_criteria( .annotate(value=Sum("times")) .order_by("-value") ) - print(f"yearly_report_bike.py : count_details_by_various_criteria - busy_month.query:{str(busy_month.query)}") + print( + f"yearly_report_bike.py : count_details_by_various_criteria - busy_month.query:{str(busy_month.query)}" + ) busiest_month = busy_month.first() least_busy_month = busy_month.last() @@ -618,7 +659,9 @@ def count_details_by_various_criteria( total_runs_busiest_hour_weekday = busiest_hour.exclude(week_day__gt=5) total_runs_busiest_hour_weekend = busiest_hour.exclude(week_day__lt=6) - print(f"yearly_report_bike.py : count_details_by_various_criteria - busiest_weekend_hour.query:{str(total_runs_busiest_hour_weekend.query)}") + print( + f"yearly_report_bike.py : count_details_by_various_criteria - busiest_weekend_hour.query:{str(total_runs_busiest_hour_weekend.query)}" + ) busiest_weekday = total_runs_busiest_hour_weekday.first() busiest_weekend = total_runs_busiest_hour_weekend.first() @@ -672,7 +715,9 @@ def count_details_by_season(self, count_id) -> dict[int, Any]: .annotate(value=Sum("times")) .values("date", "category_name", "value") ) - print(f"yearly_report_bike.py : count_details_by_season - count_details.query:{str(count_details.query)}") + print( + f"yearly_report_bike.py : count_details_by_season - count_details.query:{str(count_details.query)}" + ) # Preparing to collect data def reducer(acc: dict, detail) -> dict: @@ -760,7 +805,10 @@ def get_category_data_by_dow( .values("week_day", "value") .values_list("week_day", "value") ) - print("yearly_report_bike.py : get_category_data_by_dow - qs.query=", str(qs.query)) + print( + "yearly_report_bike.py : get_category_data_by_dow - qs.query=", + str(qs.query), + ) return qs @@ -788,7 +836,9 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: section_start_dist = render_section_dist(section.start_dist) section_end_dist = render_section_dist(section.end_dist) - ws["B3"] = f""" + ws[ + "B3" + ] = f""" Poste de comptage : {section.id} Axe : {section.owner}:{section.road}{section.way} PR {section.start_pr} + {section_start_dist} m à PR {section.end_pr} + {section_end_dist} m @@ -807,8 +857,8 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: QgsMessageLog.logMessage( f"{datetime.now()} - Aucun conmptage pour cette année ({self.year}) et cette section ({self.section_id})", "Comptages", - Qgis.Info - ) + Qgis.Info, + ) return count = count_detail[0].id_count @@ -980,7 +1030,9 @@ def render_section_dist(value: Union[str, Decimal, None]) -> str: .distinct() .order_by("code") ) - print(f"yearly_report_bike.py : Data_category, Direction Mario, categories.query={str(categories.query)}") + print( + f"yearly_report_bike.py : Data_category, Direction Mario, categories.query={str(categories.query)}" + ) # Direction 1 row_offset = 5