Skip to content

Commit

Permalink
implementation of yearly bike report miscellaneous statistics
Browse files Browse the repository at this point in the history
  • Loading branch information
why-not-try-calmer committed Jan 31, 2024
1 parent 59404a8 commit 66801a6
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 101 deletions.
86 changes: 63 additions & 23 deletions comptages/report/yearly_report_bike.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from datetime import datetime, date
from datetime import datetime
from functools import reduce
import os
from typing import Any
from typing import Any, Iterable, Optional


from django.db.models import Sum, Count, F
Expand Down Expand Up @@ -267,7 +267,9 @@ def reducer(acc, item):
return reduce(reducer, qs, {})

@staticmethod
def count_details_by_various_criteria(count: modelCount) -> dict[str, Any]:
def count_details_by_various_criteria(
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"
# Excluding irrelevant
Expand All @@ -286,16 +288,16 @@ def count_details_by_various_criteria(count: modelCount) -> dict[str, Any]:
total_runs_in_year = (
base_qs.annotate(category_name=F("id_category__name"))
.values("category_name")
.annotate(total_runs=Sum("times"))
.annotate(value=Sum("times"))
)

qs = (
base_qs.annotate(
category_name=F("id_category__name"), date=TruncDate("timestamp")
)
.values("date", "category_name")
.annotate(Sum("times"))
.order_by("-times__sum")
.annotate(value=Sum("times"))
.order_by("-value")
)
busiest_date = qs.first()
least_busy_date = qs.last()
Expand All @@ -308,22 +310,22 @@ def count_details_by_various_criteria(count: modelCount) -> dict[str, Any]:
)
.filter(date=busiest_date["date"])
.values("date", "category_name")
.annotate(Sum("times"))
.annotate(value=Sum("times"))
)
least_busy_date_row = (
base_qs.annotate(
date=TruncDate("timestamp"), category_name=F("id_category__name")
)
.filter(date=least_busy_date["date"])
.values("date", "category_name")
.annotate(Sum("times"))
.annotate(value=Sum("times"))
)

qs = (
base_qs.annotate(month=ExtractMonth("timestamp"))
.values("month")
.annotate(Sum("times"))
.order_by("-times__sum")
.annotate(value=Sum("times"))
.order_by("-value")
)
busiest_month = qs.first()
least_busy_month = qs.last()
Expand All @@ -336,15 +338,15 @@ def count_details_by_various_criteria(count: modelCount) -> dict[str, Any]:
)
.filter(month=busiest_month["month"])
.values("month", "category_name")
.annotate(Sum("times"))
.annotate(value=Sum("times"))
)
least_busy_month_row = (
base_qs.annotate(
month=ExtractMonth("timestamp"), category_name=F("id_category__name")
)
.filter(month=least_busy_month["month"])
.values("month", "category_name")
.annotate(Sum("times"))
.annotate(value=Sum("times"))
)

qs = (
Expand All @@ -355,20 +357,34 @@ def count_details_by_various_criteria(count: modelCount) -> dict[str, Any]:
week_day=ExtractIsoWeekDay("timestamp"),
)
.values("date", "hour", "category_name")
.annotate(Sum("times"))
.order_by("-times__sum")
.annotate(value=Sum("times"))
.order_by("-value")
)
total_runs_busiest_hour_weekday = qs.exclude(week_day__gt=5).first()
total_runs_busiest_hour_weekend = qs.exclude(week_day__lt=6).first()
total_runs_busiest_hour_weekday = qs.exclude(week_day__gt=5)
total_runs_busiest_hour_weekend = qs.exclude(week_day__lt=6)

busiest_weekday = total_runs_busiest_hour_weekday.first()
busiest_weekend = total_runs_busiest_hour_weekend[:2]
assert busiest_weekday
assert busiest_weekend

return {
"busiest_date_row": busiest_date_row,
"least_busy_date_row": least_busy_date_row,
"busiest_month_row": busiest_month_row,
"least_busy_month_row": least_busy_month_row,
"total_runs_busiest_hour_weekday": total_runs_busiest_hour_weekday,
"total_runs_busiest_hour_weekend": total_runs_busiest_hour_weekend,
"total_runs_in_year": total_runs_in_year,
"busiest_date_row": (busiest_date_row, busiest_date["date"]),
"least_busy_date_row": (least_busy_date_row, str(least_busy_date["date"])),
"busiest_month_row": (busiest_month_row, str(busiest_month["month"])),
"least_busy_month_row": (
least_busy_month_row,
str(least_busy_month["month"]),
),
"total_runs_busiest_hour_weekday": (
total_runs_busiest_hour_weekday,
str(busiest_weekday["date"]),
),
"total_runs_busiest_hour_weekend": (
total_runs_busiest_hour_weekend,
", ".join(str(item["date"]) for item in busiest_weekend),
),
"total_runs_in_year": (total_runs_in_year, None),
}

@staticmethod
Expand Down Expand Up @@ -430,6 +446,30 @@ def reducer(acc: dict, detail) -> dict:
# Collecting
return reduce(reducer, count_details, {})

@staticmethod
def write_to_row(
*,
row_name: str,
row: Iterable,
data: dict,
key: str,
column_names: Iterable[str],
):
items, day_or_month_or_weekend = data[row_name]
for column_name, cell in zip(column_names, row):
if column_name == "day_or_month_or_weekend":
cell.value = day_or_month_or_weekend or "-"
elif item := next(
filter(
lambda item: (item[key] == column_name),
items,
),
None,
):
cell.value = item["value"]
else:
cell.value = "-"

def run(self):
current_dir = os.path.dirname(os.path.abspath(__file__))
template = os.path.join(current_dir, "template_yearly_bike.xlsx")
Expand Down
105 changes: 27 additions & 78 deletions comptages/test/test_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,84 +198,33 @@ def test_busiest_by_various_criteria(self):
)
wb = load_workbook(path_to_inputs)

def write_to_print_area(
*,
print_area: Iterable,
data: Iterable[dict],
item_key: str,
column_names: Iterable[str],
):
for column_name, cell in zip(column_names, print_area):
if value := next(
filter(
lambda item: (
item[item_key] == column_name if item_key in item else False
),
data,
),
None,
):
cell.value = value

# Write data & save
print(data)
ws = wb["Data_yearly_stats"]
column_names = ("VELO", "MONO", "SHORT", "SPECIAL", "MULTI")

print_area = ws["B2:G2"]
write_to_print_area(
data=data["busiest_month_row"],
item_key="column_name",
print_area=print_area,
column_names=column_names,
)

print_area = ws["B3:G3"]
write_to_print_area(
data=data["least_busy_date_row"],
item_key="column_name",
print_area=print_area,
column_names=column_names,
)

print_area = ws["B4:G4"]
write_to_print_area(
data=data["busiest_month_row"],
item_key="column_name",
print_area=print_area,
column_names=column_names,
)

print_area = ws["B5:G5"]
write_to_print_area(
data=data["least_busy_month_row"],
item_key="column_name",
print_area=print_area,
column_names=column_names,
)

print_area = ws["B6:G6"]
write_to_print_area(
data=data["total_runs_busiest_hour_weekday"],
item_key="column_name",
print_area=print_area,
column_names=column_names,
)

print_area = ws["B7:G7"]
write_to_print_area(
data=data["total_runs_busiest_hour_weekend"],
item_key="column_name",
print_area=print_area,
column_names=column_names,
)

print_area = ws["B8:G8"]
write_to_print_area(
data=data["total_runs_busiest_hour_weekend"],
item_key="column_name",
print_area=print_area,
column_names=column_names,
)

column_names = (
"VELO",
"MONO",
"SHORT",
"SPECIAL",
"MULTI",
"day_or_month_or_weekend",
)
row_names = (
"total_runs_in_year",
"busiest_date_row",
"least_busy_date_row",
"busiest_month_row",
"least_busy_month_row",
"total_runs_busiest_hour_weekday",
"total_runs_busiest_hour_weekend",
)
print_area = ws["B2:G8"]
for row_idx, row_name in enumerate(row_names, 0):
row = print_area[row_idx]
YearlyReportBike.write_to_row(
row_name=row_name,
row=row,
data=data,
key="category_name",
column_names=column_names,
)
wb.save(path_to_outputs)

0 comments on commit 66801a6

Please sign in to comment.