From e9581411235a687edd119a24b2fd01bfb6c13b9f Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sun, 15 Oct 2023 00:32:11 -0500 Subject: [PATCH] EX 2.2 --- ex22.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++ readport.py | 4 +-- readrides.py | 1 + 3 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 ex22.py diff --git a/ex22.py b/ex22.py new file mode 100644 index 0000000..b192f98 --- /dev/null +++ b/ex22.py @@ -0,0 +1,69 @@ +from collections import Counter, defaultdict +from pprint import pprint + +from readrides import read_rides, row_to_dataclass + + +def count_routes(data): + return len({row.route for row in data}) + + +def rider_count(data, date=None, route=None): + if date and not isinstance(date, tuple): + date = (date,) + if route and isinstance(route, tuple): + route = (route,) + + def _filterfunc(row): + if (date and row.date not in date): + return False + if (route and row.route not in route): + return False + return True + + return sum(row.rides for row in data if _filterfunc(row)) + + +def rides_per_route(data): + ride_counts = Counter() + for row in data: + ride_counts[row.route] += row.rides + return dict(ride_counts) + + +def ten_year_increase(data): + ridership = defaultdict(Counter) + routes = defaultdict(set) + for row in data: + if '/2001' in row.date: + year = 2001 + elif '/2011' in row.date: + year = 2011 + else: + continue + ridership[year][row.route] += row.rides + routes[year].add(row.route) + increases = Counter() + for route in (routes[2001] & routes[2011]): + difference = ridership[2011][route] - ridership[2001][route] + if difference >= 0: + increases[route] = difference + return increases + + +if __name__ == '__main__': + filename = 'Data/ctabus.csv' + data = read_rides(filename, row_to_dataclass) + + print("Number of bus routes: ", count_routes(data)) + print("Ridership count, 22 bus on 2/2/2011:", + rider_count(data, date='02/02/2011', route='22')) + print("Total Ridership Per Route:") + print(" Route | Ridership") + print(" -------+-----------") + total_ridership = rides_per_route(data) + for route in sorted(total_ridership.keys()): + rides = total_ridership[route] + print(f" {route:>5} | {rides}") + print("Route ridership increases, 2001 - 2011") + pprint(ten_year_increase(data).most_common(5)) diff --git a/readport.py b/readport.py index 6f38e5a..bede6c2 100644 --- a/readport.py +++ b/readport.py @@ -1,10 +1,11 @@ import csv + def read_portfolio(filename): portfolio = [] with open(filename) as f: rows = csv.reader(f) - headers = next(rows) + _ = next(rows) for row in rows: record = { 'name': row[0], @@ -13,4 +14,3 @@ def read_portfolio(filename): } portfolio.append(record) return portfolio - diff --git a/readrides.py b/readrides.py index 9b0ac11..44deeb1 100644 --- a/readrides.py +++ b/readrides.py @@ -5,6 +5,7 @@ from dataclasses import dataclass @dataclass class DataClassRow: + __slots__ = ['route', 'date', 'daytype', 'rides'] route: str date: str daytype: str