buses.py

Wed, 21 Jun 2017 18:25:09 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Wed, 21 Jun 2017 18:25:09 +0300
changeset 28
670ffa424ded
parent 26
69cc75506d4f
child 29
2c78e68d7363
permissions
-rw-r--r--

Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi

0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 #!/usr/bin/env python3
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
2 import enum, json
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
3 from sys import stderr
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
4 from datetime import date, time, datetime, timedelta
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
5 from copy import copy
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
6 from misc import *
7
f3791dccfd03 Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 5
diff changeset
7 from geometry import *
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
8
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
9 def transform_trip_reference(reference):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
10 return reference
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
12 class BusTrip:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
13 def __init__(self, reference, route, service, length):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
14 self.reference, self.route, self.service = reference, route, service
22
3d094a804af8 lisää muutoksia
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
15 self.length = length
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
16 self.schedule = []
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
17 self.name = transform_trip_reference(reference)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
18 def __repr__(self):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
19 return 'all_trips[%r]' % self.name
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
20 def contains_stop(self, stop):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
21 for halt in self.schedule:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
22 if halt.stop is stop:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
23 return halt
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
24 else:
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
25 return None
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
26 def is_served_at(self, day):
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
27 try:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
28 return self.service in services_for_day[day]
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
29 except KeyError:
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
30 return False
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
31 def concise_schedule(self, starting_stop = None):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
32 if starting_stop and starting_stop in self.schedule:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
33 schedule = copy(self.schedule)
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
34 schedule = schedule[schedule.index(starting_stop):]
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
35 else:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
36 schedule = self.schedule
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
37 used_areas = set()
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
38 result = []
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
39 for halt in schedule:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
40 stop = halt.stop
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
41 if stop.region and stop.region not in used_areas:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
42 used_areas.add(stop.region)
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
43 result.append(stop.region)
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
44 return result
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
45
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
46 class BusRoute:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
47 def __init__(self, entry):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
48 self.id = entry['route_id']
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
49 self.reference = entry['route_short_name']
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
50 self.trips = set()
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
51 def __repr__(self):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
52 return 'routes[%r]' % self.reference
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
53
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
54 class BusService:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
55 def __init__(self, reference):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
56 self.reference = reference
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
57 self.dates = set()
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
58 def __repr__(self):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
59 return 'services[%r]' % self.reference
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
60
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
61 class BusStop:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
62 def __init__(self, reference, name, location):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
63 self.reference, self.name, self.location = reference, name, location
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
64 self.cluster = None
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
65 self.pairs = set() # samannimiset lähellä olevat pysäkit
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
66 self.involved_trips = set()
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
67 def __repr__(self):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
68 return 'bus_stops[%r]' % self.reference
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
69 def schedule(self, max_amount = 50):
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
70 '''
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
71 Hakee tämän pysäkin seuraavat `määrä` lähtöä. Päätepysäkille saapuvia busseja ei
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
72 lasketa. Palauttaa pysähdykset listana jossa alkiot ovat muotoa (aika, halt),
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
73 jossa:
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
74 - `aika` on saapumishetki muotoa datetime ja
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
75 - `halt` on vastaava BusHalt olio.
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
76
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
77 Mikäli pysäkille ei ole määrätty riittävästi pysähdyksiä kalenterissa, tuloslista
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
78 jää alimittaiseksi, mahdollisesti jopa tyhjäksi.
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
79 '''
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
80 result = []
20
3199e289ae62 - Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents: 19
diff changeset
81 # -1 päivää yövuoroja varten
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
82 date = today() - timedelta(days = 1)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
83 # Niin kauan kuin aikatauluja ei ole vielä tarpeeksi,
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
84 while len(result) < max_amount:
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
85 try:
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
86 # hae nykyisen päivän aikataulut ja lisää ne,
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
87 result += self.schedule_for_day(date)
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
88 except ValueError:
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
89 # paitsi jos mentiin kalenterin ulkopuolelle, jolloin lopetetaan,
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
90 break
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
91 # ja siirry seuraavaan päivään.
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
92 date += timedelta(1)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
93 # Typistä lopputulos haluttuun tulosmäärään.
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
94 return result[:max_amount]
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
95 def schedule_for_day(self, date):
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
96 '''
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
97 Hakee pysäkin aikataulut tiettynä päivänä.
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
98 '''
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
99 # Jos päädyttiin aikataulukalenterin ulkopuolelle, niin tuotetaan virhe. Jos vain
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
100 # palautettaisiin tyhjä result, niin algoritmi jatkaisi etsintää loputtomiin.
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
101 if date > viimeinen_käyttöpäivä:
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
102 raise ValueError('tried to retrieve schedule for date %s which is outside schedule data' % date)
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
103 result = []
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
104 # Jokaiselle ajovuorolle,
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
105 for trip in self.involved_trips:
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
106 # jos tämä ajovuoro ajetaan tänä päivänä
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
107 if trip.is_served_at(date):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
108 # ja jos tämä trip pysähtyy tällä pysäkillä, ei kuitenkaan saapuen
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
109 # päätepysäkille,
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
110 stop = trip.contains_stop(self)
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
111 if stop and not stop.isArrival: # stop is not trip.schedule[-1]:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
112 # ja jos tämä halt on tulevaisuudessa,
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
113 stop_time = datetime.combine(date, time()) + stop.arrival_time
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
114 if stop_time >= now():
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
115 # lisää halt listaan.
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
116 result.append({
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
117 'time': stop_time,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
118 'trip': trip,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
119 'stop': stop,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
120 })
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
121 # Lajittele lopputulos saapumisajan mukaan.
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
122 result.sort(key = lambda schedule_entry: schedule_entry['time'])
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
123 return result
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
124
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
125 class BusHalt:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
126 def __init__(self, arrival_time, departure_time, stop, trip, traveled_distance):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
127 self.arrival_time, self.departure_time, self.stop, self.trip = arrival_time, departure_time, \
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
128 stop, trip
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
129 self.traveled_distance = traveled_distance
23
3a495bc4b7b5 optimointia
Teemu Piippo <teemu@hecknology.net>
parents: 22
diff changeset
130 @property
22
3d094a804af8 lisää muutoksia
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
131 def isArrival(self):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
132 if not hasattr(self, 'cachedIsArrival'):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
133 iterator = iter(self.trip.schedule)
22
3d094a804af8 lisää muutoksia
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
134 stop = next(iterator)
23
3a495bc4b7b5 optimointia
Teemu Piippo <teemu@hecknology.net>
parents: 22
diff changeset
135 while stop is not self:
3a495bc4b7b5 optimointia
Teemu Piippo <teemu@hecknology.net>
parents: 22
diff changeset
136 stop = next(iterator)
3a495bc4b7b5 optimointia
Teemu Piippo <teemu@hecknology.net>
parents: 22
diff changeset
137 for stop in iterator:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
138 if stop.stop.region != self.stop.region:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
139 self.cachedIsArrival = False
23
3a495bc4b7b5 optimointia
Teemu Piippo <teemu@hecknology.net>
parents: 22
diff changeset
140 break
3a495bc4b7b5 optimointia
Teemu Piippo <teemu@hecknology.net>
parents: 22
diff changeset
141 else:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
142 self.cachedIsArrival = True
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
143 return self.cachedIsArrival
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
144 def __repr__(self):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
145 return 'BusHalt(%r, %r, %r, %r)' % (self.arrival_time, self.departure_time, self.stop, self.trip)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
146
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
147 routes = {}
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
148 routes_per_id = {}
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
149 all_trips = {}
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
150 services = {}
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
151 bus_stops = {}
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
152 all_clusters = set()
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
153
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
154 print('Ladataan routes... ', file = stderr, end = '', flush = True)
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
155 with open('gtfs/routes.txt') as file:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
156 for row in read_csv(file):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
157 route = BusRoute(row)
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
158 routes[route.reference] = route
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
159 routes_per_id[route.id] = route
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
160 print('%d linjaa' % len(routes), file = stderr)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
161
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
162 print('Ladataan ajovuorot... ', file = stderr, end = '', flush = True)
22
3d094a804af8 lisää muutoksia
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
163
3d094a804af8 lisää muutoksia
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
164 shape_distances = {}
3d094a804af8 lisää muutoksia
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
165 with open('gtfs/shapes.txt') as file:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
166 for row in read_csv(file):
22
3d094a804af8 lisää muutoksia
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
167 shape_distances[row['shape_id']] = max(shape_distances.get(row['shape_id'], 0), float(row['shape_dist_traveled']))
3d094a804af8 lisää muutoksia
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
168
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
169 with open('gtfs/trips.txt') as file:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
170 for row in read_csv(file):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
171 if row['service_id'] not in services:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
172 services[row['service_id']] = BusService(row['service_id'])
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
173 route = routes_per_id[row['route_id']]
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
174 trip = BusTrip(
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
175 reference = row['trip_id'],
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
176 route = route,
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
177 service = services[row['service_id']],
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
178 length = shape_distances[row['shape_id']]
22
3d094a804af8 lisää muutoksia
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
179 )
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
180 route.trips.add(trip)
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
181 assert trip.name not in all_trips
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
182 all_trips[trip.name] = trip
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
183 print('%d ajoa' % len(all_trips), file = stderr)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
184
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
185 def lue_päiväys(teksti):
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
186 return date(int(teksti[:4]), int(teksti[4:6]), int(teksti[6:]))
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
187
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
188 def read_time(teksti):
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
189 tunti, minuutti, sekunti = map(int, teksti.split(':'))
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
190 return timedelta(hours = tunti, minutes = minuutti, seconds = sekunti)
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
191
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
192 print('Ladataan päiväykset... ', file = stderr, flush = True)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
193
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
194 viimeinen_käyttöpäivä = date.today()
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
195 services_for_day = {}
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
196
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
197 with open('gtfs/calendar_dates.txt') as file:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
198 for row in read_csv(file):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
199 service = services[row['service_id']]
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
200 day = lue_päiväys(row['date'])
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
201 service.dates.add(day)
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
202 if day not in services_for_day:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
203 services_for_day[day] = set()
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
204 services_for_day[day].add(service)
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
205 viimeinen_käyttöpäivä = max(day, viimeinen_käyttöpäivä)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
206
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
207 def services_available_at(day):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
208 for service in services.values():
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
209 if day in service.dates:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
210 yield service
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
211
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
212 print('Ladataan pysäkit... ', file = stderr, end = '', flush = True)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
213 with open('gtfs/stops.txt') as file:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
214 for row in read_csv(file):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
215 location = Sijainti(float(row['stop_lat']), float(row['stop_lon']))
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
216 stop = BusStop(row['stop_id'], row['stop_name'], location)
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
217 bus_stops[stop.reference] = stop
7
f3791dccfd03 Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 5
diff changeset
218 with open('regions-per-stop.json') as file:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
219 for stop_reference, region in json.load(file).items():
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
220 bus_stops[stop_reference].region = region
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
221 print('%d pysäkkiä' % len(bus_stops), file = stderr)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
222
21
6a0394d5a159 Yleistä päivittelyä
Teemu Piippo <teemu@hecknology.net>
parents: 20
diff changeset
223
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
224 class BusStopCluster:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
225 def __init__(self):
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
226 self.stops = set()
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
227 self._center = None
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
228 self.name = None
21
6a0394d5a159 Yleistä päivittelyä
Teemu Piippo <teemu@hecknology.net>
parents: 20
diff changeset
229 @property
6a0394d5a159 Yleistä päivittelyä
Teemu Piippo <teemu@hecknology.net>
parents: 20
diff changeset
230 def url_name(self):
6a0394d5a159 Yleistä päivittelyä
Teemu Piippo <teemu@hecknology.net>
parents: 20
diff changeset
231 return self.name.lower().replace('(', '').replace(')', '').replace(' ', '-')
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
232 def add_stop(self, stop):
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
233 assert not stop.cluster
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
234 stop.cluster = self
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
235 self.stops.add(stop)
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
236 self._center = None
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
237 @property
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
238 def center(self):
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
239 if not self._center:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
240 if self.stops:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
241 from statistics import median
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
242 pointtype = type(next(iter(self.stops)).location)
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
243 self._center = pointtype(
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
244 median(stop.location.x for stop in self.stops),
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
245 median(stop.location.y for stop in self.stops),
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
246 )
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
247 else:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
248 raise ValueError('an empty cluster has no center point')
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
249 return self._center
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
250 def merge(self, other):
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
251 for bus_stop in other.stops:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
252 bus_stop.cluster = self
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
253 self.stops |= other.stops
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
254 other.stops = set()
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
255 other._center = None
19
16fa9fb20b32 Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents: 18
diff changeset
256 def schedule(self, max_amount = 50):
16fa9fb20b32 Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents: 18
diff changeset
257 result = []
16fa9fb20b32 Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents: 18
diff changeset
258 for stop in self.stops:
16fa9fb20b32 Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents: 18
diff changeset
259 result += stop.schedule(max_amount)
16fa9fb20b32 Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents: 18
diff changeset
260 result.sort(key = lambda schedule_entry: schedule_entry['time'])
16fa9fb20b32 Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents: 18
diff changeset
261 return result[:max_amount]
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
262
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
263 from collections import defaultdict
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
264 bus_stops_by_name = defaultdict(set)
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
265 for bus_stop in bus_stops.values():
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
266 bus_stops_by_name[bus_stop.name].add(bus_stop)
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
267 bus_stops_by_name = dict(bus_stops_by_name)
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
268
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
269 # ryhmittele bus_stops nimen mukaan
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
270 all_clusters = []
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
271 def cluster_bus_stops():
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
272 sorted_bus_stops = sorted(bus_stops.values(), key = lambda bus_stop: bus_stop.name)
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
273 for bus_stop in sorted_bus_stops:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
274 if not bus_stop.cluster:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
275 stops_to_cluster = {bus_stop}
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
276 # etsi pysäkin samannimiset vastaparit
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
277 for pair_candidate in bus_stops_by_name[bus_stop.name]:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
278 distance = pair_candidate.location.etäisyys(bus_stop.location)
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
279 if pair_candidate is not bus_stop and distance <= 0.3:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
280 stops_to_cluster.add(pair_candidate)
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
281 for stop_to_cluster in stops_to_cluster:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
282 if stop_to_cluster.cluster:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
283 cluster = stop_to_cluster.cluster
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
284 break
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
285 else:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
286 cluster = BusStopCluster()
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
287 all_clusters.append(cluster)
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
288 for stop_to_cluster in stops_to_cluster:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
289 if not stop_to_cluster.cluster:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
290 cluster.add_stop(stop_to_cluster)
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
291 # Merkitse muistiin pysäkkien vastaparit käyttäen hyväksi tämänhetkistä ryhmittelytietoa
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
292 for bus_stop in bus_stops.values():
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
293 if bus_stop.cluster:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
294 bus_stop.pairs = bus_stop.cluster.stops - {bus_stop}
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
295 # Ryhmitä ne bus_stops, joilla ei ollut omaa vastaparia, muiden pysäkkien kanssa
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
296 for bus_stop in sorted_bus_stops:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
297 if len(bus_stop.cluster.stops) == 1:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
298 possibilities = set()
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
299 for cluster in all_clusters:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
300 if cluster is not bus_stop.cluster:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
301 distance = cluster.center.etäisyys(bus_stop.location)
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
302 if distance <= 0.3:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
303 possibilities.add((distance, cluster))
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
304 if possibilities:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
305 best = min(possibilities)[1]
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
306 all_clusters.remove(bus_stop.cluster)
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
307 best.merge(bus_stop.cluster)
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
308
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
309 def shared_elements_in_n_sets(sets):
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
310 from itertools import combinations
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
311 result = set()
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
312 for pair in combinations(sets, 2):
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
313 result |= pair[0] & pair[1]
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
314 return result
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
315
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
316 def name_clusters():
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
317 from collections import defaultdict
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
318 from pprint import pprint
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
319 clusters_per_name = defaultdict(set)
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
320 for cluster in all_clusters:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
321 name_representing_stop = min((len(stop.reference), stop.reference, stop) for stop in cluster.stops)[2]
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
322 clusters_per_name[name_representing_stop.name].add(cluster)
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
323 for name, clusters in clusters_per_name.items():
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
324 if len(clusters) == 1:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
325 # Ryhmä on ainoa jolla on varaus tälle nimelle. Sen kuin vaan.
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
326 next(iter(clusters)).name = name
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
327 else:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
328 # Olisiko kaikki klusterit eri alueilla?
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
329 common_regions = shared_elements_in_n_sets({stop.region for stop in cluster.stops} for cluster in clusters)
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
330 # Esitys: ryhmä -> ne alueet jotka ovat tälle ryhmälle ainutlaatuisia
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
331 proposal = {
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
332 cluster: {stop.region for stop in cluster.stops} - common_regions - {None}
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
333 for cluster in clusters
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
334 }
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
335 # Jos enintään yksi klusteri tässä esityksessä on kokonaan ilman omaa aluetta, jolla se voisi eritellä,
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
336 # niin nimetään klusterit näiden alueiden mukaan.
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
337 # Se klusteri jolla ei ole omaa aluetta (jos on) jätetään ilman aluepäätettä.
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
338 if sum([1 for unique_areas in proposal.values() if not unique_areas]) <= 1:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
339 for cluster, unique_areas in proposal.items():
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
340 individual_cluster_name = name
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
341 if unique_areas:
21
6a0394d5a159 Yleistä päivittelyä
Teemu Piippo <teemu@hecknology.net>
parents: 20
diff changeset
342 individual_cluster_name += ' (' + min(unique_areas) + ')'
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
343 cluster.name = individual_cluster_name
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
344 else:
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
345 # Typerä reunatapaus. Indeksoidaan numeroin...
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
346 for n, (_, cluster) in enumerate(sorted(
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
347 min((stop.reference.lower(), cluster) for stop in cluster.stops)
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
348 for cluster in clusters
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
349 ), 1):
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
350 individual_cluster_name = name + '-' + str(n)
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
351 cluster.name = individual_cluster_name
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
352
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
353 print('Ryhmitellään pysäkit...')
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
354 cluster_bus_stops()
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
355 name_clusters()
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
356
19
16fa9fb20b32 Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents: 18
diff changeset
357 clusters_by_name = {}
16fa9fb20b32 Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents: 18
diff changeset
358 for cluster in all_clusters:
21
6a0394d5a159 Yleistä päivittelyä
Teemu Piippo <teemu@hecknology.net>
parents: 20
diff changeset
359 assert cluster.url_name not in clusters_by_name
6a0394d5a159 Yleistä päivittelyä
Teemu Piippo <teemu@hecknology.net>
parents: 20
diff changeset
360 clusters_by_name[cluster.url_name] = cluster
19
16fa9fb20b32 Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents: 18
diff changeset
361
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
362 print('Ladataan aikataulut... ', end = '', flush = True, file = stderr)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
363 with open('gtfs/stop_times.txt') as file:
26
Teemu Piippo <teemu@hecknology.net>
parents: 24
diff changeset
364 row_count = sum(line.count('\n') for line in file)
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
365 progress = 0
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
366 file.seek(0)
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
367 for row in read_csv(file):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
368 trip = all_trips[transform_trip_reference(row['trip_id'])]
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
369 arrival_time = read_time(row['arrival_time'])
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
370 departure_time = read_time(row['departure_time'])
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
371 stop = bus_stops[row['stop_id']]
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
372 traveled_distance = float(row['shape_dist_traveled'])
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
373 trip.schedule.append(BusHalt(arrival_time, departure_time, stop, trip, traveled_distance))
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
374 stop.involved_trips.add(trip)
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
375 progress += 1
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
376 if progress % 1000 == 0:
26
Teemu Piippo <teemu@hecknology.net>
parents: 24
diff changeset
377 print('\rLadataan aikataulut... %.1f%%' % (progress * 100 / row_count), end = ' ', file = stderr)
4
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
378 print('\rLadataan aikataulut... ladattu', file = stderr)
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
379
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
380 for trip in all_trips.values():
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
381 from busroute import simplify_name
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
382 schedule = trip.concise_schedule()
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
383 try:
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
384 trip.from_place = simplify_name(schedule[0])
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
385 trip.to_place = simplify_name(schedule[-1])
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
386 except IndexError:
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
387 trip.from_place = ''
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
388 trip.to_place = ''
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
389
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
390 for route in routes.values():
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
391 from collections import Counter
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
392 from busroute import simplify_name
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
393 tally = Counter()
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
394 for trip in route.trips:
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
395 schedule = trip.concise_schedule()
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
396 places = set(schedule)
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
397 do_add = True
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
398 assert type(schedule) is list
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
399 for candidate in tally:
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
400 if places.issubset(set(candidate)):
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
401 do_add = False
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
402 tally.update({tuple(candidate)})
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
403 if do_add:
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
404 tally.update({tuple(schedule)})
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
405 try:
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
406 most_common_route = tally.most_common(1)[0][0]
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
407 route.description = simplify_name(most_common_route[0]) + ' - ' + simplify_name(most_common_route[-1])
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
408 except:
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
409 route.description = ''
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
410 route.trips = sorted(route.trips, key = lambda trip: trip.schedule[0].departure_time)

mercurial