comparison python/storage.py @ 756:a73f43aac00e dev

moved pandas imports, sql in comments
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 30 Oct 2015 17:57:09 -0400
parents f3aeb0b47eff
children a05b70f307dd
comparison
equal deleted inserted replaced
755:f3aeb0b47eff 756:a73f43aac00e
5 import utils, moving, events, indicators, shutil 5 import utils, moving, events, indicators, shutil
6 from base import VideoFilenameAddable 6 from base import VideoFilenameAddable
7 7
8 import sqlite3, logging 8 import sqlite3, logging
9 from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt 9 from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt
10 from pandas import read_csv, merge
10 11
11 12
12 commentChar = '#' 13 commentChar = '#'
13 14
14 delimiterChar = '%'; 15 delimiterChar = '%';
774 Assumed to be sorted over time 775 Assumed to be sorted over time
775 Warning: if reading from SQLite a limited number of objects, objectNumbers will be the maximum object id''' 776 Warning: if reading from SQLite a limited number of objects, objectNumbers will be the maximum object id'''
776 objects = {} # dictionary of objects index by their id 777 objects = {} # dictionary of objects index by their id
777 778
778 if usePandas: 779 if usePandas:
779 from pandas import read_csv
780 data = read_csv(filename, delimiter=';', comment='*', header=0, skiprows = 1, low_memory = lowMemory) 780 data = read_csv(filename, delimiter=';', comment='*', header=0, skiprows = 1, low_memory = lowMemory)
781 generatePDLaneColumn(data) 781 generatePDLaneColumn(data)
782 data['TIME'] = data['$VEHICLE:SIMSEC']*simulationStepsPerTimeUnit 782 data['TIME'] = data['$VEHICLE:SIMSEC']*simulationStepsPerTimeUnit
783 if warmUpLastInstant is not None: 783 if warmUpLastInstant is not None:
784 data = data[data['TIME']>=warmUpLastInstant] 784 data = data[data['TIME']>=warmUpLastInstant]
861 861
862 Vehicles are considered finally stationary 862 Vehicles are considered finally stationary
863 if more than proportionStationaryTime of their total time 863 if more than proportionStationaryTime of their total time
864 If lanes is not None, only the data for the selected lanes will be provided 864 If lanes is not None, only the data for the selected lanes will be provided
865 (format as string x_y where x is link index and y is lane index)''' 865 (format as string x_y where x is link index and y is lane index)'''
866 from pandas import read_csv 866 if filename.endswith(".fzp"):
867 columns = ['NO', '$VEHICLE:SIMSEC', 'POS'] 867 columns = ['NO', '$VEHICLE:SIMSEC', 'POS']
868 if lanes is not None: 868 if lanes is not None:
869 columns += ['LANE\LINK\NO', 'LANE\INDEX'] 869 columns += ['LANE\LINK\NO', 'LANE\INDEX']
870 data = read_csv(filename, delimiter=';', comment='*', header=0, skiprows = 1, usecols = columns, low_memory = lowMemory) 870 data = read_csv(filename, delimiter=';', comment='*', header=0, skiprows = 1, usecols = columns, low_memory = lowMemory)
871 data = selectPDLanes(data, lanes) 871 data = selectPDLanes(data, lanes)
872 data.sort(['$VEHICLE:SIMSEC'], inplace = True) 872 data.sort(['$VEHICLE:SIMSEC'], inplace = True)
873 873
874 nStationary = 0 874 nStationary = 0
875 nVehicles = 0 875 nVehicles = 0
876 for name, group in data.groupby(['NO'], sort = False): 876 for name, group in data.groupby(['NO'], sort = False):
877 nVehicles += 1 877 nVehicles += 1
878 positions = array(group['POS']) 878 positions = array(group['POS'])
879 diff = positions[1:]-positions[:-1] 879 diff = positions[1:]-positions[:-1]
880 if npsum(diff == 0.) >= proportionStationaryTime*len(positions): 880 if npsum(diff == 0.) >= proportionStationaryTime*(len(positions)-1):
881 nStationary += 1 881 nStationary += 1
882 elif filename.endswith(".sqlite"):
883 # select trajectory_id, t, s_coordinate, speed from curvilinear_positions where trajectory_id between 1860 and 1870 and speed < 0.1
884 # pb of the meaning of proportionStationaryTime in arterial network? Why proportion of existence time?
885 pass
886 else:
887 print("File type of "+filename+" not supported (only .sqlite and .fzp files)")
882 888
883 return nStationary, nVehicles 889 return nStationary, nVehicles
884 890
885 def countCollisionsVissim(filename, lanes = None, collisionTimeDifference = 0.2, lowMemory = True): 891 def countCollisionsVissim(filename, lanes = None, collisionTimeDifference = 0.2, lowMemory = True):
886 '''Counts the number of collisions per lane in a VISSIM trajectory file 892 '''Counts the number of collisions per lane in a VISSIM trajectory file
888 To distinguish between cars passing and collision, 894 To distinguish between cars passing and collision,
889 one checks when the sign of the position difference inverts 895 one checks when the sign of the position difference inverts
890 (if the time are closer than collisionTimeDifference) 896 (if the time are closer than collisionTimeDifference)
891 If lanes is not None, only the data for the selected lanes will be provided 897 If lanes is not None, only the data for the selected lanes will be provided
892 (format as string x_y where x is link index and y is lane index)''' 898 (format as string x_y where x is link index and y is lane index)'''
893 from pandas import read_csv, merge
894 data = read_csv(filename, delimiter=';', comment='*', header=0, skiprows = 1, usecols = ['LANE\LINK\NO', 'LANE\INDEX', '$VEHICLE:SIMSEC', 'NO', 'POS'], low_memory = lowMemory) 899 data = read_csv(filename, delimiter=';', comment='*', header=0, skiprows = 1, usecols = ['LANE\LINK\NO', 'LANE\INDEX', '$VEHICLE:SIMSEC', 'NO', 'POS'], low_memory = lowMemory)
895 data = selectPDLanes(data, lanes) 900 data = selectPDLanes(data, lanes)
896 data = data.convert_objects(convert_numeric=True) 901 data = data.convert_objects(convert_numeric=True)
897 902
898 merged = merge(data, data, how='inner', left_on=['LANE\LINK\NO', 'LANE\INDEX', '$VEHICLE:SIMSEC'], right_on=['LANE\LINK\NO', 'LANE\INDEX', '$VEHICLE:SIMSEC'], sort = False) 903 merged = merge(data, data, how='inner', left_on=['LANE\LINK\NO', 'LANE\INDEX', '$VEHICLE:SIMSEC'], right_on=['LANE\LINK\NO', 'LANE\INDEX', '$VEHICLE:SIMSEC'], sort = False)
905 if len(diff) >= 2 and npmin(diff) < 0 and npmax(diff) > 0: 910 if len(diff) >= 2 and npmin(diff) < 0 and npmax(diff) > 0:
906 xidx = diff[diff < 0].argmax() 911 xidx = diff[diff < 0].argmax()
907 yidx = diff[diff > 0].argmin() 912 yidx = diff[diff > 0].argmin()
908 if abs(group.loc[xidx, '$VEHICLE:SIMSEC'] - group.loc[yidx, '$VEHICLE:SIMSEC']) <= collisionTimeDifference: 913 if abs(group.loc[xidx, '$VEHICLE:SIMSEC'] - group.loc[yidx, '$VEHICLE:SIMSEC']) <= collisionTimeDifference:
909 nCollisions += 1 914 nCollisions += 1
915
916 # select TD1.link_id, TD1.lane_id from temp.diff_positions as TD1, temp.diff_positions as TD2 where TD1.link_id = TD2.link_id and TD1.lane_id = TD2.lane_id and TD1.id1 = TD2.id1 and TD1.id2 = TD2.id2 and TD1.t = TD2.t+0.1 and TD1.diff*TD2.diff < 0; # besoin de faire un group by??
917 # create temp table diff_positions as select CP1.t as t, CP1.link_id as link_id, CP1.lane_id as lane_id, CP1.trajectory_id as id1, CP2.trajectory_id as id2, CP1.s_coordinate - CP2.s_coordinate as diff from curvilinear_positions CP1, curvilinear_positions CP2 where CP1.link_id = CP2.link_id and CP1.lane_id = CP2.lane_id and CP1.t = CP2.t and CP1.trajectory_id > CP2.trajectory_id;
918 # SQL select link_id, lane_id, id1, id2, min(diff), max(diff) from (select CP1.t as t, CP1.link_id as link_id, CP1.lane_id as lane_id, CP1.trajectory_id as id1, CP2.trajectory_id as id2, CP1.s_coordinate - CP2.s_coordinate as diff from curvilinear_positions CP1, curvilinear_positions CP2 where CP1.link_id = CP2.link_id and CP1.lane_id = CP2.lane_id and CP1.t = CP2.t and CP1.trajectory_id > CP2.trajectory_id) group by link_id, lane_id, id1, id2 having min(diff)*max(diff) < 0
910 return nCollisions 919 return nCollisions
911 920
912 def loadTrajectoriesFromNgsimFile(filename, nObjects = -1, sequenceNum = -1): 921 def loadTrajectoriesFromNgsimFile(filename, nObjects = -1, sequenceNum = -1):
913 '''Reads data from the trajectory data provided by NGSIM project 922 '''Reads data from the trajectory data provided by NGSIM project
914 and returns the list of Feature objects''' 923 and returns the list of Feature objects'''