In [1]:
import pandas as pd
import networkx as nx
import os
import numpy as np
import warnings
import numpy as np
import matplotlib.pyplot as plt
from circos import CircosPlot
warnings.filterwarnings('ignore')
%matplotlib inline
Networks can be represented in a tabular form in two ways: As an adjacency list with edge attributes stored as columnar values, and as a node list with node attributes stored as columnar values.
Storing the network data as a single massive adjacency table, with node attributes repeated on each row, can get unwieldy, especially if the graph is large, or grows to be so. One way to get around this is to store two files: one with node data and node attributes, and one with edge data and edge attributes.
The Divvy bike sharing dataset is one such example of a network data set that has been stored as such.
Let's use the Divvy bike sharing data set as a starting point. The Divvy data set is comprised of the following data:
The README.txt file in the Divvy directory should help orient you around the data.
In [2]:
# This block of code checks to make sure that a particular directory is present.
if "divvy_2013" not in os.listdir('datasets/'):
print('Unzip the divvy_2013.zip file in the datasets folder.')
In [4]:
stations = pd.read_csv('datasets/divvy_2013/Divvy_Stations_2013.csv', parse_dates=['online date'], index_col='id', encoding='utf-8')
stations
Out[4]:
name
latitude
longitude
dpcapacity
landmark
online date
id
5
State St & Harrison St
41.873958
-87.627739
19
30
2013-06-28
13
Wilton Ave & Diversey Pkwy
41.932500
-87.652681
19
66
2013-06-28
14
Morgan St & 18th St
41.858086
-87.651073
15
163
2013-06-28
15
Racine Ave & 18th St
41.858181
-87.656487
15
164
2013-06-28
16
Wood St & North Ave
41.910329
-87.672516
15
223
2013-08-12
17
Wood St & Division St
41.903320
-87.672730
15
246
2013-06-28
19
Loomis St & Taylor St
41.869417
-87.660996
15
139
2013-06-28
20
Sheffield Ave & Kingsbury St
41.909592
-87.653497
15
154
2013-06-28
21
Aberdeen St & Jackson Blvd
41.877726
-87.654787
15
157
2013-06-28
22
May St & Taylor St
41.869482
-87.655486
15
160
2013-06-28
23
Orleans St & Elm St
41.902924
-87.637715
15
172
2013-06-28
24
Fairbanks Ct & Grand Ave
41.891860
-87.620620
15
262
2013-06-28
25
Michigan Ave & Pearson St
41.897660
-87.623510
23
34
2013-06-28
26
McClurg Ct & Illinois St
41.891020
-87.617300
23
51
2013-06-28
27
Larrabee St & North Ave
41.910210
-87.643500
19
174
2013-06-28
28
Larrabee St & Menomonee St
41.914680
-87.643320
15
282
2013-06-28
29
Noble St & Milwaukee Ave
41.900680
-87.662600
15
290
2013-06-28
30
Ashland Ave & Augusta Blvd
41.899643
-87.667700
15
248
2013-06-28
31
Franklin St & Chicago Ave
41.896802
-87.635638
23
17
2013-06-28
32
Racine Ave & Congress Pkwy
41.874640
-87.657030
19
76
2013-06-28
33
State St & Van Buren St
41.877181
-87.627844
27
3
2013-06-28
34
Cannon Dr & Fullerton Ave
41.926756
-87.634429
15
124
2013-06-28
35
Streeter Dr & Illinois St
41.891071
-87.612200
35
22
2013-08-05
36
Franklin St & Jackson Blvd
41.877708
-87.635321
27
19
2013-06-28
37
Dearborn St & Adams St
41.879356
-87.629791
19
20
2013-06-28
42
Wabash Ave & Cermak Rd
41.853239
-87.625337
15
170
2013-06-28
43
Michigan Ave & Washington St
41.883893
-87.624649
43
1
2013-06-28
44
State St & Randolph St
41.884730
-87.627734
27
2
2013-06-28
45
Michigan Ave & Congress Pkwy
41.876066
-87.624433
15
40
2013-06-28
46
Wells St & Walton St
41.899930
-87.634430
19
46
2013-06-28
...
...
...
...
...
...
...
322
Kimbark Ave & 53rd St
41.799568
-87.594747
15
397
2013-09-21
323
Sheridan Rd & Lawrence Ave
41.969517
-87.654691
15
384
2013-09-23
324
Stockton Dr & Wrightwood Ave
41.931320
-87.638742
15
276
2013-10-03
325
Clark St & Winnemac Ave
41.973385
-87.668365
15
392
2013-09-23
326
Clark St & Leland Ave
41.967096
-87.667429
11
239
2013-09-27
327
Sheffield Ave & Webster Ave
41.921687
-87.653714
19
188
2013-09-25
328
Ellis Ave & 58th St
41.788746
-87.601334
15
365
2013-09-25
329
Lake Shore Dr & Diversey Pkwy
41.932684
-87.636250
15
347
2013-09-25
330
Lincoln Ave & Addison St
41.946176
-87.673308
19
77
2013-09-26
331
Halsted St & Blackhawk St
41.908540
-87.648568
19
176
2013-09-28
332
Halsted St & Diversey Pkwy
41.933341
-87.648747
15
208
2013-09-28
333
Ashland Ave & Blackhawk St
41.907066
-87.667252
15
224
2013-09-27
334
Lake Shore Dr & Belmont Ave
41.940775
-87.639192
19
233
2013-09-27
335
Calumet Ave & 35th St
41.831379
-87.618034
15
345
2013-10-17
336
Cottage Grove Ave & 47th St
41.809855
-87.606755
15
422
2013-10-17
337
Clark St & Chicago Ave
41.896544
-87.630931
19
303
2013-09-27
338
Calumet Ave & 18th St
41.857611
-87.619407
15
102
2013-09-28
339
Emerald Ave & 31st St
41.838198
-87.645143
11
404
2013-09-28
340
Clark St & Wrightwood Ave
41.929546
-87.643118
15
209
2013-10-24
341
Adler Planetarium
41.866095
-87.607267
19
431
2013-10-09
342
Wolcott Ave & Polk St
41.871262
-87.673688
15
284
2013-10-12
343
Racine Ave & Wrightwood Ave
41.928887
-87.658971
15
297
2013-10-24
344
Wolcott Ave & Lawrence Ave
41.968641
-87.676335
15
26
2013-10-09
345
Lake Park Ave & 56th St
41.793242
-87.587782
15
119
2013-10-09
346
Ada St & Washington Blvd
41.882830
-87.661206
15
353
2013-10-10
347
Ashland Ave & Grace St
41.950687
-87.668700
15
319
2013-10-12
348
California Ave & 21st St
41.854016
-87.695445
15
96
2013-10-14
349
Halsted St & Wrightwood Ave
41.929143
-87.649077
15
210
2013-10-28
350
Ashland Ave & Chicago Ave
41.895966
-87.667747
15
247
2013-10-22
351
Cottage Grove Ave & 51st St
41.803038
-87.606615
15
440
2013-10-17
300 rows × 6 columns
In [7]:
trips = pd.read_csv('datasets/divvy_2013/Divvy_Trips_2013.csv',
parse_dates=['starttime', 'stoptime'],
index_col=['trip_id'])
trips = trips.sort()
trips
Out[7]:
starttime
stoptime
bikeid
tripduration
from_station_id
from_station_name
to_station_id
to_station_name
usertype
gender
birthday
trip_id
3940
2013-06-27 01:06:00
2013-06-27 09:46:00
914
31177
91
Clinton St & Washington Blvd
48
Larrabee St & Kingsbury St
Subscriber
Male
1982.0
4095
2013-06-27 12:06:00
2013-06-27 12:11:00
480
301
85
Michigan Ave & Oak St
85
Michigan Ave & Oak St
Subscriber
Male
1982.0
4113
2013-06-27 11:09:00
2013-06-27 11:11:00
711
140
88
May St & Randolph St
88
May St & Randolph St
Subscriber
Male
1982.0
4118
2013-06-27 12:11:00
2013-06-27 12:16:00
480
316
85
Michigan Ave & Oak St
28
Larrabee St & Menomonee St
Customer
NaN
NaN
4119
2013-06-27 11:12:00
2013-06-27 11:13:00
711
87
88
May St & Randolph St
88
May St & Randolph St
Subscriber
Male
1982.0
4134
2013-06-27 11:24:00
2013-06-27 14:38:00
145
11674
17
Wood St & Division St
61
Wood St & Milwaukee Ave
Subscriber
Male
1978.0
4162
2013-06-27 11:39:00
2013-06-27 16:01:00
711
15758
88
May St & Randolph St
34
Cannon Dr & Fullerton Ave
Subscriber
Male
1982.0
4192
2013-06-27 12:15:00
2013-06-27 12:16:00
303
60
28
Larrabee St & Menomonee St
28
Larrabee St & Menomonee St
Subscriber
Male
1982.0
4216
2013-06-27 13:00:00
2013-06-27 13:03:00
907
171
45
Michigan Ave & Congress Pkwy
90
Millennium Park
Subscriber
Male
1982.0
4255
2013-06-27 13:18:00
2013-06-27 19:34:00
907
22549
45
Michigan Ave & Congress Pkwy
54
Ogden Ave & Chicago Ave
Subscriber
Male
1982.0
4263
2013-06-27 14:39:00
2013-06-27 14:40:00
145
62
61
Wood St & Milwaukee Ave
300
Broadway & Barry Ave
Subscriber
Male
1978.0
4275
2013-06-27 14:44:00
2013-06-27 14:45:00
77
64
32
Racine Ave & Congress Pkwy
32
Racine Ave & Congress Pkwy
Customer
NaN
NaN
4288
2013-06-27 14:56:00
2013-06-27 14:57:00
524
66
68
Clinton St & Tilden St
68
Clinton St & Tilden St
Subscriber
Male
1983.0
4289
2013-06-27 14:57:00
2013-06-27 15:05:00
78
487
32
Racine Ave & Congress Pkwy
349
Halsted St & Wrightwood Ave
Subscriber
Female
1980.0
4291
2013-06-27 14:58:00
2013-06-27 15:05:00
77
433
32
Racine Ave & Congress Pkwy
19
Loomis St & Taylor St
Customer
NaN
NaN
4316
2013-06-27 15:06:00
2013-06-27 15:09:00
77
123
19
Loomis St & Taylor St
19
Loomis St & Taylor St
Customer
NaN
NaN
4342
2013-06-27 15:13:00
2013-06-27 15:27:00
77
852
19
Loomis St & Taylor St
55
Halsted St & James M Rochford St
Customer
NaN
NaN
4343
2013-06-27 15:09:00
2013-06-27 15:14:00
587
272
68
Clinton St & Tilden St
68
Clinton St & Tilden St
Subscriber
Male
1983.0
4345
2013-06-27 16:14:00
2013-06-27 16:15:00
711
83
34
Cannon Dr & Fullerton Ave
311
Lincoln Ave & Eastwood Ave
Subscriber
Male
1982.0
4346
2013-06-27 15:14:00
2013-06-28 00:18:00
145
32646
61
Wood St & Milwaukee Ave
91
Clinton St & Washington Blvd
Subscriber
Male
1978.0
4350
2013-06-27 15:15:00
2013-06-27 15:27:00
78
730
349
Halsted St & Wrightwood Ave
55
Halsted St & James M Rochford St
Subscriber
Female
1980.0
4378
2013-06-27 15:54:00
2013-06-27 23:15:00
524
26479
320
Loomis St & Lexington St
27
Larrabee St & North Ave
Subscriber
Male
1983.0
4384
2013-06-27 16:42:00
2013-06-27 22:23:00
78
20457
55
Halsted St & James M Rochford St
31
Franklin St & Chicago Ave
Subscriber
Female
1980.0
4389
2013-06-27 16:34:00
2013-06-27 16:36:00
66
127
42
Wabash Ave & Cermak Rd
42
Wabash Ave & Cermak Rd
Subscriber
Female
1980.0
4390
2013-06-27 16:41:00
2013-06-27 16:50:00
66
528
42
Wabash Ave & Cermak Rd
42
Wabash Ave & Cermak Rd
Subscriber
Female
1980.0
4415
2013-06-27 18:21:00
2013-06-27 18:37:00
384
973
36
Franklin St & Jackson Blvd
36
Franklin St & Jackson Blvd
Subscriber
Male
1967.0
4427
2013-06-27 18:32:00
2013-06-27 18:37:00
348
308
81
Daley Center Plaza
81
Daley Center Plaza
Subscriber
Male
1971.0
4476
2013-06-27 18:38:00
2013-06-27 19:35:00
152
3401
81
Daley Center Plaza
67
Sheffield Ave & Fullerton Ave
Subscriber
Male
1964.0
4480
2013-06-27 19:40:00
2013-06-27 22:28:00
27
10105
340
Clark St & Wrightwood Ave
46
Wells St & Walton St
Customer
NaN
NaN
4490
2013-06-27 18:45:00
2013-06-27 19:03:00
418
1094
37
Dearborn St & Adams St
76
Lake Shore Dr & Monroe St
Customer
NaN
NaN
...
...
...
...
...
...
...
...
...
...
...
...
1109177
2013-12-31 19:34:00
2013-12-31 20:01:00
825
1632
289
Wells St & Concord Ln
165
Clark St & Waveland Ave
Subscriber
Male
1985.0
1109198
2013-12-31 19:42:00
2013-12-31 19:51:00
2181
524
214
Damen Ave & Grand Ave
285
Wood St & Grand Ave
Subscriber
Female
1979.0
1109199
2013-12-31 19:42:00
2013-12-31 19:51:00
1978
523
214
Damen Ave & Grand Ave
285
Wood St & Grand Ave
Subscriber
Male
1976.0
1109201
2013-12-31 19:44:00
2013-12-31 20:01:00
1304
1003
158
Milwaukee Ave & Wabansia Ave
214
Damen Ave & Grand Ave
Customer
NaN
NaN
1109202
2013-12-31 19:55:00
2013-12-31 20:07:00
188
712
304
Halsted St & Waveland Ave
251
Clarendon Ave & Leland Ave
Subscriber
Male
1969.0
1109203
2013-12-31 20:02:00
2013-12-31 20:11:00
171
548
165
Clark St & Waveland Ave
234
Clark St & Montrose Ave
Subscriber
Male
1985.0
1109222
2013-12-31 20:12:00
2013-12-31 20:25:00
2484
804
100
Orleans St & Merchandise Mart Plaza
75
Canal St & Jackson Blvd
Subscriber
Male
1964.0
1109223
2013-12-31 20:30:00
2013-12-31 20:37:00
435
390
234
Clark St & Montrose Ave
318
Southport Ave & Irving Park Rd
Subscriber
Female
1981.0
1109224
2013-12-31 20:31:00
2013-12-31 20:38:00
2676
387
305
Western Ave & Division St
130
Damen Ave & Division St
Subscriber
Male
1984.0
1109231
2013-12-31 20:38:00
2014-01-01 12:08:00
2676
55776
130
Damen Ave & Division St
230
Lincoln Ave & Roscoe St
Subscriber
Male
1984.0
1109233
2013-12-31 20:43:00
2013-12-31 20:51:00
1400
470
118
Sedgwick St & North Ave
138
Clybourn Ave & Division St
Subscriber
Male
1972.0
1109240
2013-12-31 20:51:00
2013-12-31 21:05:00
36
819
141
Clark St & Lincoln Ave
181
LaSalle St & Illinois St
Subscriber
Male
1972.0
1109256
2013-12-31 21:07:00
2013-12-31 21:10:00
1917
209
60
Dayton St & North Ave
20
Sheffield Ave & Kingsbury St
Subscriber
Female
1983.0
1109257
2013-12-31 21:12:00
2013-12-31 21:16:00
1917
284
20
Sheffield Ave & Kingsbury St
93
Sheffield Ave & Willow St
Subscriber
Female
1983.0
1109275
2013-12-31 21:36:00
2013-12-31 22:00:00
2799
1421
227
Southport Ave & Waveland Ave
228
Damen Ave & Melrose Ave
Subscriber
Male
1984.0
1109276
2013-12-31 21:36:00
2013-12-31 22:01:00
2859
1493
227
Southport Ave & Waveland Ave
228
Damen Ave & Melrose Ave
Subscriber
Female
1978.0
1109277
2013-12-31 21:36:00
2013-12-31 22:01:00
2642
1447
227
Southport Ave & Waveland Ave
228
Damen Ave & Melrose Ave
Subscriber
Male
1986.0
1109278
2013-12-31 21:38:00
2013-12-31 22:00:00
2316
1309
227
Southport Ave & Waveland Ave
228
Damen Ave & Melrose Ave
Subscriber
Male
1989.0
1109279
2013-12-31 21:50:00
2013-12-31 22:07:00
1667
987
119
Ashland Ave & Lake St
275
Ashland Ave & 13th St
Subscriber
Male
1977.0
1109280
2013-12-31 21:55:00
2013-12-31 22:04:00
171
573
234
Clark St & Montrose Ave
254
Pine Grove Ave & Irving Park Rd
Customer
NaN
NaN
1109283
2013-12-31 22:03:00
2013-12-31 22:13:00
198
650
284
Michigan Ave & Jackson Blvd
43
Michigan Ave & Washington St
Subscriber
Female
1976.0
1109308
2013-12-31 22:10:00
2013-12-31 22:16:00
2931
353
130
Damen Ave & Division St
69
Damen Ave & Pierce Ave
Subscriber
Male
1972.0
1109309
2013-12-31 22:10:00
2013-12-31 22:16:00
2048
346
130
Damen Ave & Division St
69
Damen Ave & Pierce Ave
Subscriber
Female
1976.0
1109310
2013-12-31 22:12:00
2013-12-31 22:16:00
347
248
340
Clark St & Wrightwood Ave
300
Broadway & Barry Ave
Subscriber
Male
1989.0
1109331
2013-12-31 22:20:00
2013-12-31 22:26:00
347
357
300
Broadway & Barry Ave
117
Wilton Ave & Belmont Ave
Subscriber
Male
1989.0
1109336
2013-12-31 22:29:00
2013-12-31 22:35:00
788
368
169
Canal St & Harrison St
77
Clinton St & Madison St
Subscriber
Male
1952.0
1109338
2013-12-31 22:35:00
2013-12-31 22:49:00
2239
868
216
California Ave & Division St
69
Damen Ave & Pierce Ave
Subscriber
Female
1978.0
1109369
2013-12-31 23:07:00
2013-12-31 23:31:00
1536
1492
22
May St & Taylor St
22
May St & Taylor St
Subscriber
Male
1985.0
1109392
2013-12-31 23:36:00
2013-12-31 23:46:00
2069
600
120
Wentworth Ave & Archer Ave
135
Halsted St & 21st St
Subscriber
Male
1984.0
1109397
2013-12-31 23:46:00
2013-12-31 23:52:00
2097
316
206
Halsted St & Archer Ave
339
Emerald Ave & 31st St
Subscriber
Male
1963.0
759788 rows × 11 columns
At this point, we have our stations and trips data loaded into memory.
How we construct the graph depends on the kind of questions we want to answer, which makes the definition of the "unit of consideration" (or the entities for which we are trying to model their relationships) is extremely important.
Let's try to answer the question: "What are the most popular trip paths?" In this case, the bike station is a reasonable "unit of consideration", so we will use the bike stations as the nodes.
To start, let's initialize an directed graph G.
In [8]:
G = nx.DiGraph()
Then, let's iterate over the stations DataFrame, and add in the node attributes.
In [9]:
for r, d in stations.iterrows(): # call the pandas DataFrame row-by-row iterator
G.add_node(r, attr_dict=d.to_dict())
In order to answer the question of "which stations are important", we need to specify things a bit more. Perhaps a measure such as betweenness centrality or degree centrality may be appropriate here.
The naive way would be to iterate over all the rows. Go ahead and try it at your own risk - it may take a long time :-). Alternatively, I would suggest doing a pandas groupby.
In [10]:
# # Run the following code at your own risk :)
# for r, d in trips.iterrows():
# start = d['from_station_id']
# end = d['to_station_id']
# if (start, end) not in G.edges():
# G.add_edge(start, end, count=1)
# else:
# G.edge[start][end]['count'] += 1
In [11]:
for (start, stop), d in trips.groupby(['from_station_id', 'to_station_id']):
G.add_edge(start, stop, count=len(d))
In [12]:
G.edges(data=True)
Out[12]:
[(5, 5, {'count': 232}),
(5, 13, {'count': 1}),
(5, 14, {'count': 15}),
(5, 15, {'count': 9}),
(5, 16, {'count': 4}),
(5, 17, {'count': 7}),
(5, 19, {'count': 13}),
(5, 21, {'count': 16}),
(5, 22, {'count': 18}),
(5, 23, {'count': 5}),
(5, 24, {'count': 36}),
(5, 25, {'count': 62}),
(5, 26, {'count': 55}),
(5, 27, {'count': 4}),
(5, 28, {'count': 4}),
(5, 29, {'count': 12}),
(5, 31, {'count': 8}),
(5, 32, {'count': 14}),
(5, 33, {'count': 58}),
(5, 34, {'count': 7}),
(5, 35, {'count': 83}),
(5, 36, {'count': 238}),
(5, 37, {'count': 132}),
(5, 42, {'count': 47}),
(5, 43, {'count': 55}),
(5, 44, {'count': 71}),
(5, 45, {'count': 43}),
(5, 46, {'count': 3}),
(5, 47, {'count': 65}),
(5, 48, {'count': 3}),
(5, 49, {'count': 141}),
(5, 50, {'count': 24}),
(5, 51, {'count': 69}),
(5, 52, {'count': 86}),
(5, 53, {'count': 25}),
(5, 54, {'count': 13}),
(5, 55, {'count': 22}),
(5, 56, {'count': 18}),
(5, 57, {'count': 49}),
(5, 58, {'count': 2}),
(5, 59, {'count': 179}),
(5, 60, {'count': 3}),
(5, 61, {'count': 10}),
(5, 62, {'count': 61}),
(5, 66, {'count': 64}),
(5, 67, {'count': 8}),
(5, 68, {'count': 114}),
(5, 69, {'count': 5}),
(5, 71, {'count': 9}),
(5, 72, {'count': 99}),
(5, 73, {'count': 25}),
(5, 74, {'count': 6}),
(5, 75, {'count': 179}),
(5, 76, {'count': 141}),
(5, 77, {'count': 149}),
(5, 80, {'count': 26}),
(5, 81, {'count': 134}),
(5, 84, {'count': 8}),
(5, 85, {'count': 51}),
(5, 86, {'count': 8}),
(5, 87, {'count': 4}),
(5, 88, {'count': 7}),
(5, 90, {'count': 181}),
(5, 91, {'count': 70}),
(5, 92, {'count': 10}),
(5, 93, {'count': 4}),
(5, 94, {'count': 9}),
(5, 97, {'count': 191}),
(5, 98, {'count': 52}),
(5, 99, {'count': 25}),
(5, 100, {'count': 19}),
(5, 106, {'count': 23}),
(5, 108, {'count': 21}),
(5, 109, {'count': 30}),
(5, 110, {'count': 37}),
(5, 111, {'count': 2}),
(5, 112, {'count': 4}),
(5, 118, {'count': 4}),
(5, 120, {'count': 36}),
(5, 122, {'count': 4}),
(5, 126, {'count': 14}),
(5, 127, {'count': 1}),
(5, 128, {'count': 3}),
(5, 129, {'count': 6}),
(5, 130, {'count': 1}),
(5, 132, {'count': 1}),
(5, 134, {'count': 25}),
(5, 135, {'count': 7}),
(5, 137, {'count': 3}),
(5, 138, {'count': 2}),
(5, 140, {'count': 46}),
(5, 143, {'count': 4}),
(5, 146, {'count': 7}),
(5, 147, {'count': 12}),
(5, 148, {'count': 5}),
(5, 149, {'count': 10}),
(5, 150, {'count': 24}),
(5, 157, {'count': 2}),
(5, 160, {'count': 1}),
(5, 162, {'count': 2}),
(5, 164, {'count': 12}),
(5, 168, {'count': 51}),
(5, 169, {'count': 39}),
(5, 170, {'count': 11}),
(5, 171, {'count': 1}),
(5, 173, {'count': 15}),
(5, 174, {'count': 115}),
(5, 175, {'count': 42}),
(5, 176, {'count': 34}),
(5, 177, {'count': 11}),
(5, 178, {'count': 36}),
(5, 179, {'count': 6}),
(5, 181, {'count': 28}),
(5, 183, {'count': 4}),
(5, 184, {'count': 7}),
(5, 185, {'count': 2}),
(5, 191, {'count': 12}),
(5, 192, {'count': 38}),
(5, 193, {'count': 2}),
(5, 194, {'count': 24}),
(5, 195, {'count': 31}),
(5, 196, {'count': 18}),
(5, 197, {'count': 17}),
(5, 198, {'count': 19}),
(5, 199, {'count': 51}),
(5, 200, {'count': 3}),
(5, 202, {'count': 2}),
(5, 205, {'count': 2}),
(5, 206, {'count': 6}),
(5, 207, {'count': 9}),
(5, 208, {'count': 5}),
(5, 209, {'count': 2}),
(5, 210, {'count': 10}),
(5, 211, {'count': 17}),
(5, 212, {'count': 9}),
(5, 214, {'count': 1}),
(5, 217, {'count': 2}),
(5, 218, {'count': 2}),
(5, 220, {'count': 4}),
(5, 222, {'count': 1}),
(5, 224, {'count': 2}),
(5, 232, {'count': 5}),
(5, 233, {'count': 3}),
(5, 234, {'count': 1}),
(5, 236, {'count': 1}),
(5, 237, {'count': 2}),
(5, 240, {'count': 1}),
(5, 241, {'count': 4}),
(5, 244, {'count': 4}),
(5, 247, {'count': 1}),
(5, 249, {'count': 12}),
(5, 250, {'count': 16}),
(5, 251, {'count': 6}),
(5, 252, {'count': 8}),
(5, 255, {'count': 37}),
(5, 258, {'count': 1}),
(5, 261, {'count': 8}),
(5, 264, {'count': 10}),
(5, 265, {'count': 2}),
(5, 268, {'count': 2}),
(5, 272, {'count': 1}),
(5, 273, {'count': 25}),
(5, 274, {'count': 1}),
(5, 275, {'count': 3}),
(5, 277, {'count': 1}),
(5, 278, {'count': 1}),
(5, 279, {'count': 1}),
(5, 280, {'count': 6}),
(5, 282, {'count': 4}),
(5, 283, {'count': 51}),
(5, 284, {'count': 5}),
(5, 286, {'count': 22}),
(5, 287, {'count': 15}),
(5, 289, {'count': 2}),
(5, 291, {'count': 3}),
(5, 300, {'count': 3}),
(5, 301, {'count': 5}),
(5, 305, {'count': 2}),
(5, 309, {'count': 1}),
(5, 311, {'count': 3}),
(5, 313, {'count': 3}),
(5, 317, {'count': 3}),
(5, 319, {'count': 2}),
(5, 320, {'count': 7}),
(5, 321, {'count': 23}),
(5, 322, {'count': 2}),
(5, 328, {'count': 9}),
(5, 332, {'count': 1}),
(5, 334, {'count': 2}),
(5, 337, {'count': 4}),
(5, 338, {'count': 12}),
(5, 340, {'count': 3}),
(5, 341, {'count': 13}),
(5, 342, {'count': 1}),
(5, 349, {'count': 1}),
(5, 350, {'count': 3}),
(5, 351, {'count': 2}),
(13, 13, {'count': 168}),
(13, 15, {'count': 1}),
(13, 16, {'count': 7}),
(13, 17, {'count': 12}),
(13, 19, {'count': 5}),
(13, 20, {'count': 40}),
(13, 21, {'count': 3}),
(13, 22, {'count': 2}),
(13, 23, {'count': 13}),
(13, 24, {'count': 6}),
(13, 25, {'count': 23}),
(13, 26, {'count': 15}),
(13, 27, {'count': 22}),
(13, 28, {'count': 20}),
(13, 29, {'count': 10}),
(13, 30, {'count': 15}),
(13, 31, {'count': 11}),
(13, 34, {'count': 138}),
(13, 35, {'count': 12}),
(13, 36, {'count': 5}),
(13, 37, {'count': 6}),
(13, 44, {'count': 9}),
(13, 46, {'count': 26}),
(13, 47, {'count': 14}),
(13, 48, {'count': 18}),
(13, 49, {'count': 9}),
(13, 50, {'count': 1}),
(13, 51, {'count': 7}),
(13, 52, {'count': 2}),
(13, 53, {'count': 15}),
(13, 54, {'count': 11}),
(13, 56, {'count': 6}),
(13, 58, {'count': 18}),
(13, 60, {'count': 42}),
(13, 61, {'count': 22}),
(13, 62, {'count': 2}),
(13, 66, {'count': 4}),
(13, 67, {'count': 156}),
(13, 68, {'count': 1}),
(13, 69, {'count': 47}),
(13, 71, {'count': 7}),
(13, 73, {'count': 3}),
(13, 74, {'count': 10}),
(13, 75, {'count': 2}),
(13, 76, {'count': 14}),
(13, 77, {'count': 4}),
(13, 80, {'count': 5}),
(13, 81, {'count': 1}),
(13, 84, {'count': 4}),
(13, 85, {'count': 63}),
(13, 86, {'count': 21}),
(13, 87, {'count': 52}),
(13, 88, {'count': 3}),
(13, 90, {'count': 11}),
(13, 91, {'count': 7}),
(13, 92, {'count': 3}),
(13, 93, {'count': 36}),
(13, 94, {'count': 60}),
(13, 97, {'count': 8}),
(13, 98, {'count': 2}),
(13, 99, {'count': 10}),
(13, 100, {'count': 5}),
(13, 106, {'count': 3}),
(13, 110, {'count': 18}),
(13, 111, {'count': 3}),
(13, 112, {'count': 7}),
(13, 113, {'count': 27}),
(13, 114, {'count': 54}),
(13, 115, {'count': 113}),
(13, 116, {'count': 2}),
(13, 117, {'count': 73}),
(13, 118, {'count': 20}),
(13, 119, {'count': 2}),
(13, 123, {'count': 31}),
(13, 126, {'count': 51}),
(13, 127, {'count': 4}),
(13, 128, {'count': 2}),
(13, 130, {'count': 7}),
(13, 131, {'count': 7}),
(13, 134, {'count': 1}),
(13, 138, {'count': 4}),
(13, 140, {'count': 7}),
(13, 141, {'count': 40}),
(13, 143, {'count': 39}),
(13, 144, {'count': 36}),
(13, 150, {'count': 2}),
(13, 152, {'count': 72}),
(13, 153, {'count': 120}),
(13, 154, {'count': 37}),
(13, 156, {'count': 59}),
(13, 157, {'count': 56}),
(13, 158, {'count': 12}),
(13, 160, {'count': 1}),
(13, 162, {'count': 33}),
(13, 163, {'count': 66}),
(13, 164, {'count': 5}),
(13, 165, {'count': 38}),
(13, 166, {'count': 24}),
(13, 169, {'count': 1}),
(13, 173, {'count': 11}),
(13, 174, {'count': 2}),
(13, 176, {'count': 18}),
(13, 177, {'count': 48}),
(13, 181, {'count': 7}),
(13, 183, {'count': 2}),
(13, 185, {'count': 2}),
(13, 186, {'count': 1}),
(13, 188, {'count': 9}),
(13, 190, {'count': 70}),
(13, 191, {'count': 1}),
(13, 192, {'count': 13}),
(13, 196, {'count': 2}),
(13, 198, {'count': 7}),
(13, 199, {'count': 1}),
(13, 210, {'count': 10}),
(13, 211, {'count': 8}),
(13, 212, {'count': 4}),
(13, 217, {'count': 1}),
(13, 219, {'count': 9}),
(13, 220, {'count': 384}),
(13, 223, {'count': 14}),
(13, 224, {'count': 9}),
(13, 225, {'count': 24}),
(13, 226, {'count': 17}),
(13, 227, {'count': 16}),
(13, 228, {'count': 10}),
(13, 229, {'count': 28}),
(13, 230, {'count': 11}),
(13, 231, {'count': 4}),
(13, 232, {'count': 14}),
(13, 233, {'count': 6}),
(13, 234, {'count': 2}),
(13, 236, {'count': 1}),
(13, 238, {'count': 5}),
(13, 239, {'count': 19}),
(13, 240, {'count': 4}),
(13, 242, {'count': 3}),
(13, 243, {'count': 12}),
(13, 244, {'count': 6}),
(13, 245, {'count': 6}),
(13, 246, {'count': 4}),
(13, 249, {'count': 3}),
(13, 250, {'count': 4}),
(13, 251, {'count': 4}),
(13, 253, {'count': 5}),
(13, 254, {'count': 5}),
(13, 255, {'count': 1}),
(13, 256, {'count': 5}),
(13, 257, {'count': 6}),
(13, 258, {'count': 11}),
(13, 260, {'count': 9}),
(13, 268, {'count': 8}),
(13, 276, {'count': 2}),
(13, 279, {'count': 4}),
(13, 288, {'count': 3}),
(13, 289, {'count': 11}),
(13, 291, {'count': 9}),
(13, 292, {'count': 2}),
(13, 293, {'count': 1}),
(13, 295, {'count': 4}),
(13, 296, {'count': 5}),
(13, 298, {'count': 3}),
(13, 299, {'count': 11}),
(13, 300, {'count': 14}),
(13, 301, {'count': 1}),
(13, 302, {'count': 17}),
(13, 303, {'count': 11}),
(13, 304, {'count': 3}),
(13, 307, {'count': 4}),
(13, 308, {'count': 4}),
(13, 309, {'count': 2}),
(13, 310, {'count': 1}),
(13, 311, {'count': 7}),
(13, 313, {'count': 26}),
(13, 314, {'count': 1}),
(13, 318, {'count': 3}),
(13, 319, {'count': 33}),
(13, 323, {'count': 3}),
(13, 324, {'count': 50}),
(13, 325, {'count': 3}),
(13, 327, {'count': 21}),
(13, 329, {'count': 56}),
(13, 330, {'count': 4}),
(13, 331, {'count': 1}),
(13, 332, {'count': 66}),
(13, 333, {'count': 4}),
(13, 334, {'count': 6}),
(13, 337, {'count': 2}),
(13, 340, {'count': 38}),
(13, 343, {'count': 3}),
(13, 348, {'count': 7}),
(13, 349, {'count': 18}),
(13, 350, {'count': 3}),
(14, 5, {'count': 24}),
(14, 262, {'count': 1}),
(14, 263, {'count': 2}),
(14, 261, {'count': 3}),
(14, 13, {'count': 1}),
(14, 14, {'count': 145}),
(14, 15, {'count': 91}),
(14, 272, {'count': 3}),
(14, 17, {'count': 6}),
(14, 274, {'count': 5}),
(14, 19, {'count': 16}),
(14, 21, {'count': 5}),
(14, 22, {'count': 26}),
(14, 23, {'count': 1}),
(14, 280, {'count': 4}),
(14, 25, {'count': 3}),
(14, 26, {'count': 5}),
(14, 283, {'count': 2}),
(14, 284, {'count': 3}),
(14, 29, {'count': 6}),
(14, 30, {'count': 1}),
(14, 31, {'count': 1}),
(14, 32, {'count': 11}),
(14, 33, {'count': 15}),
(14, 35, {'count': 2}),
(14, 36, {'count': 19}),
(14, 37, {'count': 18}),
(14, 42, {'count': 6}),
(14, 43, {'count': 7}),
(14, 44, {'count': 3}),
(14, 45, {'count': 9}),
(14, 46, {'count': 2}),
(14, 47, {'count': 7}),
(14, 48, {'count': 33}),
(14, 49, {'count': 6}),
(14, 50, {'count': 6}),
(14, 51, {'count': 2}),
(14, 52, {'count': 1}),
(14, 53, {'count': 8}),
(14, 54, {'count': 3}),
(14, 55, {'count': 34}),
(14, 56, {'count': 6}),
(14, 57, {'count': 48}),
(14, 59, {'count': 71}),
(14, 60, {'count': 4}),
(14, 61, {'count': 1}),
(14, 62, {'count': 15}),
(14, 320, {'count': 1}),
(14, 321, {'count': 1}),
(14, 66, {'count': 2}),
(14, 67, {'count': 1}),
(14, 68, {'count': 5}),
(14, 69, {'count': 4}),
(14, 71, {'count': 10}),
(14, 72, {'count': 11}),
(14, 73, {'count': 15}),
(14, 74, {'count': 1}),
(14, 75, {'count': 8}),
(14, 76, {'count': 13}),
(14, 77, {'count': 30}),
(14, 80, {'count': 26}),
(14, 81, {'count': 11}),
(14, 338, {'count': 1}),
(14, 84, {'count': 18}),
(14, 85, {'count': 1}),
(14, 86, {'count': 3}),
(14, 313, {'count': 1}),
(14, 88, {'count': 1}),
(14, 346, {'count': 3}),
(14, 90, {'count': 33}),
(14, 91, {'count': 31}),
(14, 92, {'count': 4}),
(14, 93, {'count': 1}),
(14, 94, {'count': 2}),
(14, 351, {'count': 2}),
(14, 97, {'count': 33}),
(14, 98, {'count': 1}),
(14, 100, {'count': 7}),
(14, 273, {'count': 8}),
(14, 108, {'count': 20}),
(14, 109, {'count': 4}),
(14, 110, {'count': 2}),
(14, 333, {'count': 1}),
(14, 112, {'count': 4}),
(14, 275, {'count': 1}),
(14, 118, {'count': 2}),
(14, 119, {'count': 5}),
(14, 120, {'count': 4}),
(14, 121, {'count': 4}),
(14, 122, {'count': 4}),
(14, 123, {'count': 2}),
(14, 124, {'count': 26}),
(14, 126, {'count': 3}),
(14, 128, {'count': 1}),
(14, 129, {'count': 76}),
(14, 131, {'count': 1}),
(14, 134, {'count': 33}),
(14, 135, {'count': 16}),
(14, 136, {'count': 1}),
(14, 137, {'count': 28}),
(14, 141, {'count': 1}),
(14, 144, {'count': 1}),
(14, 146, {'count': 3}),
(14, 147, {'count': 2}),
(14, 150, {'count': 6}),
(14, 156, {'count': 1}),
(14, 282, {'count': 7}),
(14, 164, {'count': 2}),
(14, 167, {'count': 8}),
(14, 168, {'count': 16}),
(14, 169, {'count': 20}),
(14, 170, {'count': 10}),
(14, 171, {'count': 5}),
(14, 173, {'count': 1}),
(14, 174, {'count': 4}),
(14, 175, {'count': 1}),
(14, 328, {'count': 2}),
(14, 178, {'count': 3}),
(14, 181, {'count': 5}),
(14, 183, {'count': 1}),
(14, 184, {'count': 5}),
(14, 287, {'count': 21}),
(14, 188, {'count': 1}),
(14, 190, {'count': 2}),
(14, 191, {'count': 5}),
(14, 192, {'count': 3}),
(14, 195, {'count': 3}),
(14, 198, {'count': 10}),
(14, 200, {'count': 1}),
(14, 202, {'count': 15}),
(14, 203, {'count': 5}),
(14, 322, {'count': 2}),
(14, 205, {'count': 36}),
(14, 206, {'count': 9}),
(14, 207, {'count': 5}),
(14, 208, {'count': 3}),
(14, 209, {'count': 1}),
(14, 210, {'count': 1}),
(14, 291, {'count': 1}),
(14, 212, {'count': 1}),
(14, 218, {'count': 3}),
(14, 286, {'count': 1}),
(14, 224, {'count': 2}),
(14, 340, {'count': 1}),
(14, 241, {'count': 47}),
(14, 349, {'count': 2}),
(14, 249, {'count': 5}),
(14, 250, {'count': 1}),
(14, 252, {'count': 4}),
(14, 255, {'count': 8}),
(15, 317, {'count': 5}),
(15, 5, {'count': 12}),
(15, 262, {'count': 2}),
(15, 300, {'count': 1}),
(15, 261, {'count': 5}),
(15, 13, {'count': 1}),
(15, 14, {'count': 65}),
(15, 15, {'count': 96}),
(15, 17, {'count': 1}),
(15, 274, {'count': 10}),
(15, 19, {'count': 36}),
(15, 21, {'count': 15}),
(15, 22, {'count': 28}),
(15, 279, {'count': 1}),
(15, 24, {'count': 1}),
(15, 25, {'count': 1}),
(15, 26, {'count': 1}),
(15, 283, {'count': 3}),
(15, 28, {'count': 1}),
(15, 29, {'count': 5}),
(15, 30, {'count': 3}),
(15, 31, {'count': 5}),
(15, 32, {'count': 69}),
(15, 33, {'count': 30}),
(15, 35, {'count': 4}),
(15, 36, {'count': 57}),
(15, 37, {'count': 5}),
(15, 42, {'count': 6}),
(15, 43, {'count': 3}),
(15, 44, {'count': 16}),
(15, 45, {'count': 7}),
(15, 46, {'count': 4}),
(15, 47, {'count': 4}),
(15, 48, {'count': 10}),
(15, 305, {'count': 1}),
(15, 50, {'count': 16}),
(15, 51, {'count': 14}),
(15, 52, {'count': 3}),
(15, 53, {'count': 1}),
(15, 54, {'count': 2}),
(15, 55, {'count': 34}),
(15, 56, {'count': 3}),
(15, 57, {'count': 80}),
(15, 314, {'count': 1}),
(15, 59, {'count': 79}),
(15, 60, {'count': 4}),
(15, 61, {'count': 4}),
(15, 62, {'count': 7}),
(15, 320, {'count': 6}),
(15, 321, {'count': 1}),
(15, 66, {'count': 1}),
(15, 68, {'count': 2}),
(15, 69, {'count': 3}),
(15, 71, {'count': 7}),
(15, 72, {'count': 15}),
(15, 73, {'count': 44}),
(15, 75, {'count': 22}),
(15, 76, {'count': 4}),
(15, 77, {'count': 6}),
(15, 80, {'count': 21}),
(15, 81, {'count': 11}),
(15, 84, {'count': 7}),
(15, 85, {'count': 6}),
(15, 86, {'count': 3}),
(15, 313, {'count': 4}),
(15, 88, {'count': 2}),
(15, 90, {'count': 26}),
(15, 91, {'count': 1}),
(15, 349, {'count': 5}),
(15, 351, {'count': 5}),
(15, 97, {'count': 15}),
(15, 98, {'count': 14}),
(15, 100, {'count': 1}),
(15, 273, {'count': 5}),
(15, 286, {'count': 1}),
(15, 106, {'count': 1}),
(15, 108, {'count': 20}),
(15, 109, {'count': 8}),
(15, 110, {'count': 1}),
(15, 111, {'count': 1}),
(15, 112, {'count': 5}),
(15, 275, {'count': 55}),
(15, 119, {'count': 9}),
(15, 120, {'count': 11}),
(15, 122, {'count': 1}),
(15, 123, {'count': 2}),
(15, 124, {'count': 18}),
(15, 128, {'count': 3}),
(15, 129, {'count': 47}),
(15, 132, {'count': 1}),
(15, 278, {'count': 3}),
(15, 134, {'count': 23}),
(15, 135, {'count': 14}),
(15, 136, {'count': 7}),
(15, 137, {'count': 17}),
(15, 342, {'count': 5}),
(15, 140, {'count': 1}),
(15, 322, {'count': 1}),
(15, 146, {'count': 18}),
(15, 148, {'count': 1}),
(15, 150, {'count': 2}),
(15, 282, {'count': 21}),
(15, 158, {'count': 1}),
(15, 164, {'count': 1}),
(15, 165, {'count': 2}),
(15, 167, {'count': 1}),
(15, 168, {'count': 5}),
(15, 169, {'count': 3}),
(15, 170, {'count': 3}),
(15, 171, {'count': 3}),
(15, 173, {'count': 1}),
(15, 174, {'count': 3}),
(15, 175, {'count': 13}),
(15, 176, {'count': 3}),
(15, 178, {'count': 33}),
(15, 179, {'count': 1}),
(15, 181, {'count': 3}),
(15, 183, {'count': 2}),
(15, 184, {'count': 2}),
(15, 186, {'count': 9}),
(15, 191, {'count': 3}),
(15, 192, {'count': 7}),
(15, 193, {'count': 1}),
(15, 331, {'count': 2}),
(15, 197, {'count': 1}),
(15, 198, {'count': 9}),
(15, 202, {'count': 21}),
(15, 203, {'count': 9}),
(15, 205, {'count': 59}),
(15, 206, {'count': 7}),
(15, 207, {'count': 1}),
(15, 208, {'count': 4}),
(15, 209, {'count': 3}),
(15, 214, {'count': 4}),
(15, 215, {'count': 3}),
(15, 217, {'count': 2}),
(15, 284, {'count': 4}),
(15, 333, {'count': 40}),
(15, 223, {'count': 1}),
(15, 225, {'count': 1}),
(15, 337, {'count': 2}),
(15, 340, {'count': 1}),
(15, 233, {'count': 1}),
(15, 237, {'count': 1}),
(15, 241, {'count': 85}),
(15, 248, {'count': 1}),
(15, 249, {'count': 11}),
(15, 250, {'count': 1}),
(15, 252, {'count': 17}),
(15, 255, {'count': 2}),
(16, 5, {'count': 1}),
(16, 13, {'count': 24}),
(16, 16, {'count': 69}),
(16, 17, {'count': 35}),
(16, 19, {'count': 2}),
(16, 20, {'count': 49}),
(16, 23, {'count': 18}),
(16, 24, {'count': 31}),
(16, 25, {'count': 5}),
(16, 26, {'count': 4}),
(16, 27, {'count': 8}),
(16, 28, {'count': 3}),
(16, 29, {'count': 19}),
(16, 30, {'count': 14}),
(16, 31, {'count': 36}),
(16, 34, {'count': 11}),
(16, 35, {'count': 1}),
(16, 36, {'count': 27}),
(16, 37, {'count': 2}),
(16, 43, {'count': 4}),
(16, 44, {'count': 4}),
(16, 45, {'count': 1}),
(16, 46, {'count': 7}),
(16, 47, {'count': 23}),
(16, 48, {'count': 4}),
(16, 49, {'count': 16}),
(16, 50, {'count': 3}),
(16, 51, {'count': 3}),
(16, 52, {'count': 1}),
(16, 53, {'count': 8}),
(16, 54, {'count': 4}),
(16, 56, {'count': 9}),
(16, 58, {'count': 101}),
(16, 60, {'count': 36}),
(16, 61, {'count': 44}),
(16, 66, {'count': 7}),
(16, 67, {'count': 20}),
(16, 68, {'count': 2}),
(16, 69, {'count': 72}),
(16, 71, {'count': 8}),
(16, 72, {'count': 1}),
(16, 73, {'count': 1}),
(16, 74, {'count': 9}),
(16, 75, {'count': 24}),
(16, 76, {'count': 1}),
(16, 77, {'count': 1}),
(16, 80, {'count': 7}),
(16, 81, {'count': 9}),
(16, 84, {'count': 16}),
(16, 85, {'count': 13}),
(16, 86, {'count': 21}),
(16, 87, {'count': 15}),
(16, 88, {'count': 11}),
(16, 90, {'count': 2}),
(16, 91, {'count': 2}),
(16, 92, {'count': 16}),
(16, 93, {'count': 19}),
(16, 94, {'count': 35}),
(16, 97, {'count': 3}),
(16, 98, {'count': 15}),
(16, 99, {'count': 2}),
(16, 100, {'count': 18}),
(16, 106, {'count': 10}),
(16, 108, {'count': 3}),
(16, 110, {'count': 11}),
(16, 112, {'count': 3}),
(16, 113, {'count': 7}),
(16, 114, {'count': 12}),
(16, 115, {'count': 9}),
(16, 116, {'count': 11}),
(16, 117, {'count': 6}),
(16, 118, {'count': 21}),
(16, 119, {'count': 6}),
(16, 121, {'count': 1}),
(16, 122, {'count': 1}),
(16, 123, {'count': 21}),
(16, 126, {'count': 31}),
(16, 127, {'count': 1}),
(16, 128, {'count': 20}),
(16, 130, {'count': 39}),
(16, 131, {'count': 2}),
(16, 134, {'count': 1}),
(16, 137, {'count': 1}),
(16, 138, {'count': 5}),
(16, 140, {'count': 5}),
(16, 141, {'count': 13}),
(16, 143, {'count': 7}),
(16, 144, {'count': 21}),
(16, 152, {'count': 4}),
(16, 153, {'count': 4}),
(16, 154, {'count': 14}),
(16, 156, {'count': 9}),
(16, 157, {'count': 2}),
(16, 158, {'count': 7}),
(16, 159, {'count': 1}),
(16, 160, {'count': 7}),
(16, 162, {'count': 4}),
(16, 163, {'count': 3}),
(16, 164, {'count': 4}),
(16, 165, {'count': 9}),
(16, 166, {'count': 2}),
(16, 169, {'count': 2}),
(16, 173, {'count': 6}),
(16, 174, {'count': 1}),
(16, 176, {'count': 19}),
(16, 177, {'count': 11}),
(16, 181, {'count': 3}),
(16, 183, {'count': 21}),
(16, 185, {'count': 6}),
(16, 186, {'count': 7}),
(16, 188, {'count': 2}),
(16, 190, {'count': 25}),
(16, 191, {'count': 13}),
(16, 194, {'count': 2}),
(16, 196, {'count': 2}),
(16, 198, {'count': 4}),
(16, 199, {'count': 3}),
(16, 210, {'count': 21}),
(16, 211, {'count': 5}),
(16, 212, {'count': 5}),
(16, 213, {'count': 7}),
(16, 214, {'count': 8}),
(16, 215, {'count': 3}),
(16, 216, {'count': 4}),
(16, 217, {'count': 1}),
(16, 219, {'count': 9}),
(16, 220, {'count': 6}),
(16, 222, {'count': 2}),
(16, 223, {'count': 15}),
(16, 224, {'count': 5}),
(16, 225, {'count': 2}),
(16, 226, {'count': 5}),
(16, 227, {'count': 7}),
(16, 228, {'count': 1}),
(16, 229, {'count': 2}),
(16, 230, {'count': 5}),
(16, 231, {'count': 1}),
(16, 232, {'count': 8}),
(16, 233, {'count': 1}),
(16, 239, {'count': 2}),
(16, 240, {'count': 1}),
(16, 242, {'count': 3}),
(16, 243, {'count': 1}),
(16, 244, {'count': 1}),
(16, 250, {'count': 2}),
(16, 251, {'count': 2}),
(16, 255, {'count': 4}),
(16, 256, {'count': 1}),
(16, 258, {'count': 3}),
(16, 259, {'count': 4}),
(16, 260, {'count': 9}),
(16, 268, {'count': 4}),
(16, 273, {'count': 1}),
(16, 276, {'count': 3}),
(16, 279, {'count': 3}),
(16, 283, {'count': 1}),
(16, 285, {'count': 4}),
(16, 286, {'count': 9}),
(16, 287, {'count': 10}),
(16, 288, {'count': 6}),
(16, 289, {'count': 9}),
(16, 290, {'count': 1}),
(16, 291, {'count': 10}),
(16, 298, {'count': 1}),
(16, 299, {'count': 1}),
(16, 300, {'count': 8}),
(16, 301, {'count': 8}),
(16, 302, {'count': 3}),
(16, 304, {'count': 1}),
(16, 305, {'count': 1}),
(16, 307, {'count': 7}),
(16, 308, {'count': 2}),
(16, 309, {'count': 6}),
(16, 310, {'count': 8}),
(16, 311, {'count': 1}),
(16, 312, {'count': 1}),
(16, 313, {'count': 1}),
(16, 315, {'count': 3}),
(16, 316, {'count': 1}),
(16, 317, {'count': 1}),
(16, 318, {'count': 1}),
(16, 319, {'count': 3}),
(16, 327, {'count': 2}),
(16, 331, {'count': 1}),
(16, 332, {'count': 2}),
(16, 333, {'count': 6}),
(16, 337, {'count': 5}),
(16, 340, {'count': 1}),
(16, 342, {'count': 1}),
(16, 348, {'count': 1}),
(16, 349, {'count': 1}),
(17, 5, {'count': 2}),
(17, 13, {'count': 21}),
(17, 14, {'count': 4}),
(17, 15, {'count': 1}),
(17, 16, {'count': 25}),
(17, 17, {'count': 118}),
(17, 19, {'count': 7}),
(17, 20, {'count': 28}),
(17, 21, {'count': 4}),
(17, 22, {'count': 2}),
(17, 23, {'count': 22}),
(17, 24, {'count': 1}),
(17, 25, {'count': 15}),
(17, 26, {'count': 23}),
(17, 27, {'count': 16}),
(17, 28, {'count': 9}),
(17, 29, {'count': 30}),
(17, 30, {'count': 57}),
(17, 31, {'count': 15}),
(17, 32, {'count': 5}),
(17, 33, {'count': 6}),
(17, 34, {'count': 7}),
(17, 35, {'count': 3}),
(17, 36, {'count': 32}),
(17, 37, {'count': 8}),
(17, 43, {'count': 6}),
(17, 44, {'count': 8}),
(17, 45, {'count': 6}),
(17, 46, {'count': 8}),
(17, 47, {'count': 27}),
(17, 48, {'count': 20}),
(17, 49, {'count': 10}),
(17, 50, {'count': 2}),
(17, 51, {'count': 11}),
(17, 52, {'count': 13}),
(17, 53, {'count': 7}),
(17, 54, {'count': 26}),
(17, 56, {'count': 57}),
(17, 58, {'count': 54}),
(17, 59, {'count': 3}),
(17, 60, {'count': 25}),
(17, 61, {'count': 84}),
(17, 62, {'count': 2}),
(17, 66, {'count': 14}),
(17, 67, {'count': 25}),
(17, 68, {'count': 2}),
(17, 69, {'count': 308}),
(17, 71, {'count': 30}),
(17, 73, {'count': 8}),
(17, 74, {'count': 20}),
(17, 75, {'count': 10}),
(17, 76, {'count': 2}),
(17, 77, {'count': 19}),
(17, 80, {'count': 8}),
(17, 81, {'count': 10}),
(17, 84, {'count': 8}),
(17, 85, {'count': 27}),
(17, 86, {'count': 38}),
(17, 87, {'count': 11}),
(17, 88, {'count': 25}),
(17, 90, {'count': 9}),
(17, 91, {'count': 43}),
(17, 92, {'count': 16}),
(17, 93, {'count': 16}),
(17, 94, {'count': 14}),
(17, 97, {'count': 7}),
(17, 98, {'count': 13}),
(17, 99, {'count': 7}),
(17, 100, {'count': 15}),
(17, 106, {'count': 5}),
(17, 110, {'count': 9}),
(17, 111, {'count': 3}),
(17, 112, {'count': 37}),
(17, 114, {'count': 5}),
(17, 115, {'count': 7}),
(17, 116, {'count': 15}),
(17, 117, {'count': 3}),
(17, 118, {'count': 6}),
(17, 119, {'count': 4}),
(17, 121, {'count': 1}),
(17, 122, {'count': 40}),
(17, 123, {'count': 41}),
(17, 124, {'count': 4}),
(17, 126, {'count': 18}),
(17, 127, {'count': 1}),
(17, 128, {'count': 63}),
(17, 129, {'count': 1}),
(17, 130, {'count': 76}),
(17, 134, {'count': 1}),
(17, 138, {'count': 4}),
(17, 140, {'count': 13}),
(17, 141, {'count': 4}),
(17, 143, {'count': 9}),
(17, 144, {'count': 8}),
(17, 146, {'count': 2}),
(17, 149, {'count': 1}),
(17, 152, {'count': 3}),
(17, 153, {'count': 4}),
(17, 154, {'count': 8}),
(17, 156, {'count': 4}),
(17, 157, {'count': 3}),
(17, 158, {'count': 32}),
(17, 159, {'count': 23}),
(17, 160, {'count': 11}),
(17, 162, {'count': 7}),
(17, 164, {'count': 12}),
(17, 166, {'count': 7}),
(17, 167, {'count': 1}),
(17, 169, {'count': 2}),
(17, 170, {'count': 1}),
(17, 173, {'count': 13}),
(17, 176, {'count': 21}),
(17, 177, {'count': 4}),
(17, 181, {'count': 15}),
(17, 183, {'count': 78}),
(17, 185, {'count': 14}),
(17, 186, {'count': 4}),
(17, 188, {'count': 6}),
(17, 190, {'count': 2}),
...]
In [13]:
len(G.edges())
Out[13]:
44422
In [15]:
len(G.nodes())
Out[15]:
300
In [ ]:
from collections import Counter
# Count the number of edges that have x trips recorded on them.
trip_count_distr = ______________________________
# Then plot the distribution of these
plt.scatter(_______________, _______________, alpha=0.1)
plt.yscale('log')
plt.xlabel('num. of trips')
plt.ylabel('num. of edges')
In [ ]:
# Filter the edges to just those with more than 100 trips.
G_filtered = G.copy()
for u, v, d in G.edges(data=True):
# Fill in your code here.
len(G_filtered.edges())
Let's now try drawing the graph.
In [ ]:
# Fill in your code here.
In [ ]:
nodes = sorted(_________________, key=lambda x:_________________)
edges = ___________
edgeprops = dict(alpha=0.1)
nodecolor = plt.cm.viridis(np.arange(len(nodes)) / len(nodes))
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111)
c = CircosPlot(nodes, edges, radius=10, ax=ax, fig=fig, edgeprops=edgeprops, nodecolor=nodecolor)
c.draw()
plt.savefig('images/divvy.png', dpi=300)
In this visual, nodes are sorted from highest connectivity to lowest connectivity in the unfiltered graph.
Edges represent only trips that were taken >100 times between those two nodes.
Some things should be quite evident here. There are lots of trips between the highly connected nodes and other nodes, but there are local "high traffic" connections between stations of low connectivity as well (nodes in the top-right quadrant).
In [ ]:
nx.write_gpickle(G, 'datasets/divvy_2013/divvy_graph.pkl')
In [ ]:
G = nx.read_gpickle('datasets/divvy_2013/divvy_graph.pkl')
In [ ]:
Content source: SubhankarGhosh/NetworkX
Similar notebooks: