Source code for vtra.preprocess.cvts_speeds

import geopandas as gpd
import pandas as pd
import os
import numpy as np
import sys
import itertools
import ast
import math
from scipy import stats


[docs]def main(): ''' Traffic speed assignment script vehicle_id, edge_path, time_stamp ''' data_path,calc_path,output_path = load_config()['paths']['data'],load_config()['paths']['calc'],load_config()['paths']['output'] edges_in = os.path.join(output_path, 'transport cvts analysis', 'results', 'traffic_count','road_network.shp') routes_in = os.path.join(output_path, 'transport cvts analysis', 'results', 'routes_collected','routes.csv') edges = gpd.read_file(edges_in) edges.columns = map(str.lower, edges.columns) # get the right linelength edges['length'] = edges.geometry.apply(line_length) length_attr = list(zip(edges['g_id'].values.tolist(),edges['length'].values.tolist())) routes_df = pd.read_csv(routes_in) edge_speeds = [] for iter_,vals in routes_df.iterrows(): edge_path = ast.literal_eval(vals['edge_path']) time_stamp = ast.literal_eval(vals['time_stamp']) if len(edge_path) > 1: for e in range(len(edge_path)-1): time_diff = 1.0*(time_stamp[e+1] - time_stamp[e]) if time_diff > 0: distance = sum([l[1] for l in length_attr if l[0] in (edge_path[e],edge_path[e+1])]) edge_l = [l[1] for l in length_attr if l[0] == edge_path[e]] + [l[1] for l in length_attr if l[0] == edge_path[e+1]] speed = 3600.0*distance/time_diff if speed >= 20 and speed <= 120: edge_speeds.append((edge_path[e],speed)) edge_speeds.append((edge_path[e+1],speed)) print ('Done with iteration',iter_) del routes_df edge_speeds_df = pd.DataFrame(edge_speeds,columns = ['g_id','speed']) edge_speeds_df_min = edge_speeds_df.groupby(['g_id'])['speed'].min().reset_index() edge_speeds_df_min.rename(columns={'speed': 'min_speed'}, inplace=True) edges = pd.merge(edges,edge_speeds_df_min,how='left', on=['g_id']).fillna(0) del edge_speeds_df_min edge_speeds_df_max = edge_speeds_df.groupby(['g_id'])['speed'].max().reset_index() edge_speeds_df_max.rename(columns={'speed': 'max_speed'}, inplace=True) edges = pd.merge(edges,edge_speeds_df_max,how='left', on=['g_id']).fillna(0) del edge_speeds_df_max edge_speeds_df_median = edge_speeds_df.groupby(['g_id'])['speed'].median().reset_index() edge_speeds_df_median.rename(columns={'speed': 'md_speed'}, inplace=True) edges = pd.merge(edges,edge_speeds_df_median,how='left', on=['g_id']).fillna(0) del edge_speeds_df_median edge_speeds_df_mean = edge_speeds_df.groupby(['g_id'])['speed'].mean().reset_index() edge_speeds_df_mean.rename(columns={'speed': 'mean_speed'}, inplace=True) edges = pd.merge(edges,edge_speeds_df_mean,how='left', on=['g_id']).fillna(0) del edge_speeds_df_mean edge_speeds_df_std = edge_speeds_df.groupby(['g_id'])['speed'].std().reset_index() edge_speeds_df_std.rename(columns={'speed': 'std_speed'}, inplace=True) edges = pd.merge(edges,edge_speeds_df_std,how='left', on=['g_id']).fillna(0) del edge_speeds_df_std del edge_speeds_df edges.loc[edges['est_speed'] > 120.0,'est_speed'] = 120.0 edges.to_file(edges_in)
if __name__ == '__main__': main()