changeset 764:bcb05a20af19 dev

add ipynb
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Sun, 29 Nov 2015 00:34:21 -0500
parents 277e9cdcedce
children 9aac5f016842
files samples/visualize-monresovelo.ipynb scripts/visualize-monresovelo.py
diffstat 2 files changed, 165 insertions(+), 129 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/visualize-monresovelo.ipynb	Sun Nov 29 00:34:21 2015 -0500
@@ -0,0 +1,165 @@
+{
+ "metadata": {
+  "name": "",
+  "signature": "sha256:41993ae5abde8891ff6d0f0e629cee32073532fd0e17b4f7181a43a70dbecd73"
+ },
+ "nbformat": 3,
+ "nbformat_minor": 0,
+ "worksheets": [
+  {
+   "cells": [
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "%matplotlib inline\n",
+      "# -*- coding: utf-8 -*-\n",
+      "import simplejson, sys, datetime\n",
+      "import moving, utils # from Traffic Intelligence https://bitbucket.org/Nicolas/trafficintelligence\n",
+      "from pyproj import Proj\n",
+      "\n",
+      "import matplotlib.pyplot as plt\n",
+      "import matplotlib.mlab as pylab\n",
+      "import numpy as np\n",
+      "import pandas as pd\n",
+      "\n",
+      "english2French = {'Commute': 'Domicile-travail',\n",
+      "                  'Errand': 'Courses',\n",
+      "                  'Exercise': 'Sport',\n",
+      "                  'Leisure': 'Loisirs',\n",
+      "                  'Other': 'Autre',\n",
+      "                  'Autres': 'Autre',\n",
+      "                  'Autres motifs': 'Autre',\n",
+      "                  'School': u'\u00c9cole',\n",
+      "                  'Shopping': 'Magasinage',\n",
+      "                  'Work-Related': 'Travail',\n",
+      "                  'Work-related': 'Travail',\n",
+      "                  'Other': 'Autre',\n",
+      "                  'other': 'Autre'}\n",
+      "\n",
+      "odMotifs = ['Magasinage', 'Retour au domicile', \"Chercher quelqu'un\",\n",
+      "            'Travail ', '\\xc9tude / \\xc9cole', 'Autre', 'Loisir',\n",
+      "            \"Visites d'ami(e)s et/ou de la parent\\xe9\", \"Reconduire quelqu'un\",\n",
+      "            \"Rendez-vous d'affaires\", 'Sant\\xe9',\n",
+      "            'Ind\\xe9termin\\xe9 / refus / NSP']\n",
+      "\n",
+      "def convertJsonToMTM(data = None, filename = None):\n",
+      "    'Converts the in put json data to MTM and optionally saves to file'\n",
+      "    proj = Proj(init=\"epsg:2950\")\n",
+      "    if data is None:\n",
+      "        data = simplejson.load(open(filename))\n",
+      "    for i in xrange(len(data['features'])):\n",
+      "        latlon = data['features'][i]['geometry']['coordinates']\n",
+      "        mtm = [proj(p[0], p[1]) for p in latlon]\n",
+      "        data['features'][i]['geometry']['coordinates'] = mtm\n",
+      "    if filename is not None:\n",
+      "        simplejson.dump(data, open(utils.removeExtension(filename)+'-mtm.json', 'w'))\n",
+      "    return data\n",
+      "\n",
+      "def convertToObjects(data, timeStep = 1, project = True, minLength = 10):\n",
+      "    'Converts the trips to the moving.MovingObject class from Traffic Intelligence'\n",
+      "    if project:\n",
+      "        proj = Proj(init=\"epsg:2950\")\n",
+      "    objects = []\n",
+      "    nTrips = len(data['features'])\n",
+      "    for i in xrange(nTrips):\n",
+      "        latlon = data['features'][i]['geometry']['coordinates']\n",
+      "        if project:\n",
+      "            projectedX = [proj(p[0], p[1]) for p in latlon[::timeStep]]\n",
+      "        else:\n",
+      "            projectedX = latlon[::timeStep]\n",
+      "        o = moving.MovingObject(num = i, positions = moving.Trajectory(np.array(projectedX).T.tolist()))\n",
+      "        o.properties = data['features'][i]['properties']\n",
+      "        o.motif = english2French.get(o.properties['purpose'], o.properties['purpose'])\n",
+      "        try:\n",
+      "            o.start = datetime.datetime.strptime(o.properties['start'], '%Y-%m-%d %H:%M:%S')\n",
+      "            o.stop = datetime.datetime.strptime(o.properties['stop'], '%Y-%m-%d %H:%M:%S')\n",
+      "            if o.positions.length() > minLength:\n",
+      "                objects.append(o)\n",
+      "        except TypeError:\n",
+      "            print('{} {}'.format(o.properties['start'], o.properties['stop']))\n",
+      "            print('issue with {}'.format(o.properties))\n",
+      "            #o.start = datetime.datetime(1979, 7, 21)\n",
+      "            #o.stop = o.start\n",
+      "            #print(e)\n",
+      "    return objects\n",
+      "\n",
+      "def printMRV(objects, motifs, color, linewidth, alpha, blackBG = False):\n",
+      "    fig = plt.figure()\n",
+      "    for o in objects:\n",
+      "        if o.motif in motifs:\n",
+      "            o.plot(color, linewidth = linewidth, alpha = alpha)\n",
+      "    plt.axis('equal')\n",
+      "    plt.axis('off')\n",
+      "    plt.tight_layout()\n",
+      "    if blackBG:\n",
+      "        fig.patch.set_facecolor('black')\n",
+      "        plt.savefig(u'mrv-'+u'-'.join(motifs).replace(' ', '-')+'-'+color+'-blackbg.png', dpi = 300, facecolor=fig.get_facecolor(), edgecolor='none')\n",
+      "    else:\n",
+      "        plt.savefig(u'mrv-'+u'-'.join(motifs).replace(' ', '-')+'-'+color+u'.png', dpi = 300)"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [],
+     "prompt_number": 6
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "# load the data\n",
+      "filename = './trip5000.json'\n",
+      "data = simplejson.load(open(filename))\n",
+      "\n",
+      "#convertJsonToMTM(data)\n",
+      "#objects = convertToObjects(data, project = False, minLength = 10)\n",
+      "objects = convertToObjects(data, minLength = 10)\n",
+      "colors = utils.PlottingPropertyValues('rk')"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "output_type": "stream",
+       "stream": "stdout",
+       "text": [
+        "None None\n",
+        "issue with {'stop': None, 'id_origine': 9795, 'start': None, 'length': 1181, 'purpose': 'Commute', 'liste_segments_jsonb': [{'source': 'RES_CYCL_2015', 'id': 4824}, {'source': 'RES_CYCL_2015', 'id': 5513}, {'source': 'RES_CYCL_2015', 'id': 4177}, {'source': 'RES_CYCL_2015', 'id': 4094}], 'n_coord': 1216, 'id': 9795}\n"
+       ]
+      }
+     ],
+     "prompt_number": 7
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "allmotifs = set([o.motif for o in objects])\n",
+      "printMRV(objects, allmotifs, 'r', 0.5, 0.1, True)\n",
+      "# visualize all trip purposes\n",
+      "#for i, m in enumerate(allmotifs):\n",
+      "#    printMRV(objects, [m], colors[i], 0.5, 0.1)\n",
+      "\n",
+      "#printMRV(objects, ['Aller au travail', 'Domicile-travail'], 'k', 0.5, 0.1)\n",
+      "#printMRV(objects, ['Travail', u'D\\xe9placement professionnel'], 'k', 0.5, 0.1)\n",
+      "#printMRV(objects, ['Aller au travail', 'Domicile-travail', 'Travail', u'D\\xe9placement professionnel'], 'k', 0.5, 0.1)"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "metadata": {},
+       "output_type": "display_data",
+       "png": "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\n8Y+nHiedTO3LOkrzRvN2JXWKxHs7/N5oVd5C6oSPtdSc1u3Ugon7qVidTM1zPZs6PeP71M28HZxL\nvf5HPf6Fg3Kj7pxcT0XqsA1S80prw4/Tqe/Qr0Wcpu211GO5n4c/3uxY6puT5dQese9SCx5upN6H\n0UKa1eGf+SQVrS5xWk6deCFOzJIR1BytpJYRH9bjtKdSm2Xvpb4ALqZGUA/icrRZWkhdx/556vHc\namqe74eML6QczeOdyvgOsPXUcvZ3knydnQ+HnZcLqaXv249qgmkSqDl7IfWF6P/cyLpfo1s6t38x\nmeTaCA7uUuobktG14CupkdPmx73PpUZOoxtaf0ydSNHFILXH7ds8PtskeHwJVANnUycCTNuJ1OGs\nC6n5jD/jds5uPk2dSHE+Nd90ObXHqeN/ylOp/XBXY98Th0OgGjiROo1gGtebD1KPkBZTj/LW4w3m\nYBZTCyI2Ys6Jw2UfVAP3Mj7Fer93Qx1LhWmQ2qNzlPch8WhPZzpziiupvXCrqVH3T/E4mMNnBNXI\nuUy+6XGQmrP4JxWmWV5ESH+rqXnNhb3+4B7+Su3TsrKTeRKoJp5PvRnbDwTd/AYtDT8Gw1/7NzUv\ncCtP5m2bwNEmUE0cT42g1lNzUQ9Sb86ZjA9h/Tv16G5j06/9EaMm4GgSqGaOpx7ZLQ1/fjtbrzQH\neFIIFAAtOeoIgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQK\ngJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqA\nlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCW\nBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYE\nCoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlgQKgJYECoCWBAqAlv4D\nuzMqwIjiJ78AAAAASUVORK5CYII=\n",
+       "text": [
+        "<matplotlib.figure.Figure at 0x7f90c46d61d0>"
+       ]
+      }
+     ],
+     "prompt_number": 9
+    }
+   ],
+   "metadata": {}
+  }
+ ]
+}
\ No newline at end of file
--- a/scripts/visualize-monresovelo.py	Sun Nov 29 00:22:58 2015 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-# -*- coding: utf-8 -*-
-import simplejson, sys, datetime
-import moving, utils
-from pyproj import Proj
-
-import matplotlib.pyplot as plt
-import matplotlib.mlab as pylab
-import numpy as np
-import pandas as pd
-
-#notes = [f['properties']['notes'] for f in data['features'] if len(f['properties']['notes']) > 0]
-
-english2French = {'Commute': 'Domicile-travail',
-                  'Errand': 'Courses',
-                  'Exercise': 'Sport',
-                  'Leisure': 'Loisirs',
-                  'Other': 'Autre',
-                  'Autres': 'Autre',
-                  'Autres motifs': 'Autre',
-                  'School': u'École',
-                  'Shopping': 'Magasinage',
-                  'Work-Related': 'Travail',
-                  'Work-related': 'Travail',
-                  'Other': 'Autre',
-                  'other': 'Autre'}
-
-odMotifs = ['Magasinage', 'Retour au domicile', "Chercher quelqu'un",
-            'Travail ', '\xc9tude / \xc9cole', 'Autre', 'Loisir',
-            "Visites d'ami(e)s et/ou de la parent\xe9", "Reconduire quelqu'un",
-            "Rendez-vous d'affaires", 'Sant\xe9',
-            'Ind\xe9termin\xe9 / refus / NSP']
-
-def convertJsonToMTM(data = None, filename = None):
-    'Converts the in put json data to MTM and optionally saves to file'
-    proj = Proj(init="epsg:2950")
-    if data is None:
-        data = simplejson.load(open(filename))
-    for i in xrange(len(data['features'])):
-        latlon = data['features'][i]['geometry']['coordinates']
-        mtm = [proj(p[0], p[1]) for p in latlon]
-        data['features'][i]['geometry']['coordinates'] = mtm
-    if filename is not None:
-        simplejson.dump(data, open(utils.removeExtension(filename)+'-mtm.json', 'w'))
-    return data
-
-def convertToObjects(data, timeStep = 1, project = True, minLength = 10):
-    'Converts the trips to the moving.MovingObject class from Traffic Intelligence'
-    if project:
-        proj = Proj(init="epsg:2950")
-    objects = []
-    nTrips = len(data['features'])
-    for i in xrange(nTrips):
-        latlon = data['features'][i]['geometry']['coordinates']
-        if project:
-            projectedX = [proj(p[0], p[1]) for p in latlon[::timeStep]]
-        else:
-            projectedX = latlon[::timeStep]
-        o = moving.MovingObject(num = i, positions = moving.Trajectory(np.array(projectedX).T.tolist()))
-        o.properties = data['features'][i]['properties']
-        o.motif = english2French.get(o.properties['purpose'], o.properties['purpose'])
-        try:
-            o.start = datetime.datetime.strptime(o.properties['start'], '%Y-%m-%d %H:%M:%S')
-            o.stop = datetime.datetime.strptime(o.properties['stop'], '%Y-%m-%d %H:%M:%S')
-            if o.positions.length() > minLength:
-                objects.append(o)
-        except TypeError:
-            print('{} {}'.format(o.properties['start'], o.properties['stop']))
-            print('issue with {}'.format(o.properties))
-            #o.start = datetime.datetime(1979, 7, 21)
-            #o.stop = o.start
-            #print(e)
-    return objects
-
-filename = './trip5000.json'
-data = simplejson.load(open(filename))
-# od = pd.read_csv('/home/nicolas/tmp/defivelomtl/velo-od-2013/od13niv2 - Résident MTL avec vélo.csv', delimiter = ';')
-
-#convertJsonToMTM(data)
-#objects = convertToObjects(data, project = False, minLength = 10)
-objects = convertToObjects(data, minLength = 10)
-colors = utils.PlottingPropertyValues('rk')
-
-def printMRV(objects, motifs, color, linewidth, alpha, blackBG = False):
-    fig = plt.figure()
-    for o in objects:
-        if o.motif in motifs:
-            o.plot(color, linewidth = linewidth, alpha = alpha)
-    plt.axis('equal')
-    plt.axis('off')
-    plt.tight_layout()
-    if blackBG:
-        fig.patch.set_facecolor('black')
-        plt.savefig(u'mrv-'+u'-'.join(motifs).replace(' ', '-')+'-'+color+'-blackbg.png', dpi = 300, facecolor=fig.get_facecolor(), edgecolor='none')
-    else:
-        plt.savefig(u'mrv-'+u'-'.join(motifs).replace(' ', '-')+'-'+color+u'.png', dpi = 300)
-
-for i, m in enumerate(allmotifs):
-    printMRV(objects, [m], colors[i], 0.5, 0.1)
-
-printMRV(objects, ['Aller au travail', 'Domicile-travail'], 'k', 0.5, 0.1)
-printMRV(objects, ['Travail', u'D\xe9placement professionnel'], 'k', 0.5, 0.1)
-printMRV(objects, ['Aller au travail', 'Domicile-travail', 'Travail', u'D\xe9placement professionnel'], 'k', 0.5, 0.1)
-
-# generate an enriched json with added data
-generateJSON = False
-if generateJSON:
-    for o in objects:
-        o.positions.computeCumulativeDistances()
-
-#properties = {'length': [],
-#              'wiggliness': []}
-
-    removeBothEnds = 2
-    # export mean speed, nseconds, wiggliness, speeds, accel
-    for o in objects:
-        #print o.positions.length(), (o.stop-o.start).seconds, (o.stop-o.start).seconds/float(o.positions.length()), o.positions.wiggliness()
-        #print o.positions.length(), o.properties['n_coord'], len(o.positions.differentiateSG(5,2,2)), len(o.positions.differentiateSG(5,2,1))
-        speeds = o.positions.differentiateSG(5,2,1, removeBothEnds = removeBothEnds).norm().tolist()
-        accel = o.positions.differentiateSG(5,2,2, removeBothEnds = removeBothEnds).norm().tolist()
-        data['features'][o.getNum()]['properties']['speeds'] = [speeds[0]]*removeBothEnds+speeds+[speeds[-1]]*removeBothEnds
-        data['features'][o.getNum()]['properties']['accelerations'] = [accel[0]]*removeBothEnds+accel+[accel[-1]]*removeBothEnds
-        data['features'][o.getNum()]['properties']['n_points'] = o.positions.length()
-        data['features'][o.getNum()]['properties']['n_seconds'] = (o.stop-o.start).seconds
-        data['features'][o.getNum()]['properties']['mean_speed'] = o.positions.cumulativeDistances[-1]/data['features'][o.getNum()]['properties']['n_seconds']
-        data['features'][o.getNum()]['properties']['wiggliness'] = o.positions.wiggliness()
-
-    nums = [o.getNum() for o in objects]
-    data['features'] = [d for i, d in enumerate(data['features']) if i in nums]
-    simplejson.dump(data, open(utils.removeExtension(filename)+'-enriched.json', 'w'))