vrijdag 9 oktober 2015

Foute bussen - deel een - Dataverzamelen

Een van de eerste voorbeelden van anomaly detection die ik tegengekomen ben is in een speech van Jeff Hawking (Numenta) waarin verwezen werd naar een Rotterdams experiment met 'smart harbor'. Of te wel het vaststellen of er ongebruikelijk vaarbewegingen zijn van de grote zeeschepen in de haven. De schepen zijn blijkbaar verplicht om regelmatig hun coordinaten door te geven en enige tijd (blijkbaar nu niet meer) deelde de haven Rotterdam deze op internet. Dat lijkt een interessant iets om ook eens te proberen.

Helaas is Rotterdam dus niet meer zo gul met hun data maar bij het leren van Python heb ik wel eens gespeeld met vergelijkbare data van de busmaatschappij in Chicago. Deze is 'eenvoudig' ophaalbaar en kan dan wellicht een anomaly detectie systeem in worden gepompt. De gangbare routes kunnen daarmee dus worden vastgelegd. Wijkt de bus een keertje daarvan af dan zou dit gedetecteerd moeten gaan worden. Hoe dat dan het beste kan worstel ik nog wat mee. Bijvoorbeeld een aantal tijd/plaats combinaties zouten dan een nieuwe tijd/plaats combinatie moeten voorspellen.  Wijkt de bus daar (relevant??) van af dan is er sprake van een anomaly en heeft de buschauffeur dan dus bijvoorbeeld de verkeerde afslag genomen.

Eerst maar eens zien hoe we de data bruikbaar kunnen krijgen. Het bij elkaar verzamelen is, zoals aangegeven, niet zo moeilijk. Meer tijd gaat zitten in het onderbreekbaar maken van het programma zonder de data te verliezen. Tot nu toe lijkt dit aardig te werken:

import urllib
import webbrowser
import time
from xml.etree.ElementTree import parse
import numpy as np
from sklearn.externals import joblib
import signal
import sys
Data = []
Data2= []
terminate_loop =False

def signal_handler(signal, frame):
    global terminate_loop
    terminate_loop = True
    print 'You pressed Ctrl+C!'

signal.signal(signal.SIGINT, signal_handler)
print "Start : %s" % time.ctime()

joblib.dump(Data, '/Users/DWW/Documents/Bus_outlier.pkl')

for n in range(3):
    u = urllib.urlopen('http://ctabustracker.com/bustime/map/getBusesForRoute.jsp?route=22',data=None)
    doc = parse(u)
    tim = doc.findtext('time')
    for bus in doc.findall('bus'):
        busid = bus.findtext('id')
        lat = float(bus.findtext('lat'))
        lon = float(bus.findtext('lon'))
        #print busid , lat , lon
        Data.append([busid,tim, lat, lon])
    print 'n = ',n
    if terminate_loop:
        print 'Terminate = ', terminate_loop
        break
    time.sleep(2.0)
    print "now : %s" % time.ctime()

Data2 = joblib.load('/Users/DWW/Documents/Bus_outlier.pkl')
Data = Data + Data2
joblib.dump(Data, '/Users/DWW/Documents/Bus_outlier.pkl')



Data2 = joblib.load('/Users/DWW/Documents/Bus_outlier.pkl')
Data2 = sorted(Data2, key = lambda x: (x[0], x[1]))
for i in range(len(Data2)-1):
    print i,Data2[i] + Data2[i+1][2:]
print('ready')





Geen opmerkingen:

Een reactie posten