Mercurial > hg > nsaunier > traffic-intelligence
comparison python/storage.py @ 642:932f96c89212
added pandas to read vissim fzp (more robust with respect to column names
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Fri, 10 Apr 2015 14:54:05 +0200 |
| parents | 3058e00887bc |
| children | bfaa6b95dae2 |
comparison
equal
deleted
inserted
replaced
| 641:9fe254f11743 | 642:932f96c89212 |
|---|---|
| 650 if self.sechead: | 650 if self.sechead: |
| 651 try: return self.sechead | 651 try: return self.sechead |
| 652 finally: self.sechead = None | 652 finally: self.sechead = None |
| 653 else: return self.fp.readline() | 653 else: return self.fp.readline() |
| 654 | 654 |
| 655 def loadTrajectoriesFromVissimFile(filename, simulationStepsPerTimeUnit, nObjects = -1, warmUpLastInstant = None, usePandas = False): | 655 def loadTrajectoriesFromVissimFile(filename, simulationStepsPerTimeUnit, nObjects = -1, warmUpLastInstant = None, usePandas = False, nDecimals = 2): |
| 656 '''Reads data from VISSIM .fzp trajectory file | 656 '''Reads data from VISSIM .fzp trajectory file |
| 657 simulationStepsPerTimeUnit is the number of simulation steps per unit of time used by VISSIM | 657 simulationStepsPerTimeUnit is the number of simulation steps per unit of time used by VISSIM |
| 658 for example, there seems to be 5 simulation steps per simulated second in VISSIM, | 658 for example, there seems to be 5 simulation steps per simulated second in VISSIM, |
| 659 so simulationStepsPerTimeUnit should be 5, | 659 so simulationStepsPerTimeUnit should be 5, |
| 660 so that all times correspond to the number of the simulation step (and can be stored as integers) | 660 so that all times correspond to the number of the simulation step (and can be stored as integers) |
| 663 objects = {} # dictionary of objects index by their id | 663 objects = {} # dictionary of objects index by their id |
| 664 firstInstants = {} | 664 firstInstants = {} |
| 665 | 665 |
| 666 if usePandas: | 666 if usePandas: |
| 667 from pandas import read_csv | 667 from pandas import read_csv |
| 668 from numpy import min, max, round | |
| 668 data = read_csv(filename, delimiter=';', skiprows=16) | 669 data = read_csv(filename, delimiter=';', skiprows=16) |
| 669 print('Work in progress') | 670 data['LANE'] = data['LANE\LINK\NO'].astype(str)+'_'+data['LANE\INDEX'].astype(str) |
| 670 return [] | 671 data['TIME'] = data['$VEHICLE:SIMSEC']*simulationStepsPerTimeUnit |
| 672 grouped = data.loc[:,['NO','TIME']].groupby(['NO'], as_index = False) | |
| 673 instants = grouped['TIME'].agg({'first': min, 'last': max}) | |
| 674 if warmUpLastInstant is not None: | |
| 675 instants = instants[instants['first'] >= warmUpLastInstant] | |
| 676 for row_index, row in instants.iterrows(): | |
| 677 objNum = int(row['NO']) | |
| 678 tmp = data[data['NO'] == objNum] | |
| 679 objects[objNum] = moving.MovingObject(num = objNum, timeInterval = moving.TimeInterval(row['first'], row['last'])) | |
| 680 # positions should be rounded to nDecimals decimals only | |
| 681 objects[objNum].curvilinearPositions = moving.CurvilinearTrajectory(S = round(tmp['POS'].tolist(), nDecimals), Y = round(tmp['POSLAT'].tolist(), nDecimals), lanes = tmp['LANE'].tolist()) | |
| 682 return objects.values() | |
| 671 else: | 683 else: |
| 672 inputfile = openCheck(filename, quitting = True) | 684 inputfile = openCheck(filename, quitting = True) |
| 673 | |
| 674 # data = pd.read_csv(filename, skiprows=15, delimiter=';') | 685 # data = pd.read_csv(filename, skiprows=15, delimiter=';') |
| 675 # skip header: 15 lines + 1 | 686 # skip header: 15 lines + 1 |
| 676 line = readline(inputfile, '*$') | 687 line = readline(inputfile, '*$') |
| 677 while len(line) > 0:#for line in inputfile: | 688 while len(line) > 0:#for line in inputfile: |
| 678 data = line.strip().split(';') | 689 data = line.strip().split(';') |
