forked from dabeaz-course/python-mastery
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreadrides.py
More file actions
152 lines (131 loc) · 4.61 KB
/
Copy pathreadrides.py
File metadata and controls
152 lines (131 loc) · 4.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# readrides.py
import csv
from collections import namedtuple
class Ride(object):
def __init__(self, route, date, daytype, rides):
self._route = route
self._date = date
self._daytype = daytype
self._rides = rides
class SlotRide(object):
__slots__ = ['_route', '_date', '_daytype', '_rides']
def __init__(self, route, date, daytype, rides):
self._route = route
self._date = date
self._daytype = daytype
self._rides = rides
TupRide = namedtuple('TupRide', ['route', 'date', 'daytype', 'rides'])
def read_rides_as_strings(filename):
"""
Read the bus ride data as a list of strings
"""
records = []
with open(filename) as f:
for row in f:
records.append(row)
return records
def read_rides_as_tuples(filename):
"""
Read the bus ride data as a list of tuples
"""
records = []
with open(filename) as f:
rows = csv.reader(f)
headings = next(rows) # skip headers
for row in rows:
route, date, daytype, rides = row
rides = int(rides)
records.append((route, date, daytype, rides))
return records
def read_rides_as_namedtuples(filename):
"""
Read the bus ride data as a list of named tuples
"""
records = []
with open(filename) as f:
rows = csv.reader(f)
headings = next(rows) # skip headers
for row in rows:
route, date, daytype, rides = row
rides = int(rides)
records.append(TupRide(route, date, daytype, rides))
return records
def read_rides_as_dicts(filename):
"""
Read the bus ride data as a list of dictionaries
"""
records = []
with open(filename) as f:
rows = csv.reader(f)
headings = next(rows) # skip headers
for row in rows:
route, date, daytype, rides = row
record = dict(
zip(
('route', 'date', 'daytype', 'rides'),
(route, date, daytype, int(rides))))
records.append(record)
return records
def read_rides_as_objects(filename):
"""
Read the bus ride data as a list of objects
"""
records = []
with open(filename) as f:
rows = csv.reader(f)
headings = next(rows) # skip headers
for row in rows:
route, date, daytype, rides = row
records.append(Ride(route, date, daytype, int(rides)))
return records
def read_rides_as_slobjects(filename):
"""
Read the bus ride data as a list of objects with slots
"""
records = []
with open(filename) as f:
rows = csv.reader(f)
headings = next(rows) # skip headers
for row in rows:
route, date, daytype, rides = row
records.append(SlotRide(route, date, daytype, int(rides)))
return records
def anal(dicts):
# how many bus routes exist in Chicago
routes = {d['route'] for d in dicts}
print('Number of bus routes: ', len(routes))
# how many people rode the number 22 bus on February 2, 2011?
rides = [d['rides'] for d in dicts if d['route']=='22' and d['date']=='02/02/2011']
print('Riders on a given day: ', sum(rides))
# what's the total number of rides taken on each bus route?
from collections import Counter
totals = Counter()
for d in dicts:
totals[d['route']] += d['rides']
print('Total rides by route: ', totals.most_common(5))
# what five bus routes had the greatest ten-year increase in ridershiop from 2001 to 2011?
old = {d['route']: d['rides'] for d in dicts if d['date'].endswith('2001')}
new = {d['route']: d['rides'] for d in dicts if d['date'].endswith('2011')}
increases = Counter()
for route, rides in new.items():
increases[route] += rides - old.get(route, 0)
print('Top five increases: ', increases.most_common(5))
if __name__ == "__main__":
import sys
import tracemalloc
if len(sys.argv) != 3:
raise SystemExit('usage: readrides filename datastructure[strings, tuples, namedtupes, dicts, objects, slots]')
callmap = {
"strings": read_rides_as_strings,
"tuples": read_rides_as_tuples,
"namedtuples": read_rides_as_namedtuples,
"dicts": read_rides_as_dicts,
"obs": read_rides_as_objects,
"slobs": read_rides_as_slobjects,
}
reader, filename = callmap[sys.argv[2]], sys.argv[1]
tracemalloc.start()
recs = reader(filename)
print('Memory Use: Current %d, Peak %d' % tracemalloc.get_traced_memory())
if sys.argv[2] == 'dicts':
anal(recs)