itienary_processing.py

Fri, 05 Feb 2021 12:16:29 +0200

author
Teemu Piippo <teemu@hecknology.net>
date
Fri, 05 Feb 2021 12:16:29 +0200
changeset 4
ac067a42b00f
parent 3
10ce28475e9c
permissions
-rwxr-xr-x

update

2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 #!/usr/bin/env python3
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
2 import sqlalchemy
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
3 import sqlalchemy.orm
3
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
4 import multiprocessing
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
5 from regions import parse_regions
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
6 from datamodel import *
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
7 engine = sqlalchemy.create_engine('sqlite:///gtfs.db')
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
8 GtfsBase.metadata.create_all(engine)
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
9 session = sqlalchemy.orm.sessionmaker(bind = engine)()
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
10 regions = parse_regions('föli.osm')
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
12 def filter_itinerary(raw_itinerary):
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
13 encountered = set()
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
14 for region in raw_itinerary:
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
15 if region and region not in encountered:
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
16 yield region
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
17 encountered.add(region)
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
18
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
19 def get_stoptimes(session):
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
20 yield from session \
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
21 .query(GtfsStopTime) \
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
22 .filter(GtfsStopTime.destination == None) \
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
23 .limit(1000)
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
24
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
25 def length_left(stoptime):
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
26 return stoptime.trip.shape.length - stoptime.shape_distance_traveled
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
27
3
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
28 from datetime import datetime, timedelta
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
29 time_in_db = timedelta(0)
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
30 time_in_process = timedelta(0)
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
31 amount = session.query(GtfsStopTime).filter(GtfsStopTime.destination == None).count()
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
32 k = 0
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
33 got_stoptimes = amount != 0
3
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
34 from threading import Thread
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
35
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
36 def get_filtered_itinerary(stoptime):
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
37 return list(filter_itinerary(
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
38 entry.stop.stop_region
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
39 for entry in session.query(GtfsStopTime)
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
40 .filter(GtfsStopTime.trip_id == stoptime.trip_id)
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
41 .filter(GtfsStopTime.stop_sequence > stoptime.stop_sequence)
4
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
42 if entry.stop.stop_region_major == 1
3
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
43 ))
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
44
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
45 def get_destination(stoptime, itinerary):
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
46 from busroute import destinations_list
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
47 dests = destinations_list(
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
48 itinerary = itinerary,
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
49 trip_length = float(length_left(stoptime)),
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
50 regions = regions,
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
51 )
4
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
52 return ';'.join(dests)
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
53
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
54 while got_stoptimes:
3
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
55 if k > 0:
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
56 print('%.2f%% done' % (k * 100 / amount))
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
57 #print('%s spent in query, %s spent in processing (%.1f%% of time spent processing)' % (time_in_db, time_in_process, (time_in_process / (time_in_db + time_in_process) * 100)))
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
58 got_stoptimes = False
3
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
59 stoptimes = list(get_stoptimes(session))
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
60 with multiprocessing.Pool(12) as p:
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
61 itineraries = list(p.map(get_filtered_itinerary, stoptimes))
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
62 for stoptime, itinerary in zip(stoptimes, itineraries):
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
63 got_stoptimes = True
3
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
64 destination = get_destination(stoptime, itinerary)
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
65 stoptime.destination = destination
2
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
66 k += 1
7378b802ddf8 destination processing
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
67 session.commit()

mercurial