annotate scripts/visualize-monresovelo.py @ 763:277e9cdcedce dev

added demo script for monresovelo
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Sun, 29 Nov 2015 00:22:58 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
763
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
2 import simplejson, sys, datetime
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
3 import moving, utils
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
4 from pyproj import Proj
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
5
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
6 import matplotlib.pyplot as plt
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
7 import matplotlib.mlab as pylab
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
8 import numpy as np
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
9 import pandas as pd
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
10
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
11 #notes = [f['properties']['notes'] for f in data['features'] if len(f['properties']['notes']) > 0]
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
12
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
13 english2French = {'Commute': 'Domicile-travail',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
14 'Errand': 'Courses',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
15 'Exercise': 'Sport',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
16 'Leisure': 'Loisirs',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
17 'Other': 'Autre',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
18 'Autres': 'Autre',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
19 'Autres motifs': 'Autre',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
20 'School': u'École',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
21 'Shopping': 'Magasinage',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
22 'Work-Related': 'Travail',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
23 'Work-related': 'Travail',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
24 'Other': 'Autre',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
25 'other': 'Autre'}
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
26
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
27 odMotifs = ['Magasinage', 'Retour au domicile', "Chercher quelqu'un",
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
28 'Travail ', '\xc9tude / \xc9cole', 'Autre', 'Loisir',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
29 "Visites d'ami(e)s et/ou de la parent\xe9", "Reconduire quelqu'un",
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
30 "Rendez-vous d'affaires", 'Sant\xe9',
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
31 'Ind\xe9termin\xe9 / refus / NSP']
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
32
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
33 def convertJsonToMTM(data = None, filename = None):
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
34 'Converts the in put json data to MTM and optionally saves to file'
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
35 proj = Proj(init="epsg:2950")
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
36 if data is None:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
37 data = simplejson.load(open(filename))
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
38 for i in xrange(len(data['features'])):
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
39 latlon = data['features'][i]['geometry']['coordinates']
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
40 mtm = [proj(p[0], p[1]) for p in latlon]
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
41 data['features'][i]['geometry']['coordinates'] = mtm
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
42 if filename is not None:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
43 simplejson.dump(data, open(utils.removeExtension(filename)+'-mtm.json', 'w'))
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
44 return data
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
45
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
46 def convertToObjects(data, timeStep = 1, project = True, minLength = 10):
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
47 'Converts the trips to the moving.MovingObject class from Traffic Intelligence'
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
48 if project:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
49 proj = Proj(init="epsg:2950")
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
50 objects = []
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
51 nTrips = len(data['features'])
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
52 for i in xrange(nTrips):
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
53 latlon = data['features'][i]['geometry']['coordinates']
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
54 if project:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
55 projectedX = [proj(p[0], p[1]) for p in latlon[::timeStep]]
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
56 else:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
57 projectedX = latlon[::timeStep]
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
58 o = moving.MovingObject(num = i, positions = moving.Trajectory(np.array(projectedX).T.tolist()))
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
59 o.properties = data['features'][i]['properties']
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
60 o.motif = english2French.get(o.properties['purpose'], o.properties['purpose'])
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
61 try:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
62 o.start = datetime.datetime.strptime(o.properties['start'], '%Y-%m-%d %H:%M:%S')
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
63 o.stop = datetime.datetime.strptime(o.properties['stop'], '%Y-%m-%d %H:%M:%S')
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
64 if o.positions.length() > minLength:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
65 objects.append(o)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
66 except TypeError:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
67 print('{} {}'.format(o.properties['start'], o.properties['stop']))
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
68 print('issue with {}'.format(o.properties))
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
69 #o.start = datetime.datetime(1979, 7, 21)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
70 #o.stop = o.start
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
71 #print(e)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
72 return objects
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
73
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
74 filename = './trip5000.json'
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
75 data = simplejson.load(open(filename))
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
76 # od = pd.read_csv('/home/nicolas/tmp/defivelomtl/velo-od-2013/od13niv2 - Résident MTL avec vélo.csv', delimiter = ';')
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
77
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
78 #convertJsonToMTM(data)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
79 #objects = convertToObjects(data, project = False, minLength = 10)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
80 objects = convertToObjects(data, minLength = 10)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
81 colors = utils.PlottingPropertyValues('rk')
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
82
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
83 def printMRV(objects, motifs, color, linewidth, alpha, blackBG = False):
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
84 fig = plt.figure()
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
85 for o in objects:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
86 if o.motif in motifs:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
87 o.plot(color, linewidth = linewidth, alpha = alpha)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
88 plt.axis('equal')
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
89 plt.axis('off')
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
90 plt.tight_layout()
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
91 if blackBG:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
92 fig.patch.set_facecolor('black')
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
93 plt.savefig(u'mrv-'+u'-'.join(motifs).replace(' ', '-')+'-'+color+'-blackbg.png', dpi = 300, facecolor=fig.get_facecolor(), edgecolor='none')
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
94 else:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
95 plt.savefig(u'mrv-'+u'-'.join(motifs).replace(' ', '-')+'-'+color+u'.png', dpi = 300)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
96
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
97 for i, m in enumerate(allmotifs):
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
98 printMRV(objects, [m], colors[i], 0.5, 0.1)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
99
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
100 printMRV(objects, ['Aller au travail', 'Domicile-travail'], 'k', 0.5, 0.1)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
101 printMRV(objects, ['Travail', u'D\xe9placement professionnel'], 'k', 0.5, 0.1)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
102 printMRV(objects, ['Aller au travail', 'Domicile-travail', 'Travail', u'D\xe9placement professionnel'], 'k', 0.5, 0.1)
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
103
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
104 # generate an enriched json with added data
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
105 generateJSON = False
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
106 if generateJSON:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
107 for o in objects:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
108 o.positions.computeCumulativeDistances()
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
109
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
110 #properties = {'length': [],
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
111 # 'wiggliness': []}
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
112
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
113 removeBothEnds = 2
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
114 # export mean speed, nseconds, wiggliness, speeds, accel
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
115 for o in objects:
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
116 #print o.positions.length(), (o.stop-o.start).seconds, (o.stop-o.start).seconds/float(o.positions.length()), o.positions.wiggliness()
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
117 #print o.positions.length(), o.properties['n_coord'], len(o.positions.differentiateSG(5,2,2)), len(o.positions.differentiateSG(5,2,1))
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
118 speeds = o.positions.differentiateSG(5,2,1, removeBothEnds = removeBothEnds).norm().tolist()
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
119 accel = o.positions.differentiateSG(5,2,2, removeBothEnds = removeBothEnds).norm().tolist()
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
120 data['features'][o.getNum()]['properties']['speeds'] = [speeds[0]]*removeBothEnds+speeds+[speeds[-1]]*removeBothEnds
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
121 data['features'][o.getNum()]['properties']['accelerations'] = [accel[0]]*removeBothEnds+accel+[accel[-1]]*removeBothEnds
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
122 data['features'][o.getNum()]['properties']['n_points'] = o.positions.length()
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
123 data['features'][o.getNum()]['properties']['n_seconds'] = (o.stop-o.start).seconds
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
124 data['features'][o.getNum()]['properties']['mean_speed'] = o.positions.cumulativeDistances[-1]/data['features'][o.getNum()]['properties']['n_seconds']
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
125 data['features'][o.getNum()]['properties']['wiggliness'] = o.positions.wiggliness()
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
126
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
127 nums = [o.getNum() for o in objects]
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
128 data['features'] = [d for i, d in enumerate(data['features']) if i in nums]
277e9cdcedce added demo script for monresovelo
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
129 simplejson.dump(data, open(utils.removeExtension(filename)+'-enriched.json', 'w'))