├── flow-label.py ├── .gitignore ├── README.md ├── flow-calculation.py ├── Para-extraction.py ├── XGBoost-prediction.py ├── lane-changing-prediction(match).py ├── car-follow-prediction(match).py ├── trajectory_prediction.py ├── lane-change-trajectory-prediction-match.py └── The format of samples.csv /flow-label.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | from sklearn.cluster import KMeans 3 | import numpy as np 4 | import matplotlib.pyplot as plt 5 | from sklearn.metrics import silhouette_score 6 | import os 7 | 8 | path1 = r'E:\PythonProjects1\Lane change prediciton\lane-change-prediction-NGSIM' 9 | 10 | data1 = pd.read_csv(os.path.join(path1, 'car-following-QKV(original).csv'), parse_dates=True, encoding='utf-8') 11 | data2 = pd.read_csv(os.path.join(path1, 'lane-change-QKV.csv'), parse_dates=True, encoding='utf-8') 12 | 13 | data = data1 14 | 15 | 16 | k = data[['K(veh/km/ln)']].values 17 | v = data[['V(km/h)']].values 18 | q = data[['Q(veh/h/ln)']].values 19 | 20 | # kmeans clustering traffic flow level 21 | x = np.concatenate([k, v], axis=1) 22 | kmeans = KMeans(n_clusters=4, random_state=0) 23 | y_pred = kmeans.fit_predict(k) # 根据什么参数来label 24 | sil_coeff = silhouette_score(k, y_pred, metric='euclidean') 25 | center = kmeans.cluster_centers_ 26 | kc_list = sorted([i for i in center[:, 0]]) 27 | print(kc_list) 28 | 29 | def my(_x): 30 | if _x == kc_list[0]: 31 | return "A" 32 | elif _x == kc_list[1]: 33 | return "B" 34 | elif _x == kc_list[2]: 35 | return "C" 36 | elif _x == kc_list[3]: 37 | return "D" 38 | 39 | 40 | rrr = pd.DataFrame([my(x) for x in center[y_pred]]) 41 | data['Traffic'] = rrr.values 42 | 43 | # data.to_csv(os.path.join(path1, 'lane_change_QKV.csv'), index=False, sep=',') 44 | 45 | x = data[['K(veh/km/ln)', 'V(km/h)']] 46 | x1 = data[data[['Traffic']].values == 'A'] 47 | v1 = np.mean(x1[['V(km/h)']].values) 48 | 49 | 50 | 51 | 52 | 53 | 54 | # x1 = x[(data['Traffic'] == 'low traffic')] 55 | # x2 = x[(data['Traffic'] == 'high traffic')] 56 | # 57 | # s1 = plt.scatter(x1[:, 0], x1[:, 1], color='#0000FF') # 分别画出低交通流和高交通流的图片 58 | # s2 = plt.scatter(x2[:, 0], x2[:, 1], color='#FF8C00') 59 | # 60 | # plt.rcParams["font.family"] = "serif" 61 | # plt.xticks(fontsize=14) 62 | # plt.yticks(fontsize=14) 63 | # # plt.ylim(2, 160) 64 | # plt.xlabel('交通流密度 (veh/km)', fontsize=16, fontproperties='SimHei') 65 | # plt.ylabel('交通流平均速度 (km/h)', fontsize=16, fontproperties='SimHei') 66 | # # plt.legend(loc='upper right', frameon=False, labels=['Low traffic flow', 'High traffic flow'], prop={'size': 16}) # 显示标签 67 | # plt.legend((s1, s2), ('低交通流', '高交通流'), loc='upper right', prop={'size': 16, 'family': 'SimHei'}) # 显示标签 68 | # plt.tight_layout() 69 | # plt.show() 70 | 71 | 72 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # lane-change-prediction 2 | This is a project to predict the lane change intention and trajectory incorporating traffic context information 3 | In this study, a lane change prediction model is proposed. Predicting lane change maneuvers is critical for autonomous vehicles and traffic management as lane change may cause conflict in traffic flow. This study aims to establish an integrated lane change prediction model incorporating traffic context using machine learning algorithms. In addition, lane change decisions and lane change trajectories are both predicted to capture the whole process. The framework of the proposed model contains two parts: the traffic context classification model, which is used to predict traffic level and vehicle type, and the integrated lane change prediction model, which is used to predict lane change decision with XGBoost and lane change trajectories with LSTM incorporating context information. Instead of considering lane change, we establish trajectory prediction models for left lane change and right lane change, further improving the prediction accuracy. 4 | 5 | We can open the codes of traffic flow label, as well as the feature extraction. The xgboost-based prediction code and lstm-based trajectory prediction codes are all presented. 6 | 7 | Requirements 8 | 9 | scipy>=0.19.0 10 | numpy>=1.12.1 11 | pandas>=0.19.2 12 | sklearn 13 | statsmodels 14 | tensorflow>=1.3.0 15 | 16 | The specific process of data preparation, traffic flow label, feature-extraction and prediction-model-building are carefully descripted in following steps: 17 | 18 | 1. Data Preparation 19 | Researchers can apply for the highD dataset from the https://www.highd-dataset.com/. We preprocess the dataset to extract lane-keeping and lane-changeing samples (each sample is 10 s). The trajectory of samples includes the x-position, y-position, speed, acceleration, the gap and relative speed between subject vehicle and surrounding vehicles. 20 | 21 | 2. Traffic flow label 22 | The traffic flow is clustered into different levels according to the traffic density and traffic velocity in the paper. The density, velocity, and flow are calculated for each sample vehicle. Then the k-means method is applied to group the traffic into several levels. 23 | 24 | 3. Feature-extraction 25 | The time-domain and frequency-domain features are both extracted from the trajectories as the inputs of the prediction model. 26 | 27 | 4. Lane change intention prediction 28 | The xgboost algorithm is applied to predict the intention incorporating context information. The parameters of xgboost is tuned with grid-search method to obtain the optimal ones. 29 | 30 | 5. Lane change trajectory prediction 31 | The LSTM algorithm is applied to predict the lane change trajectory incorporating context information. 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /flow-calculation.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pandas as pd 3 | import numpy as np 4 | from tqdm import tqdm 5 | from time import time 6 | import scipy.io as sio 7 | # ##每个数据包依次计算 8 | 9 | start = time() 10 | 11 | save_path = r'C:\Users\Lenovo\Desktop\新建文件夹 (2)' 12 | pfile = str('C:/Users/Lenovo/Desktop/新建文件夹 (2)/') + str('data04-2.mat') 13 | 14 | # 通过标签索引,提取数据 15 | data = pd.DataFrame(sio.loadmat(pfile)['data']) 16 | lk = pd.DataFrame(sio.loadmat(pfile)['lk']) 17 | lc = pd.DataFrame(sio.loadmat(pfile)['lc']) 18 | trajectories_last = pd.DataFrame(sio.loadmat(pfile)['trajectories_last']) 19 | xdata = pd.DataFrame(sio.loadmat(pfile)['xdata']) # 跟驰样本 20 | ydata = pd.DataFrame(sio.loadmat(pfile)['ydata']) 21 | 22 | data.columns = ['id', 'frame', 'localx', 'localy', 'length', 'width', 'speedx', 'speedy', 23 | 'accx', 'accy', 'class', 'lane', 'precedingid', 'speedr', 'gap', 'yaw', 24 | 'maneuver'] 25 | trajectories_last.columns = ['id', 'maneuver', 'startline', 'endline', 'startframe', 'endframe', 26 | 'num', 'lanechangeframe', 'class'] 27 | xdata.columns = data.columns 28 | ydata.columns = data.columns 29 | lk.columns = trajectories_last.columns 30 | lc.columns = trajectories_last.columns 31 | 32 | # 计算 33 | sample = lc # 分别计算跟驰样本和换道样本 34 | v_list = [] 35 | K_list = [] 36 | Q_list = [] 37 | for i in tqdm(range(len(sample))): 38 | sample_id = sample.at[i, 'id'] 39 | sample_start = sample.at[i, 'startframe'] 40 | sample_end = sample.at[i, 'endframe'] 41 | 42 | 43 | # ##计算车流量 44 | a1 = np.where((data['frame'] >= sample_start) & (data['frame'] <= sample_end)) # 找到时间范围内在车道上的车id 45 | idata = data.iloc[a1[0], :] 46 | idx1 = idata['id'].unique() 47 | y = 0 48 | for k in range(len(idx1)): 49 | iidata = (idata[idata['id'] == idx1[k]]).reset_index(drop=True) 50 | x1 = (iidata['localy']).values[0] 51 | x2 = (iidata['localy']).values[-1] 52 | x = (x1 - 400) * (x2 - 400) # 判断时间范围内该id有没有经过中心线,如果经过,流量+1 53 | if x < 0: 54 | y = y + 1 55 | 56 | y1 = round(y / 7, 3) # 时间范围内相同方向内平均每个车道的交通流量 57 | y2 = round((y * 3600) / ((sample_end - sample_start) * 0.1), 3) # 通过除以时间,得到以单位为h的交通流量 58 | y3 = round(y2 / 7, 3) # 单个车道内的流量 59 | z = np.array([y, y1, y2, y3]) 60 | Q_list.append(z) 61 | 62 | 63 | # ## 计算车密度和平均速度 64 | data_d = data # 与样本车行方向相同的所有id 65 | frame_v_mean_list = [] 66 | frame_K_list = [] 67 | for j in range(sample_start, sample_end + 1): # 遍历各个frame 68 | data_frame_j = (data_d[data_d['frame'] == j]).reset_index(drop=True) 69 | j_v_mean = np.mean(data_frame_j['speedy']) # 在此frame下的所有车速的均值 70 | j_K = len(data_frame_j) # 在此frame下的密度K 71 | frame_v_mean_list.append(j_v_mean) 72 | frame_K_list.append(j_K) 73 | sample_v = round(np.mean(frame_v_mean_list), 3) # 此样本对应的平均车速 74 | sample_K = round(np.mean(frame_K_list), 3) # 此样本对应的平均密度 75 | v_list.append(sample_v) 76 | K_list.append(sample_K) 77 | 78 | 79 | id_num = pd.DataFrame(Q_list) 80 | id_num.columns = ['id_num', 'Q(veh/lane)', 'Q(veh/h)', 'Q(veh/h/ln)'] 81 | v_df = pd.DataFrame({'v(m/s)': v_list}) 82 | v_df['V(km/h)'] = round(v_df['v(m/s)'] * 3.6, 3) # 所有车辆的平均速度 83 | K_df = pd.DataFrame({'K(veh/800m)': K_list}) 84 | K_df['K(veh/km)'] = round(K_df['K(veh/800m)'] / 0.8, 3) 85 | K_df['K(veh / km / ln)'] = K_df[['K(veh/km)']]/7 # 单个车道的车流量密度 86 | 87 | df = pd.concat([id_num, v_df, K_df], axis=1, sort=False) 88 | m = pd.concat([lc, df], axis=1) 89 | m.to_csv(os.path.join(save_path, 'lane-change-QVK.csv')) 90 | 91 | 92 | -------------------------------------------------------------------------------- /Para-extraction.py: -------------------------------------------------------------------------------- 1 | 2 | import math 3 | import os 4 | import numpy as np 5 | import pandas as pd 6 | import pywt 7 | from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score 8 | 9 | 10 | def ev(_x, _y): 11 | RMSE = math.sqrt(mean_squared_error(_x, _y)) 12 | MAE = mean_absolute_error(_x, _y) 13 | # MAPE = np.mean(np.abs((_x - _y) / _x)) 14 | R2 = r2_score(_x, _y) 15 | Re = np.array([RMSE, MAE, R2]) 16 | return Re 17 | 18 | 19 | def statis(_x): 20 | _x1 = np.mean(_x) 21 | _x2 = np.std(_x) 22 | _x3 = np.max(_x) 23 | _x4 = np.min(_x) 24 | _x7 = np.percentile(_x, 95) 25 | _xx = pd.DataFrame([[_x1, _x2, _x3, _x4, _x7]]) 26 | return _xx 27 | 28 | 29 | # 换道前的数据 30 | path1 = r'E:\PythonProjects1\Lane change prediciton\lane-change-prediction-NGSIM' 31 | data1 = pd.read_csv(os.path.join(path1, 'car-following-prediction(surround).csv'), parse_dates=True, encoding='gbk') 32 | data2 = pd.read_csv(os.path.join(path1, 'lane-change-prediction(surround).csv'), parse_dates=True, encoding='gbk') 33 | lk = pd.read_csv(os.path.join(path1, 'car-following-QKV(selection).csv'), parse_dates=True, encoding='gbk') 34 | lc = pd.read_csv(os.path.join(path1, 'lane-change-QKV.csv'), parse_dates=True, encoding='gbk') 35 | 36 | 37 | # 提取跟驰参数 38 | m1 = pd.DataFrame() 39 | 40 | data = data1 41 | xx = lk 42 | for i in range(np.size(xx, 0)): 43 | # for i in range(5): 44 | print(i) 45 | xdata = data[(data[['id']].values == xx.at[i, 'id']) & (data[['frame']].values >= xx.at[i, 'startframe']) 46 | & (data[['frame']].values <= xx.at[i, 'endframe']-5)] 47 | xdata = xdata.reset_index() 48 | xxdata = xdata[['speedx', 'speedy', 'accx', 'accy', 'yaw', 'speedr', 'gap']] 49 | 50 | xxdata['x1'] = pd.DataFrame(xdata[['localy-left-pre']].values - xdata[['localy']].values) 51 | xxdata['r1'] = pd.DataFrame(xdata[['speedy-left-pre']].values - xdata[['speedy']].values) 52 | xxdata['x2'] = pd.DataFrame(xdata[['localy']].values - xdata[['localy-left-foll']].values) 53 | xxdata['r2'] = pd.DataFrame(xdata[['speedy']].values - xdata[['speedy-left-foll']].values) 54 | xxdata['x3'] = pd.DataFrame(xdata[['localy-right-pre']].values - xdata[['localy']].values) 55 | xxdata['r3'] = pd.DataFrame(xdata[['speedy-right-pre']].values - xdata[['speedy']].values) 56 | xxdata['x4'] = pd.DataFrame(xdata[['localy']].values - xdata[['localy-right-foll']].values) 57 | xxdata['r4'] = pd.DataFrame(xdata[['speedy']].values - xdata[['speedy-right-foll']].values) 58 | 59 | # 找到id不存在的情况设置为0 60 | a1 = np.where(xdata[['id-left-pre']].values == 0) 61 | a2 = np.where(xdata[['id-left-foll']].values == 0) 62 | a3 = np.where(xdata[['id-right-pre']].values == 0) 63 | a4 = np.where(xdata[['id-right-foll']].values == 0) 64 | 65 | xxdata.loc[a1[0], 'x1'] = 0 66 | xxdata.loc[a1[0], 'r1'] = 0 67 | xxdata.loc[a2[0], 'x2'] = 0 68 | xxdata.loc[a2[0], 'r2'] = 0 69 | xxdata.loc[a3[0], 'x3'] = 0 70 | xxdata.loc[a3[0], 'r3'] = 0 71 | xxdata.loc[a4[0], 'x4'] = 0 72 | xxdata.loc[a4[0], 'r4'] = 0 73 | 74 | xx1 = pd.DataFrame() 75 | names = ['speedx', 'speedy', 'accx', 'accy', 'yaw', 'speedr', 'gap', 'x1', 'r1', 'x2', 'r2', 'x3', 'r3', 'x4', 'r4'] 76 | 77 | for name in names: 78 | xxxdata = xxdata[name] 79 | x1 = statis(xxxdata) 80 | x1.columns = [name, name, name, name, name] 81 | xx1 = pd.concat([xx1, x1], axis=1) 82 | 83 | m1 = pd.concat([m1, xx1], axis=0) 84 | 85 | m1 = m1.reset_index(drop=True) 86 | mdata = xx[['class', 'Traffic', 'maneuver']] # 87 | m1 = pd.concat([m1, mdata], axis=1) 88 | 89 | m1.to_csv(os.path.join(path1, 'car-following-intention-st.csv'), index=False, sep=',') 90 | -------------------------------------------------------------------------------- /XGBoost-prediction.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | import warnings 4 | 5 | import matplotlib.pyplot as plt 6 | import pandas as pd 7 | import xgboost 8 | from sklearn import neural_network, svm, ensemble 9 | from imblearn.over_sampling import SMOTEN 10 | from imblearn.pipeline import make_pipeline 11 | from sklearn.metrics import precision_score, accuracy_score, roc_auc_score, recall_score, f1_score, \ 12 | classification_report, mean_squared_error 13 | from sklearn.model_selection import train_test_split, RandomizedSearchCV 14 | from sklearn.preprocessing import normalize 15 | 16 | warnings.filterwarnings("ignore") 17 | 18 | 19 | def _xgboost(): 20 | model = xgboost.XGBClassifier(eval_metric='mlogloss') 21 | random_grid = { 22 | 'xgbclassifier__n_estimators': [50, 100, 200, 300, 500], 23 | 'xgbclassifier__learning_rate': [0.01, 0.1, 0.2, 0.3], 24 | 'xgbclassifier__max_depth': [3, 6, 9], 25 | 'xgbclassifier__min_child_weight': [0, 2, 5, 10, 20], 26 | 'xgbclassifier__subsample': [0.6, 0.7, 0.8, 0.9], 27 | 'xgbclassifier__colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9], 28 | 'xgbclassifier__reg_alpha': [0, 0.25, 0.5, 0.75, 1], 29 | 'xgbclassifier__reg_lambda': [0, 0.2, 0.4, 0.6, 0.8, 1] 30 | } 31 | return model, random_grid 32 | 33 | def adaboost(): 34 | model = ensemble.AdaBoostClassifier() 35 | params = { 36 | # 'adaboostclassifier__num_leaves': (10, 50), 37 | # 'adaboostclassifier__min_data_in_leaf': (10, 50), 38 | 'adaboostclassifier__max_depth': (5, 20), 39 | 'adaboostclassifier__learning_rate': (0.001, 0.1), 40 | 'adaboostclassifier__bagging_fraction': (0.5, 1), 41 | 'adaboostclassifier__feature_fraction': (0.5, 1), 42 | 'adaboostclassifier__lambda_l1': (0, 10), 43 | 'adaboostclassifier__lambda_l2': (0, 10), 44 | # 'adaboostclassifier__min_gain_to_split': (0.001, 0.1), 45 | # 'adaboostclassifier__min_child_weight': (0.001, 100) 46 | } 47 | return model, params 48 | 49 | 50 | def SVM(): 51 | model = svm.SVC(probability=True) 52 | random_grid = { 53 | 'svc__kernel': ['rbf'], 54 | 'svc__gamma': [1e-3, 1e-4], 55 | 'svc__C': [1, 10, 100, 1000], 56 | } 57 | return model, random_grid 58 | 59 | 60 | def run_model(_model, _X_test, _y_test): 61 | t0 = time.time() 62 | _y_pred = _model.predict(_X_test) 63 | _y_pred_prob = _model.predict_proba(_X_test) 64 | _y_pred_prob = _y_pred_prob[:, 1] 65 | time_taken = time.time() - t0 66 | print("Time taken = {}".format(time_taken)) 67 | return _model, _y_pred, _y_pred_prob 68 | 69 | 70 | def evaluation_model(_model, _X_test, _y_test, _y_pred, _y_pred_prob): 71 | accuracy = accuracy_score(_y_test, _y_pred) 72 | precision = precision_score(_y_test, _y_pred, average=None) 73 | recall = recall_score(_y_test, _y_pred, average=None) 74 | f1 = f1_score(_y_test, _y_pred, average='weighted') 75 | mse = mean_squared_error(y_test, y_pred) 76 | 77 | plt.rcParams["font.family"] = "Times New Roman" 78 | print("Accuracy = {}".format(accuracy)) 79 | print("Precision = {}".format(precision)) 80 | print("Recall = {}".format(recall)) 81 | print("F1_score = {}".format(f1)) 82 | print("mse = {}".format(mse)) 83 | print(classification_report(_y_test, _y_pred, digits=5)) 84 | 85 | return accuracy 86 | 87 | 88 | ## 输入变量 89 | path1 = r'E:\PythonProjects1\Lane change prediciton\lane-change-prediction-NGSIM' 90 | data1 = pd.read_csv(os.path.join(path1, 'car-following-intention-st.csv'), parse_dates=True, encoding='gbk') 91 | data2 = pd.read_csv(os.path.join(path1, 'lane-change-intention-st.csv'), parse_dates=True, encoding='gbk') 92 | data = pd.concat([data1, data2], axis=0) 93 | 94 | 95 | data.loc[data['Traffic'] == 'A', 'Traffic'] = 0 96 | data.loc[data['Traffic'] == 'B', 'Traffic'] = 1 97 | data.loc[data['Traffic'] == 'C', 'Traffic'] = 2 98 | data.loc[data['Traffic'] == 'D', 'Traffic'] = 3 99 | data.loc[data['Traffic'] == 'E', 'Traffic'] = 4 100 | 101 | 102 | dx = data.drop(['maneuver', 'class', 'Traffic'], axis=1).values 103 | # dx = data.drop(['maneuver'], axis=1).values 104 | dy = data['Traffic'] 105 | 106 | 107 | 108 | # 提取输入变量,不加入情景因素 109 | xdata = normalize(dx, axis=0, norm='max') 110 | 111 | X_train, X_test, y_train, y_test = train_test_split(xdata, dy.astype(int), test_size=0.2, random_state=1) 112 | 113 | 114 | # model, random_grid = _xgboost() 115 | # model, random_grid = adaboost() 116 | # model, random_grid = svm() 117 | 118 | 119 | # #调整参数,建立pipline,防止数据泄露产生的模型偏移 120 | # sm = SMOTEN(random_state=0) # ##无法用数字表达的特征就是分类特征,其他事数值特征 121 | # pipline = make_pipeline(sm, model) 122 | # imodel = RandomizedSearchCV(estimator=pipline, param_distributions=random_grid, n_iter=10, cv=5, verbose=2, 123 | # random_state=42, n_jobs=-1) 124 | 125 | 126 | # imodel = xgboost.XGBClassifier(eval_metric='mlogloss') 127 | # imodel = ensemble.AdaBoostClassifier() 128 | imodel = svm.SVC(probability=True, kernel='linear') 129 | 130 | imodel.fit(X_train, y_train) 131 | imodel, y_pred, y_pred_prob = run_model(imodel, X_test, y_test) 132 | accuracy_ml = evaluation_model(imodel, X_test, y_test, y_pred, y_pred_prob) 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /lane-changing-prediction(match).py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | import pandas as pd 4 | import numpy as np 5 | from time import time 6 | import scipy.io as sio 7 | 8 | 9 | # ## 数据初始化 10 | save_path = r'E:\PythonProjects1\Lane change prediciton\lane-change-prediction-NGSIM' 11 | pfile = str('E:/PythonProjects1/Lane change prediciton/lane-change-prediction-NGSIM/') + str('data04-2.mat') 12 | 13 | 14 | # 通过标签索引,提取数据 15 | data = pd.DataFrame(sio.loadmat(pfile)['data']) 16 | lc = pd.DataFrame(sio.loadmat(pfile)['lc']) 17 | ydata = pd.DataFrame(sio.loadmat(pfile)['ydata']) # 换道样本 18 | 19 | data.columns = ['id', 'frame', 'localx', 'localy', 'length', 'width', 'speedx', 'speedy', 20 | 'accx', 'accy', 'class', 'lane', 'precedingid', 'speedr', 'gap', 'yaw', 21 | 'maneuver'] 22 | lc.columns = ['id', 'maneuver', 'startline', 'endline', 'startframe', 'endframe', 23 | 'num', 'lanechangeframe', 'class'] 24 | ydata.columns = data.columns 25 | 26 | xdata = pd.DataFrame() 27 | # 提取换道前5s的数据,用来识别交通流、车辆类型以及intention预测 28 | for i in range(np.size(lc, 0)): 29 | xxdata = ydata[(ydata[['id']].values == lc.at[i, 'id']) & (ydata[['frame']].values >= lc.at[i, 'startframe']) 30 | & (ydata[['frame']].values <= lc.at[i, 'lanechangeframe'])] 31 | xdata = pd.concat([xdata, xxdata], axis=0) 32 | 33 | xdata = xdata.reset_index(drop=True) 34 | 35 | xdata['leftlane'] = xdata['lane'] - 1 36 | xdata['rightlane'] = xdata['lane'] + 1 37 | 38 | 39 | 40 | # ### 数据匹配 41 | leftPreceding = pd.DataFrame() 42 | leftFollowing = pd.DataFrame() 43 | rightPreceding = pd.DataFrame() 44 | rightFollowing = pd.DataFrame() 45 | 46 | 47 | # 换道前的数据 48 | idata = xdata 49 | dff2 = np.zeros((1, 3)) 50 | dff2 = pd.DataFrame(dff2) 51 | dff2.columns = ['id', 'localy', 'speedy'] 52 | 53 | # 跟驰样本 54 | # 左边车道前后车 55 | for j in range(np.size(idata, 0)): 56 | print(j) 57 | 58 | x1 = idata.at[j, 'localy'] + 120 59 | x2 = idata.at[j, 'localy'] - 120 60 | dff1 = data[(data[['lane']].values == idata.at[j, 'leftlane']) & (data[['frame']].values == idata.at[j, 'frame']) 61 | & (data[['localy']].values < x1) & (data[['localy']].values > x2)] 62 | 63 | if np.size(dff1, 0) == 0: 64 | leftPreceding = pd.concat([leftPreceding, dff2], axis=0) 65 | leftFollowing = pd.concat([leftFollowing, dff2], axis=0) 66 | 67 | 68 | else: 69 | distance = dff1[['localy']] - idata.at[j, 'localy'] 70 | distance1 = distance[distance[['localy']].values > 0] 71 | distance2 = distance[distance[['localy']].values < 0] 72 | 73 | if np.size(distance1, 0) != 0: 74 | y1 = np.min(distance1[['localy']].values) 75 | dff3 = dff1.loc[distance['localy'].values == y1, ['id', 'localy', 'speedy']] 76 | else: 77 | dff3 = pd.DataFrame(np.zeros((1, 3))) 78 | dff3.columns = ['id', 'localy', 'speedy'] 79 | 80 | 81 | if np.size(distance2, 0) != 0: 82 | y2 = np.max(distance2[['localy']].values) 83 | dff4 = dff1.loc[distance['localy'].values == y2, ['id', 'localy', 'speedy']] 84 | else: 85 | dff4 = pd.DataFrame(np.zeros((1, 3))) 86 | dff4.columns = ['id', 'localy', 'speedy'] 87 | 88 | 89 | leftPreceding = pd.concat([leftPreceding, dff3], axis=0) 90 | leftFollowing = pd.concat([leftFollowing, dff4], axis=0) 91 | 92 | leftPreceding = leftPreceding.reset_index(drop=True) 93 | leftFollowing = leftFollowing.reset_index(drop=True) 94 | mdata = pd.concat([leftPreceding, leftFollowing], axis=1) 95 | 96 | 97 | 98 | 99 | # 右边车道前后车 100 | for j in range(np.size(idata, 0)): 101 | 102 | x1 = idata.at[j, 'localy'] + 120 103 | x2 = idata.at[j, 'localy'] - 120 104 | dff1 = data[(data[['lane']].values == idata.at[j, 'rightlane']) & (data[['frame']].values == idata.at[j, 'frame']) 105 | & (data[['localy']].values < x1) & (data[['localy']].values > x2)] 106 | 107 | if np.size(dff1, 0) == 0: 108 | rightPreceding = pd.concat([rightPreceding, dff2], axis=0) 109 | rightFollowing = pd.concat([rightFollowing, dff2], axis=0) 110 | 111 | else: 112 | distance = dff1[['localy']] - idata.at[j, 'localy'] 113 | distance1 = distance[distance[['localy']].values > 0] 114 | distance2 = distance[distance[['localy']].values < 0] 115 | 116 | if np.size(distance1, 0) != 0: 117 | y1 = np.min(distance1[['localy']].values) 118 | dff3 = dff1.loc[distance['localy'].values == y1, ['id', 'localy', 'speedy']] 119 | else: 120 | dff3 = pd.DataFrame(np.zeros((1, 3))) 121 | dff3.columns = ['id', 'localy', 'speedy'] 122 | 123 | if np.size(distance2, 0) != 0: 124 | y2 = np.max(distance2[['localy']].values) 125 | dff4 = dff1.loc[distance['localy'].values == y2, ['id', 'localy', 'speedy']] 126 | else: 127 | dff4 = pd.DataFrame(np.zeros((1, 3))) 128 | dff4.columns = ['id', 'localy', 'speedy'] 129 | 130 | rightPreceding = pd.concat([rightPreceding, dff3], axis=0) 131 | rightFollowing = pd.concat([rightFollowing, dff4], axis=0) 132 | 133 | rightPreceding = rightPreceding.reset_index(drop=True) 134 | rightFollowing = rightFollowing.reset_index(drop=True) 135 | mmdata = pd.concat([rightPreceding, rightFollowing], axis=1) 136 | 137 | 138 | ndata = pd.concat([xdata, mdata, mmdata], axis=1) 139 | ndata.to_csv(os.path.join(save_path, 'lane-change-surrounding.csv'), index=False, sep=',') 140 | 141 | -------------------------------------------------------------------------------- /car-follow-prediction(match).py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | import pandas as pd 4 | import numpy as np 5 | from time import time 6 | import scipy.io as sio 7 | 8 | 9 | # ## 数据初始化 10 | save_path = r'E:\PythonProjects1\Lane change prediciton\lane-change-prediction-NGSIM' 11 | pfile = str('E:/PythonProjects1/Lane change prediciton/lane-change-prediction-NGSIM/') + str('data04-2.mat') 12 | 13 | # 通过标签索引,提取数据 14 | data = pd.DataFrame(sio.loadmat(pfile)['data']) 15 | lk = pd.read_csv(os.path.join(save_path, 'car_following_QKV.csv'), parse_dates=True, encoding='gbk') 16 | 17 | 18 | data.columns = ['id', 'frame', 'localx', 'localy', 'length', 'width', 'speedx', 'speedy', 19 | 'accx', 'accy', 'class', 'lane', 'precedingid', 'speedr', 'gap', 'yaw', 20 | 'maneuver'] 21 | 22 | 23 | # 跟驰样本太多,筛选200个出来 24 | x1 = lk[lk['Traffic'] == 'A'] 25 | x2 = lk[lk['Traffic'] == 'B'] 26 | x3 = lk[lk['Traffic'] == 'C'] 27 | x4 = lk[lk['Traffic'] == 'D'] 28 | 29 | x1 = x1.sample(n=100, random_state=1) 30 | x2 = x2.sample(n=100, random_state=1) 31 | x3 = x3.sample(n=100, random_state=1) 32 | x4 = x4.sample(n=100, random_state=1) 33 | 34 | xx = pd.concat([x1, x2, x3, x4], axis=0) 35 | xx = xx.reset_index(drop=True) 36 | xdata = pd.DataFrame() 37 | 38 | # 根据200个记录提取具体的轨迹 39 | for i in range(np.size(xx, 0)): 40 | xxdata = data[(data[['id']].values == xx.at[i, 'id']) & (data[['frame']].values >= xx.at[i, 'startframe']) 41 | & (data[['frame']].values <= xx.at[i, 'endframe'])] 42 | xdata = pd.concat([xdata, xxdata], axis=0) 43 | 44 | xdata = xdata.reset_index(drop=True) 45 | # 确定左右车道的id 46 | xdata['leftlane'] = xdata['lane'] - 1 47 | xdata['rightlane'] = xdata['lane'] + 1 48 | 49 | # ### 数据匹配 50 | leftPreceding = pd.DataFrame() 51 | leftFollowing = pd.DataFrame() 52 | rightPreceding = pd.DataFrame() 53 | rightFollowing = pd.DataFrame() 54 | 55 | 56 | dff2 = np.zeros((1, 3)) 57 | dff2 = pd.DataFrame(dff2) 58 | dff2.columns = ['id', 'localy', 'speedy'] 59 | 60 | 61 | 62 | idata = xdata 63 | # 跟驰样本 64 | # 左边车道前后车 65 | for j in range(np.size(idata, 0)): 66 | print(j) 67 | 68 | x1 = idata.at[j, 'localy'] + 120 69 | x2 = idata.at[j, 'localy'] - 120 70 | dff1 = data[(data[['lane']].values == idata.at[j, 'leftlane']) & (data[['frame']].values == idata.at[j, 'frame']) 71 | & (data[['localy']].values < x1) & (data[['localy']].values > x2)] 72 | 73 | if np.size(dff1, 0) == 0: 74 | leftPreceding = pd.concat([leftPreceding, dff2], axis=0) 75 | leftFollowing = pd.concat([leftFollowing, dff2], axis=0) 76 | 77 | else: 78 | distance = dff1[['localy']] - idata.at[j, 'localy'] 79 | distance1 = distance[distance[['localy']].values > 0] 80 | distance2 = distance[distance[['localy']].values < 0] 81 | 82 | if np.size(distance1, 0) != 0: 83 | y1 = np.min(distance1[['localy']].values) 84 | dff3 = dff1.loc[distance['localy'].values == y1, ['id', 'localy', 'speedy']] 85 | else: 86 | dff3 = pd.DataFrame(np.zeros((1, 3))) 87 | dff3.columns = ['id', 'localy', 'speedy'] 88 | 89 | 90 | if np.size(distance2, 0) != 0: 91 | y2 = np.max(distance2[['localy']].values) 92 | dff4 = dff1.loc[distance['localy'].values == y2, ['id', 'localy', 'speedy']] 93 | else: 94 | dff4 = pd.DataFrame(np.zeros((1, 3))) 95 | dff4.columns = ['id', 'localy', 'speedy'] 96 | 97 | leftPreceding = pd.concat([leftPreceding, dff3], axis=0) 98 | leftFollowing = pd.concat([leftFollowing, dff4], axis=0) 99 | 100 | leftPreceding = leftPreceding.reset_index(drop=True) 101 | leftFollowing = leftFollowing.reset_index(drop=True) 102 | mdata = pd.concat([leftPreceding, leftFollowing], axis=1) 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | # 右边车道前后车 112 | for j in range(np.size(idata, 0)): 113 | print(j) 114 | x1 = idata.at[j, 'localy'] + 120 115 | x2 = idata.at[j, 'localy'] - 120 116 | dff1 = data[(data[['lane']].values == idata.at[j, 'rightlane']) & (data[['frame']].values == idata.at[j, 'frame']) 117 | & (data[['localy']].values < x1) & (data[['localy']].values > x2)] 118 | 119 | if np.size(dff1, 0) == 0: 120 | rightPreceding = pd.concat([rightPreceding, dff2], axis=0) 121 | rightFollowing = pd.concat([rightFollowing, dff2], axis=0) 122 | 123 | else: 124 | distance = dff1[['localy']] - idata.at[j, 'localy'] 125 | distance1 = distance[distance[['localy']].values > 0] 126 | distance2 = distance[distance[['localy']].values < 0] 127 | 128 | if np.size(distance1, 0) != 0: 129 | y1 = np.min(distance1[['localy']].values) 130 | dff3 = dff1.loc[distance['localy'].values == y1, ['id', 'localy', 'speedy']] 131 | else: 132 | dff3 = pd.DataFrame(np.zeros((1, 3))) 133 | dff3.columns = ['id', 'localy', 'speedy'] 134 | 135 | if np.size(distance2, 0) != 0: 136 | y2 = np.max(distance2[['localy']].values) 137 | dff4 = dff1.loc[distance['localy'].values == y2, ['id', 'localy', 'speedy']] 138 | else: 139 | dff4 = pd.DataFrame(np.zeros((1, 3))) 140 | dff4.columns = ['id', 'localy', 'speedy'] 141 | 142 | rightPreceding = pd.concat([rightPreceding, dff3], axis=0) 143 | rightFollowing = pd.concat([rightFollowing, dff4], axis=0) 144 | 145 | rightPreceding = rightPreceding.reset_index(drop=True) 146 | rightFollowing = rightFollowing.reset_index(drop=True) 147 | mmdata = pd.concat([rightPreceding, rightFollowing], axis=1) 148 | 149 | 150 | 151 | # 左右车道数据结合并输出 152 | mmmdata = pd.concat([mdata, mmdata], axis=1) 153 | ndata = pd.concat([xdata, mmmdata], axis=1) 154 | ndata.to_csv(os.path.join(save_path, 'car-following-surrounding.csv'), index=False, sep=',') 155 | xx.to_csv(os.path.join(save_path, 'car-following-QKV2.csv'), index=False, sep=',') 156 | -------------------------------------------------------------------------------- /trajectory_prediction.py: -------------------------------------------------------------------------------- 1 | import time 2 | import os 3 | import matplotlib.pyplot as plt 4 | import numpy as np 5 | import pandas as pd 6 | import pickle 7 | from keras.layers import Dense, Dropout, LSTM 8 | from keras.models import Sequential 9 | from sklearn.metrics import mean_squared_error 10 | from sklearn.preprocessing import MinMaxScaler 11 | 12 | 13 | def create_dataset(_df, look_back=10): 14 | indexs = _df.index.drop_duplicates().tolist() # 找到所有的序号.index找到行号,.drop_duplicates去掉重复 15 | scaler = MinMaxScaler(feature_range=(0, 1)) 16 | 17 | dataset1 = scaler.fit_transform(_df.values[:, :-5]) # 归一化,并设置成原格式 18 | dataset2 = _df.values[:, -5:-2] 19 | dataset3 = scaler.fit_transform(_df.values[:, -2:]) 20 | dataset = np.concatenate((dataset1, dataset2, dataset3), axis=1) 21 | dataset = pd.DataFrame(dataset) 22 | dataset.index = _df.index 23 | dataset.columns = _df.columns 24 | 25 | x, y = [], [] 26 | for index in indexs: 27 | xdata = dataset[dataset.index == index].copy() 28 | data_adj = adjust_input(xdata.copy()) # adjust_inputs为一个定义的函数 29 | data_adj[:, -2:] = scaler.fit_transform(data_adj[:, -2:]) 30 | 31 | for i in range(len(data_adj) - look_back): 32 | a = data_adj[i: (i + look_back), :] 33 | b = data_adj[(i + 1):(i + look_back + 1), -2:] 34 | x.append(a) 35 | y.append(b) 36 | x = pad_sequences(x, look_back) 37 | y = pad_sequences(y, look_back) 38 | return x, y, dataset 39 | 40 | 41 | def adjust_input(part): # 处理原始轨迹数据,将远点设置为[0,0] 42 | part = part.reset_index(drop=True) 43 | part['X'] = (part['X'] - part.at[0, 'X']).values 44 | part['Y'] = (part['Y'] - part.at[0, 'Y']).values 45 | if np.mean(part['maneuver']) == 3: # 将左右换道的方向一致 都设置成正值 46 | part['X'] = part['X'] * (-1) 47 | # part1 = part.drop(columns=['maneuver', 'class', 'Traffic']) # 根据输入变量调整 48 | part1 = part.drop(columns=['class', 'Traffic']) 49 | return np.array(part1) 50 | 51 | 52 | def pad_sequences(sequence, max_length): # 数组长度不足可以填补 53 | batch = len(sequence) 54 | vec = sequence[0].shape[1] 55 | res = np.zeros((batch, max_length, vec)).astype(np.float32) # 由0填充的数组;astype数据类型 56 | for j in range(batch): 57 | length = sequence[j].shape[0] 58 | keep_part = np.array(sequence[j]) 59 | res[j, -length:, :] = keep_part.copy() 60 | return res 61 | 62 | 63 | def predict_model(_model, dataset): # 单点预测并将预测真值处理成数组 64 | predict_y = [] 65 | prediction = _model.predict(dataset) 66 | for j in np.arange(len(prediction)): 67 | predict_y.append(prediction[j, -1, :]) 68 | predict_y = np.array(predict_y) 69 | print('predicted shape:', np.array(predict_y).shape) 70 | return predict_y 71 | 72 | 73 | def predict_result(results): # 预测真值处理成数组 74 | predict_data = [] 75 | for j in np.arange(len(results)): 76 | predict_data.append(results[j, -1, :]) 77 | predict_data = np.array(predict_data) 78 | print('predicted shape:', np.array(predict_data).shape) 79 | return predict_data 80 | 81 | 82 | def plot_results(predicted_data, true_data): 83 | plt.figure(figsize=(8, 7)) 84 | font2 = {'family': 'Times New Roman', 'weight': 'normal', 'size': 25} 85 | font1 = {'family': 'Times New Roman', 'weight': 'normal', 'size': 15} 86 | plt.plot(predicted_data[:, 1], predicted_data[:, 0], label='Prediction Data', linewidth=3) 87 | plt.plot(true_data[:, 1], true_data[:, 0], label='True Data', linewidth=3) 88 | plt.plot([0, true_data[-1:, 1]], [true_data[19, 0], true_data[19, 0]], '0.90', linestyle='--', linewidth=3, 89 | label='Lane separation line') 90 | plt.legend(prop=font1) 91 | plt.xlabel("Longitudinal trajectory of vehicle /m", font2) 92 | plt.ylabel("Lateral trajectory of vehicle /m", font2) 93 | plt.tick_params(labelsize=15) 94 | plt.show() 95 | 96 | 97 | ## 预测换道轨迹 98 | path1 = r'E:\PythonProjects1\Lane change prediciton\lane-change-prediction-NGSIM' 99 | df = pd.read_csv(os.path.join(path1, 'lane-change-prediction(trajectory3).csv'), encoding='gbk', index_col=0, header=0, parse_dates=[0], squeeze=True) 100 | 101 | data = df 102 | train_X, train_Y, number = create_dataset(data) 103 | 104 | model = Sequential() 105 | model.add(LSTM(input_dim=14, output_dim=50, return_sequences=True)) 106 | model.add(LSTM(input_dim=50, output_dim=100, return_sequences=True)) 107 | model.add(LSTM(input_dim=100, output_dim=200, return_sequences=True)) 108 | model.add(Dense(100)) 109 | model.add(Dropout(0.2)) 110 | model.add(Dense(50)) 111 | model.add(Dense(output_dim=2)) 112 | start = time.time() 113 | model.compile(loss='mean_squared_error', optimizer='Adam') # learning rate怎么设置呢??? 114 | model.summary() 115 | model.fit(train_X, train_Y, batch_size=32, nb_epoch=5, validation_split=0.1, verbose=2) 116 | print('compilation time:', time.time() - start) 117 | 118 | 119 | 120 | ids = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 121 | # ids = [10, 12] 122 | for id in ids: 123 | idata = data[data.index == id].copy() 124 | test_X, test_Y, state = create_dataset(idata) 125 | 126 | # # 采用训练的模型来预测数据 127 | predictions = predict_model(model, test_X) 128 | scaler = MinMaxScaler(feature_range=(0, 1)) 129 | idata1 = adjust_input(idata) 130 | idata2 = idata1[:, -2:] 131 | 132 | scaler.fit_transform(idata2) 133 | prediction = scaler.inverse_transform(predictions) 134 | mse1 = mean_squared_error(prediction[:, -1:], idata2[10:, -1:]) # 纵向坐标的预测与真值之间的差值 135 | mse2 = mean_squared_error(prediction[:, :1], idata2[10:, :1]) # 横向坐标的预测与真值之间的差值 136 | mse = mean_squared_error(prediction[:, :], idata2[10:, :]) # 预测整体误差 137 | 138 | error = [mse1, mse2, mse] 139 | print(error) 140 | 141 | # if np.mean(idata[['maneuver']].values) == 3: 142 | # prediction[:, :-1] = prediction[:, :-1] * (-1) 143 | # idata2[:, :-1] = idata2[:, :-1] * (-1) 144 | # plot_results(prediction, idata2) 145 | # else: 146 | # plot_results(prediction, idata2) 147 | 148 | 149 | 150 | # 输出数据 151 | # prediction1=pd.DataFrame(prediction) 152 | # prediction1.to_csv("data1.csv",index=False,sep=',') 153 | 154 | # pickle.dump(model, open("lstm1.dat", "wb")) # 保存模型 155 | # model = pickle.load(open("rf2.pickle.dat", "rb")) # 引用模型 156 | -------------------------------------------------------------------------------- /lane-change-trajectory-prediction-match.py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | import pandas as pd 4 | import numpy as np 5 | from time import time 6 | import scipy.io as sio 7 | 8 | ''' 9 | # ## 数据初始化 10 | path = r'E:\PythonProjects1\Lane change prediciton\lane-change-prediction-NGSIM' 11 | pfile = str('E:/PythonProjects1/Lane change prediciton/lane-change-prediction-NGSIM/') + str('dataset-042.mat') 12 | 13 | 14 | # 提取原始数据,换道样本记录以及换道轨迹 15 | data = pd.DataFrame(sio.loadmat(pfile)['data']) # 所有原始数据 16 | lc = pd.DataFrame(sio.loadmat(pfile)['lc']) # 换道样本记录 17 | ydata = pd.DataFrame(sio.loadmat(pfile)['ydata']) # 换道样本的原始轨迹 18 | data.columns = ['id', 'frame', 'localx', 'localy', 'length', 'width', 'speedx', 'speedy', 19 | 'accx', 'accy', 'class', 'lane', 'precedingid', 'speedr', 'gap', 'yaw', 20 | 'maneuver'] 21 | lc.columns = ['id', 'maneuver', 'startline', 'endline', 'startframe', 'endframe', 22 | 'num', 'lanechangeframe', 'class'] 23 | ydata.columns = data.columns 24 | 25 | 26 | # 提取换道后5s的换道数据 xdata 27 | xdata = pd.DataFrame() 28 | for i in range(np.size(lc, 0)): 29 | xxdata = ydata[(ydata[['id']].values == lc.at[i, 'id']) & (ydata[['frame']].values > lc.at[i, 'lanechangeframe']) 30 | & (ydata[['frame']].values <= lc.at[i, 'endframe'])] 31 | xdata = pd.concat([xdata, xxdata], axis=0) 32 | xdata = xdata.reset_index(drop=True) 33 | 34 | 35 | # 把换道前5s的参数提取出来 ddata 尤其是目标车道 36 | ddata = pd.read_csv(os.path.join(path, 'lane-change-prediction(surround).csv'), parse_dates=True, encoding='gbk') 37 | 38 | Preceding0 = ddata[['precedingid', 'gap', 'speedr']] #换道前的前车 39 | targetpreceding0 = pd.DataFrame() 40 | targetfollowing0 = pd.DataFrame() 41 | 42 | for i in range(np.size(lc, 0)): 43 | mm = ddata[(ddata[['id']].values == lc.at[i, 'id']) & (ddata[['frame']].values >= lc.at[i, 'startframe']) 44 | & (ddata[['frame']].values <= lc.at[i, 'lanechangeframe'])] 45 | 46 | if lc.at[i, 'maneuver'] == 2: # 右换道 47 | xx = mm[['id-right-pre', 'localy-right-pre', 'speedy-right-pre']] 48 | yy = mm[['id-right-foll', 'localy-right-foll', 'speedy-right-foll']] 49 | xx.columns = ['id-target-pre', 'localy-target-pre', 'speedy-target-pre'] 50 | yy.columns = ['id-target-foll', 'localy-target-foll', 'speedy-target-foll'] 51 | else: 52 | xx = mm[['id-left-pre', 'localy-left-pre', 'speedy-left-pre']] 53 | yy = mm[['id-left-foll', 'localy-left-foll', 'speedy-left-foll']] 54 | xx.columns = ['id-target-pre', 'localy-target-pre', 'speedy-target-pre'] 55 | yy.columns = ['id-target-foll', 'localy-target-foll', 'speedy-target-foll'] 56 | 57 | targetpreceding0 = pd.concat([targetpreceding0, xx], axis=0) 58 | targetfollowing0 = pd.concat([targetfollowing0, yy], axis=0) 59 | 60 | 61 | 62 | 63 | # 把换道后的特征提取出来 提取换道后5s的换道数据 xdata 64 | Preceding = pd.DataFrame(np.zeros((np.size(xdata, 0), 3))) # 换道后原车道前车都设置为0 65 | Preceding.columns = ['precedingid', 'gap', 'speedr'] 66 | targetpreceding = xdata[['precedingid']] # 换道后目标车道前车 67 | yy = pd.DataFrame(xdata[['gap']].values + xdata[['localy']].values + xdata[['length']].values) 68 | zz = pd.DataFrame(xdata[['speedr']].values + xdata[['speedy']].values) 69 | targetpreceding = pd.concat([targetpreceding, yy, zz], axis=1) 70 | targetpreceding.columns = ['id-target-pre', 'localy-target-pre', 'speedy-target-pre'] 71 | 72 | a = np.where(targetpreceding[['id-target-pre']].values == 0) 73 | targetpreceding.loc[a[0], 'localy-target-pre'] = 0 74 | targetpreceding.loc[a[0], 'speedy-target-pre'] = 0 75 | 76 | 77 | targetfollowing = pd.DataFrame() 78 | 79 | # 提取换道后5s的换道数据 xdata 80 | idata = xdata 81 | dff2 = np.zeros((1, 3)) 82 | dff2 = pd.DataFrame(dff2) 83 | dff2.columns = ['id', 'localy', 'speedy'] 84 | 85 | # 换道样本后5s 后车 86 | for j in range(np.size(idata, 0)): 87 | print(j) 88 | 89 | dff1 = data[(data[['lane']].values == idata.at[j, 'lane']) & (data[['frame']].values == idata.at[j, 'frame']) 90 | & (data[['localy']].values < idata.at[j, 'localy'])] 91 | 92 | if np.size(dff1, 0) == 0: 93 | targetfollowing = pd.concat([targetfollowing, dff2], axis=0) 94 | 95 | else: 96 | distance = dff1[['localy']] - idata.at[j, 'localy'] 97 | y1 = np.max(distance[['localy']].values) 98 | dff3 = dff1.loc[distance['localy'].values == y1, ['id', 'localy', 'speedy']] 99 | 100 | targetfollowing = pd.concat([targetfollowing, dff3], axis=0) 101 | 102 | targetfollowing = targetfollowing.reset_index(drop=True) 103 | targetfollowing.columns = ['id-target-foll', 'localy-target-foll', 'speedy-target-foll'] 104 | 105 | 106 | 107 | 108 | # 换道前后的数据三个车辆配对起来 ddata前5s xdata后5s ydata是所有的10s 109 | Precedingxx = pd.DataFrame() 110 | TargetPrecedingxx = pd.DataFrame() 111 | TargetFollowingxx = pd.DataFrame() 112 | 113 | 114 | for j in range(np.size(lc, 0)): 115 | yy0 = Preceding0[(ddata[['id']].values == lc.at[j, 'id']) & (ddata[['frame']].values <= lc.at[j, 'lanechangeframe']) 116 | & (ddata[['frame']].values >= lc.at[j, 'startframe'])] 117 | yy1 = Preceding[(xdata[['id']].values == lc.at[j, 'id']) & (xdata[['frame']].values > lc.at[j, 'lanechangeframe']) 118 | & (xdata[['frame']].values <= lc.at[j, 'endframe'])] 119 | Precedingx = pd.concat([yy0, yy1], axis=0) 120 | 121 | 122 | yy2 = targetpreceding0[(ddata[['id']].values == lc.at[j, 'id']) & (ddata[['frame']].values <= lc.at[j, 'lanechangeframe']) 123 | & (ddata[['frame']].values >= lc.at[j, 'startframe'])] 124 | yy3 = targetpreceding[(xdata[['id']].values == lc.at[j, 'id']) & (xdata[['frame']].values > lc.at[j, 'lanechangeframe']) 125 | & (xdata[['frame']].values <= lc.at[j, 'endframe'])] 126 | TargetPrecedingx = pd.concat([yy2, yy3], axis=0) 127 | 128 | 129 | yy4 = targetfollowing0[(ddata[['id']].values == lc.at[j, 'id']) & (ddata[['frame']].values <= lc.at[j, 'lanechangeframe']) 130 | & (ddata[['frame']].values >= lc.at[j, 'startframe'])] 131 | yy5 = targetfollowing[(xdata[['id']].values == lc.at[j, 'id']) & (xdata[['frame']].values > lc.at[j, 'lanechangeframe']) 132 | & (xdata[['frame']].values <= lc.at[j, 'endframe'])] 133 | TargetFollowingx = pd.concat([yy4, yy5], axis=0) 134 | 135 | 136 | Precedingxx = pd.concat([Precedingxx, Precedingx], axis=0) 137 | TargetPrecedingxx = pd.concat([TargetPrecedingxx, TargetPrecedingx], axis=0) 138 | TargetFollowingxx = pd.concat([TargetFollowingxx, TargetFollowingx], axis=0) 139 | 140 | 141 | Precedingxx = Precedingxx.reset_index(drop=True) 142 | TargetPrecedingxx = TargetPrecedingxx.reset_index(drop=True) 143 | TargetFollowingxx = TargetFollowingxx.reset_index(drop=True) 144 | qdata = pd.concat([ydata, Precedingxx, TargetPrecedingxx, TargetFollowingxx], axis=1) 145 | 146 | qdata.to_csv(os.path.join(path, 'lane-change-prediction(trajectory).csv'), index=False, sep=',') 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | # 将目标车道的前后车的轨迹变成相对间隔和相对速度 156 | path = r'E:\PythonProjects1\Lane change prediciton\lane-change-prediction-NGSIM' 157 | xdata = pd.read_csv(os.path.join(path, 'lane-change-prediction(trajectory).csv'), parse_dates=True, encoding='gbk') 158 | lc = pd.read_csv(os.path.join(path, 'lane-change-QKV.csv'), parse_dates=True, encoding='gbk') 159 | xx = lc 160 | 161 | xdata['x1'] = pd.DataFrame(xdata[['localy-target-pre']].values - xdata[['localy']].values) 162 | xdata['r1'] = pd.DataFrame(xdata[['speedy-target-pre']].values - xdata[['speedy']].values) 163 | xdata['x2'] = pd.DataFrame(xdata[['localy']].values - xdata[['localy-target-foll']].values) 164 | xdata['r2'] = pd.DataFrame(xdata[['speedy']].values - xdata[['speedy-target-foll']].values) 165 | 166 | a1 = np.where(xdata[['id-target-pre']].values == 0) 167 | a2 = np.where(xdata[['id-target-foll']].values == 0) 168 | 169 | xdata.loc[a1[0], 'x1'] = 0 170 | xdata.loc[a1[0], 'r1'] = 0 171 | xdata.loc[a2[0], 'x2'] = 0 172 | xdata.loc[a2[0], 'r2'] = 0 173 | 174 | xxxdata = [['speedx', 'speedy', 'accx', 'accy', 'yaw', 'speedr', 'gap', 'localx', 'localy']] 175 | 176 | yydata = pd.DataFrame() 177 | for i in range(np.size(xx, 0)): 178 | print(i) 179 | ydata = xdata[(xdata[['id']].values == xx.at[i, 'id']) & (xdata[['frame']].values <= xx.at[i, 'endframe']) 180 | & (xdata[['frame']].values >= xx.at[i, 'startframe'])] 181 | ydata = ydata.reset_index() 182 | 183 | ydata['id'] = i 184 | ydata['Traffic'] = xx.at[1, 'Traffic'] 185 | ydata['class'] = xx.at[1, 'class'] 186 | yydata = pd.concat([yydata, ydata], axis=0) 187 | 188 | 189 | data = yydata[['id', 'speedx', 'speedy', 'accx', 'accy', 'yaw', 'speedr', 'gap', 'x1', 'r1', 'x2', 'r2', 190 | 'localx', 'localy', 'Traffic', 'class', 'maneuver']] 191 | 192 | 193 | data.loc[data['Traffic'] == 'A', 'Traffic'] = 0 194 | data.loc[data['Traffic'] == 'B', 'Traffic'] = 1 195 | data.loc[data['Traffic'] == 'C', 'Traffic'] = 2 196 | data.loc[data['Traffic'] == 'D', 'Traffic'] = 3 197 | data.loc[data['Traffic'] == 'E', 'Traffic'] = 4 198 | data.to_csv(os.path.join(path, 'lane-change-prediction(trajectory2).csv'), index=False, sep=',') 199 | ''' 200 | 201 | 202 | 203 | 204 | 205 | path = r'E:\PythonProjects1\Lane change prediciton\lane-change-prediction-NGSIM' 206 | ddata = pd.read_csv(os.path.join(path, 'lane-change-prediction(trajectory).csv'), parse_dates=True, encoding='gbk') 207 | xdata = pd.read_csv(os.path.join(path, 'lane-change-prediction(trajectory2).csv'), parse_dates=True, encoding='gbk') 208 | lc = pd.read_csv(os.path.join(path, 'lane-change-QKV.csv'), parse_dates=True, encoding='gbk') 209 | xx = lc 210 | yydata = pd.DataFrame() 211 | # 由于前后各5s,时间拉的有点长,变成换道前后2s 212 | for i in range(np.size(xx, 0)): 213 | print(i) 214 | ydata = xdata[(xdata[['id']].values == i) & (ddata[['frame']].values <= xx.at[i, 'lanechangeframe']+20) 215 | & (ddata[['frame']].values >= xx.at[i, 'lanechangeframe']-20)] 216 | ydata = ydata.reset_index(drop=True) 217 | 218 | yydata = pd.concat([yydata, ydata], axis=0) 219 | 220 | 221 | 222 | yydata.to_csv(os.path.join(path, 'lane-change-prediction(trajectory3).csv'), index=False, sep=',') 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | -------------------------------------------------------------------------------- /The format of samples.csv: -------------------------------------------------------------------------------- 1 | id,frame,localx,localy,length,width,speedx,speedy,accx,accy,class,lane,precedingid,speedr,gap,yaw,maneuver,leftlane,rightlane,id-left-pre,localy-left-pre,speedy-left-pre,id-left-foll,localy-left-foll,speedy-left-foll,id-right-pre,localy-right-pre,speedy-right-pre,id-right-foll,localy-right-foll,speedy-right-foll 2 | 55,463,5.5799736,103.6240752,4.69392,1.64592,0.012192,5.535168,-0.36576,0.94488,2,2,24,0.103632,9.6975168,89.87379805,1,1,3,0,0,0,44,97.0202784,8.388096,54,107.077764,4.501896,86,83.906868,3.313176 3 | 55,464,5.5811928,104.17302,4.69392,1.64592,0.012192,5.489448,1.08E-13,-0.4572,2,2,24,0.423672,9.739884,89.87274695,1,1,3,0,0,0,44,97.8584784,8.382,54,107.5050936,4.273296,86,84.2381856,3.313176 4 | 55,465,5.582412,104.720136,4.69392,1.64592,0.012192,5.47116,0,-0.18288,2,2,24,0.82296,9.82218,89.87232159,1,1,3,0,0,0,44,98.6966784,8.382,54,107.8955424,3.904488,86,84.5695032,3.313176 5 | 55,466,5.5833264,105.2699952,4.69392,1.64592,0.009144,5.498592,-0.03048,0.27432,2,2,24,1.085088,9.9306888,89.90471886,1,1,3,0,0,0,44,99.5348784,8.382,54,108.2549016,3.593592,86,84.900516,3.310128 6 | 55,467,5.5845456,105.8192448,4.69392,1.64592,0.012192,5.492496,0.03048,-0.06096,2,2,24,1.143,10.0449888,89.87281757,1,1,3,0,0,0,44,100.3730784,8.382,54,108.6026784,3.477768,86,85.2318336,3.313176 7 | 55,468,5.5857648,106.3672752,4.69392,1.64592,0.012192,5.480304,1.08E-13,-0.12192,2,2,24,1.12776,10.1577648,89.87253463,1,1,3,0,0,0,44,101.2115832,8.385048,54,108.9696576,3.669792,86,85.5631512,3.313176 8 | 55,469,5.586984,106.9110384,4.69392,1.64592,0.012192,5.437632,-1.08E-13,-0.42672,2,2,24,1.255776,10.2833424,89.87153434,1,1,3,0,0,0,44,102.0494784,8.378952,54,109.3799184,4.102608,86,85.8944688,3.313176 9 | 55,470,5.5882032,107.4493152,4.69392,1.64592,0.012192,5.382768,1.08E-13,-0.54864,2,2,24,1.621536,10.445496,89.87022496,1,1,3,0,0,0,44,102.8873736,8.378952,54,109.8258408,4.459224,86,86.2257864,3.313176 10 | 55,471,5.5894224,107.9833248,4.69392,1.64592,0.012192,5.340096,0,-0.42672,2,2,24,1.880616,10.6335576,89.86918795,1,1,3,0,0,0,44,103.7228304,8.354568,54,110.2769448,4.51104,86,86.557104,3.313176 11 | 55,472,5.5906416,108.5161152,4.69392,1.64592,0.012192,5.327904,-1.08E-13,-0.12192,2,2,24,1.914144,10.824972,89.86888861,1,1,3,0,0,0,44,104.5531056,8.302752,54,110.7006168,4.23672,86,86.8884216,3.313176 12 | 55,473,5.591556,109.0489056,4.69392,1.64592,0.009144,5.327904,-0.03048,0,2,2,24,1.944624,11.0194344,89.90166638,1,1,3,0,0,0,44,105.3885624,8.354568,54,111.0883224,3.877056,86,87.2197392,3.313176 13 | 55,474,5.5927752,109.5826104,4.69392,1.64592,0.012192,5.337048,0.03048,0.09144,2,2,24,2.04216,11.2236504,89.86911324,1,1,3,0,0,0,44,106.2526704,8.64108,54,111.463836,3.755136,86,87.5510568,3.313176 14 | 55,475,5.5936896,110.1157056,4.69392,1.64592,0.009144,5.330952,-0.03048,-0.06096,2,2,24,2.246376,11.448288,89.9017226,1,1,3,0,0,0,44,107.1628032,9.101328,54,111.8567232,3.928872,86,87.8820696,3.310128 15 | 55,476,5.5949088,110.646972,4.69392,1.64592,0.012192,5.312664,0.03048,-0.18288,2,2,24,2.298192,11.6781072,89.8685125,1,1,3,0,0,0,44,108.1119504,9.491472,54,112.2752136,4.184904,86,88.2133872,3.313176 16 | 55,477,5.5967376,111.177324,4.69392,1.64592,0.018288,5.30352,0.06096,-0.09144,2,2,24,2.380488,11.916156,89.80242913,1,1,3,0,0,0,44,109.1071224,9.95172,54,112.7022384,4.270248,86,88.5447048,3.313176 17 | 55,478,5.5982616,111.7140768,4.69392,1.64592,0.01524,5.367528,-0.03048,0.64008,2,2,24,2.548128,12.1709688,89.83732077,1,1,3,0,0,0,44,110.1309456,10.238232,54,113.1246912,4.224528,86,88.8760224,3.313176 18 | 55,479,5.594604,112.266984,4.69392,1.64592,-0.036576,5.529072,-0.51816,1.61544,2,2,24,2.410968,12.4120656,90.37901837,1,1,3,0,0,0,44,111.1587312,10.277856,54,113.5492776,4.245864,86,89.20734,3.313176 19 | 55,480,5.58546,112.8418368,4.69392,1.64592,-0.09144,5.748528,-0.54864,2.19456,2,2,24,2.023872,12.6144528,90.91130882,1,1,3,0,0,0,44,112.1804208,10.216896,54,113.992152,4.428744,86,89.5386576,3.313176 20 | 55,481,5.5714392,113.432844,4.69392,1.64592,-0.140208,5.910072,-0.48768,1.61544,2,2,24,1.566672,12.77112,91.35900546,1,1,3,0,0,0,44,113.20272,10.222992,54,114.4466088,4.544568,86,89.8699752,3.313176 21 | 55,482,5.556504,114.030252,4.69392,1.64592,-0.149352,5.97408,-0.09144,0.64008,2,2,24,1.316736,12.9027936,91.43209618,1,1,3,44,114.2295912,10.268712,2,82.0561224,8.043672,54,114.8931408,4.46532,86,90.2012928,3.313176 22 | 55,483,5.5424832,114.6267456,4.69392,1.64592,-0.140208,5.964936,0.09144,-0.09144,2,2,24,1.213104,13.024104,91.34651028,1,1,3,44,115.2531096,10.235184,2,82.8303144,7.74192,54,115.3299192,4.367784,86,90.5323056,3.310128 23 | 55,484,5.5287672,115.2217152,4.69392,1.64592,-0.13716,5.949696,0.03048,-0.1524,2,2,24,0.987552,13.1228592,91.32062166,1,1,3,44,116.2565112,10.034016,2,83.586828,7.565136,54,115.7673072,4.37388,86,90.8636232,3.313176 24 | 55,485,5.5147464,115.8136368,4.69392,1.64592,-0.140208,5.919216,-0.03048,-0.3048,2,2,24,0.978408,13.2207,91.35690685,1,1,3,44,117.2148024,9.582912,2,84.3713832,7.845552,54,116.2238976,4.565904,86,91.1949408,3.313176 25 | 55,486,5.5004208,116.4083016,4.69392,1.64592,-0.143256,5.946648,-0.03048,0.27432,2,2,24,1.155192,13.3362192,91.38000045,1,1,3,44,118.134384,9.195816,2,85.2031824,8.317992,54,116.7015192,4.776216,86,91.5262584,3.313176 26 | 55,487,5.4857904,117.011196,4.69392,1.64592,-0.146304,6.028944,-0.03048,0.82296,2,2,24,1.26492,13.4627112,91.3901202,1,1,3,44,119.0207424,8.863584,2,86.0736912,8.705088,54,117.1840176,4.824984,86,91.857576,3.313176 27 | 55,488,5.4687216,117.6217104,4.69392,1.64592,-0.170688,6.105144,-0.24384,0.762,2,2,24,1.2192,13.5846312,91.60146183,1,1,3,44,119.9058816,8.851392,2,86.9856528,9.119616,54,117.6628584,4.788408,86,92.1888936,3.313176 28 | 55,489,5.4556152,118.2413688,4.69392,1.64592,-0.131064,6.196584,0.39624,0.9144,2,2,24,1.008888,13.68552,91.21168284,1,1,3,44,120.8062608,9.003792,2,87.9082824,9.226296,51,131.6251368,4.264152,54,118.1249352,4.620768 29 | 55,490,5.4483,118.8686472,4.69392,1.64592,-0.073152,6.272784,0.57912,0.762,2,2,24,0.810768,13.7665968,90.66814207,1,1,3,44,121.7182224,9.119616,2,88.8260352,9.177528,51,132.0975768,4.7244,54,118.5632376,4.383024 30 | 55,491,5.4455568,119.5041552,4.69392,1.64592,-0.027432,6.35508,0.4572,0.82296,2,2,24,0.59436,13.8260328,90.24731838,1,1,3,44,122.6326224,9.144,2,89.739216,9.131808,51,132.589524,4.919472,54,118.9795944,4.163568 31 | 55,492,5.443728,120.1463688,4.69392,1.64592,-0.018288,6.422136,0.09144,0.67056,2,2,24,0.344424,13.8604752,90.16315792,1,1,3,44,123.547632,9.150096,2,90.6533112,9.140952,51,133.0677552,4.782312,54,119.3816256,4.020312 32 | 55,493,5.4412896,120.7879728,4.69392,1.64592,-0.024384,6.41604,-0.06096,-0.06096,2,2,24,0.216408,13.882116,90.21775013,1,1,3,44,124.4626416,9.150096,2,91.568016,9.147048,51,133.5045336,4.367784,54,119.7961536,4.14528 33 | 55,494,5.4385464,121.4283576,4.69392,1.64592,-0.027432,6.403848,-0.03048,-0.12192,2,2,24,0.109728,13.8930888,90.24543497,1,1,3,44,125.3800896,9.17448,2,92.4821112,9.140952,51,133.9215,4.169664,54,120.2365896,4.40436 34 | 55,495,5.4358032,122.0681328,4.69392,1.64592,-0.027432,6.397752,0,-0.06096,2,2,24,-0.006096,13.8924792,90.24566882,1,1,3,44,126.2914416,9.11352,2,93.3955968,9.134856,51,134.34822,4.2672,54,120.6974472,4.608576 35 | 55,496,5.4333648,122.7054696,4.69392,1.64592,-0.024384,6.373368,0.03048,-0.24384,2,2,24,0.006096,13.8930888,90.21920803,1,1,3,44,127.1893824,8.979408,2,94.3045104,9.089136,51,134.7737208,4.255008,54,121.1662296,4.687824 36 | 55,497,5.431536,123.341892,4.69392,1.64592,-0.018288,6.364224,0.06096,-0.09144,2,2,24,0.219456,13.9150344,90.16464259,1,1,3,44,128.0818368,8.924544,2,95.2094616,9.049512,51,135.1989168,4.25196,54,121.6280016,4.61772 37 | 55,498,5.4287928,123.9859344,4.69392,1.64592,-0.027432,6.440424,-0.09144,0.762,2,2,24,0.499872,13.9650216,90.24404113,1,1,3,44,128.98374,9.019032,2,96.1238616,9.144,51,135.6271608,4.28244,54,122.0748384,4.468368 38 | 55,499,5.4214776,124.6507032,4.69392,1.64592,-0.073152,6.647688,-0.4572,2.07264,2,2,24,0.463296,14.0113512,90.63046456,1,1,3,44,129.9106368,9.268968,2,97.0693512,9.454896,51,136.0636344,4.364736,54,122.497596,4.227576 39 | 55,500,5.4077616,125.3422944,4.69392,1.64592,-0.13716,6.915912,-0.64008,2.68224,2,2,24,0.140208,14.025372,91.13617105,1,1,3,44,130.8713664,9.607296,2,98.0538552,9.84504,51,136.5110808,4.474464,54,122.8865208,3.889248 40 | 55,501,5.3897784,126.0616224,4.69392,1.64592,-0.179832,7.19328,-0.42672,2.77368,2,2,24,-0.265176,13.9988544,91.43209618,1,1,3,44,131.8583088,9.869424,2,99.0801168,10.262616,51,136.9667568,4.55676,54,123.2464896,3.599688 41 | 55,502,5.370576,126.7745496,4.69392,1.64592,-0.192024,7.129272,-0.12192,-0.64008,2,2,24,-0.344424,13.964412,91.54286515,1,1,3,44,132.8556144,9.973056,2,100.1225328,10.42416,51,137.4254808,4.58724,54,123.594876,3.483864 42 | 55,503,5.352288,127.4576064,4.69392,1.64592,-0.18288,6.830568,0.09144,-2.98704,2,2,24,-0.170688,13.9473432,91.53365716,1,1,3,44,133.8480432,9.924288,2,101.1731784,10.506456,51,137.8839,4.584192,54,123.9588072,3.639312 43 | 55,504,5.3376576,128.127252,4.69392,1.64592,-0.146304,6.696456,0.36576,-1.34112,2,2,24,-0.112776,13.9360656,91.25159761,1,1,3,44,134.8261464,9.781032,2,102.2323584,10.5918,51,138.3420144,4.581144,54,124.3605336,4.017264 44 | 55,505,5.3352192,128.8072608,4.69392,1.64592,-0.024384,6.800088,1.2192,1.03632,2,2,24,-0.082296,13.927836,90.20545239,1,1,3,44,135.799068,9.729216,2,103.2903192,10.579608,51,138.7979952,4.559808,54,124.8009696,4.40436 45 | 55,506,5.3330856,129.51714,4.69392,1.64592,-0.021336,7.098792,0.03048,2.98704,2,2,24,0.003048,13.9281408,90.17220663,1,1,3,44,136.7777808,9.787128,2,104.339136,10.488168,51,139.2487944,4.507992,54,125.2694472,4.684776 46 | 55,507,5.3297328,130.2407352,4.69392,1.64592,-0.033528,7.235952,-0.12192,1.3716,2,2,24,0.246888,13.9528296,90.26547981,1,1,3,44,137.7577128,9.79932,2,105.3855144,10.463784,51,139.7026416,4.538472,54,125.7562128,4.867656 47 | 55,508,5.3272944,130.9506144,4.69392,1.64592,-0.024384,7.098792,0.09144,-1.3716,2,2,24,0.56388,14.0092176,90.1968074,1,1,3,44,138.7285008,9.70788,2,106.4684688,10.829544,51,140.1793488,4.767072,54,126.2539512,4.977384 48 | 55,509,5.3297328,131.6729904,4.69392,1.64592,0.024384,7.22376,0.48768,1.24968,2,2,24,0.448056,14.0540232,89.80659726,1,1,3,44,139.6746,9.460992,2,107.5901328,11.21664,51,140.7023856,5.230368,54,126.7699776,5.160264 49 | 55,510,5.3379624,132.4221888,4.69392,1.64592,0.082296,7.491984,0.57912,2.68224,2,2,24,0.128016,14.0668248,89.37065751,1,1,3,44,140.5883904,9.137904,2,108.7642224,11.740896,51,141.2616936,5.59308,54,127.2643632,4.943856 50 | 55,511,5.335524,133.1811408,4.69392,1.64592,-0.024384,7.58952,-1.0668,0.97536,2,2,24,0.033528,14.0701776,90.18408219,1,1,3,44,141.477492,8.891016,2,109.9462368,11.820144,51,141.8670264,6.053328,54,127.708152,4.437888 51 | 55,512,5.3349144,133.9303392,4.69392,1.64592,-0.006096,7.491984,0.18288,-0.97536,2,2,24,0.176784,14.087856,90.04661983,1,1,3,44,142.3571448,8.796528,2,111.111792,11.655552,51,142.495524,6.284976,54,128.1330432,4.248912 52 | 13,282,12.7266192,82.9165728,4.51104,1.95072,-0.256032,2.426208,-0.1524,-6.33984,2,4,15,-1.624584,4.3766232,96.02399308,1,3,5,50,87.9366288,1.972056,51,70.0092072,2.063496,4,91.6204416,2.42316,27,80.1773352,3.358896 53 | 13,283,12.707112,83.102196,4.51104,1.95072,-0.195072,1.856232,0.6096,-5.69976,2,4,15,-0.9906,4.2775632,95.99921097,1,3,5,50,88.1118888,1.7526,51,70.2158616,2.066544,4,91.7984448,1.780032,27,80.4507408,2.734056 54 | 13,284,12.6982728,83.239356,4.51104,1.95072,-0.088392,1.3716,1.0668,-4.84632,2,4,15,-0.582168,4.2193464,93.68729577,1,3,5,50,88.2621552,1.502664,51,70.422516,2.066544,4,91.9096968,1.11252,27,80.6750736,2.243328 55 | 13,285,12.70254,83.3268336,4.51104,1.95072,0.042672,0.874776,1.31064,-4.96824,2,4,15,-0.271272,4.1922192,87.20729763,1,3,5,50,88.388952,1.267968,51,70.6291704,2.066544,4,91.9660848,0.56388,27,80.9051976,2.30124 56 | 13,286,12.7028448,83.387184,4.51104,1.95072,0.003048,0.603504,-0.39624,-2.71272,2,4,15,-0.237744,4.1684448,89.71062984,1,3,5,50,88.4998992,1.109472,51,70.8358248,2.066544,4,91.9660848,0,27,81.1429416,2.37744 57 | 13,287,12.7028448,83.4518016,4.51104,1.95072,0,0.646176,-0.03048,0.42672,2,4,15,-0.438912,4.1245536,90,1,3,5,50,88.6202952,1.20396,51,71.0424792,2.066544,4,91.9660848,0,27,81.3788568,2.359152 58 | 13,288,12.7022352,83.550252,4.51104,1.95072,-0.006096,0.984504,-0.06096,3.38328,2,4,15,-0.710184,4.0535352,90.35476809,1,3,5,50,88.773,1.527048,51,71.2488288,2.063496,4,91.9660848,0,27,81.6150768,2.3622 59 | 13,289,12.7016256,83.6776584,4.51104,1.95072,-0.006096,1.274064,0,2.8956,2,4,15,-0.749808,3.9785544,90.27414039,1,3,5,50,88.9470408,1.740408,51,71.4554832,2.066544,4,91.9660848,0,27,81.8512968,2.3622 60 | 13,290,12.701016,83.7974448,4.51104,1.95072,-0.006096,1.197864,2.17E-13,-0.762,2,4,15,-0.341376,3.9444168,90.29157906,1,3,5,50,89.1018792,1.548384,51,71.6621376,2.066544,4,91.9660848,0,27,82.0878216,2.365248 61 | 13,291,12.7004064,83.8858368,4.51104,1.95072,-0.006096,0.88392,-2.17E-13,-3.13944,2,4,15,0.35052,3.9794688,90.39513704,1,3,5,50,89.211912,1.100328,51,71.8684872,2.063496,4,91.9852872,0.192024,27,82.3240416,2.3622 62 | 13,292,12.7004064,83.9568552,4.51104,1.95072,0,0.710184,0.06096,-1.73736,2,4,15,0.835152,4.062984,90,1,3,5,50,89.2893312,0.774192,51,72.0751416,2.066544,4,92.043504,0.582168,27,82.5602616,2.3622 63 | 13,293,12.6997968,84.0461616,4.51104,1.95072,-0.006096,0.893064,-0.06096,1.8288,2,4,15,0.819912,4.1449752,90.3910914,1,3,5,50,89.3579112,0.6858,51,72.281796,2.066544,4,92.1239712,0.804672,27,82.7964816,2.3622 64 | 13,294,12.699492,84.1656432,4.51104,1.95072,-0.003048,1.194816,0.03048,3.01752,2,4,15,0.539496,4.1989248,90.14616239,1,3,5,50,89.4307584,0.728472,51,72.4884504,2.066544,4,92.2093152,0.85344,27,83.0327016,2.3622 65 | 13,295,12.7028448,84.2927448,4.51104,1.95072,0.033528,1.271016,0.36576,0.762,2,4,15,0.417576,4.2406824,88.48895096,1,3,5,50,89.5087872,0.780288,51,72.6951048,2.066544,4,92.2839912,0.74676,27,83.2686168,2.359152 66 | 13,296,12.6961392,84.3905856,4.51104,1.95072,-0.067056,0.978408,-1.00584,-2.92608,2,4,15,0.694944,4.3101768,93.92068253,1,3,5,50,89.5834632,0.74676,51,72.9014544,2.063496,4,92.34678,0.627888,27,83.5054464,2.368296 67 | 13,297,12.6760224,84.4442304,4.51104,1.95072,-0.201168,0.536448,-1.34112,-4.4196,2,4,15,1.17348,4.4275248,110.5560452,1,3,5,50,89.6560056,0.725424,51,73.1081088,2.066544,4,92.3995104,0.527304,27,83.7465432,2.410968 68 | 13,298,12.6528576,84.4805016,4.51104,1.95072,-0.231648,0.362712,-0.3048,-1.73736,2,4,15,1.328928,4.5604176,122.5645585,1,3,5,50,89.7349488,0.789432,51,73.3147632,2.066544,4,92.4467544,0.47244,27,83.98764,2.410968 69 | 13,299,12.6418848,84.5350608,4.51104,1.95072,-0.109728,0.545592,1.2192,1.8288,2,4,15,0.987552,4.6591728,101.3714746,1,3,5,50,89.8224264,0.874776,51,73.5214176,2.066544,4,92.4952176,0.484632,27,84.2153256,2.276856 70 | 13,300,12.6525528,84.6201,4.51104,1.95072,0.10668,0.850392,2.16408,3.048,2,4,15,0.48768,4.7079408,82.84970982,1,3,5,50,89.9172192,0.947928,51,73.728072,2.066544,4,92.5415472,0.463296,27,84.409788,1.944624 71 | 13,301,12.6723648,84.723732,4.51104,1.95072,0.19812,1.03632,0.9144,1.85928,2,4,15,0.195072,4.727448,79.17698877,1,3,5,50,90.0202416,1.030224,51,73.9344216,2.063496,4,92.5903152,0.48768,27,84.5634072,1.536192 72 | 13,302,12.6873,84.8279736,4.51104,1.95072,0.149352,1.042416,-0.48768,0.06096,2,4,15,0.225552,4.7500032,81.84644461,1,3,5,50,90.1388088,1.185672,51,74.141076,2.066544,4,92.6524944,0.621792,27,84.6838032,1.20396 73 | 13,303,12.7022352,84.9273384,4.51104,1.95072,0.149352,0.993648,0,-0.48768,2,4,15,0.36576,4.7865792,81.45204652,1,3,5,50,90.28176,1.429512,51,74.3477304,2.066544,4,92.7378384,0.85344,27,84.7904832,1.0668 74 | 13,304,12.7168656,85.0260936,4.51104,1.95072,0.146304,0.987552,-0.03048,-0.06096,2,4,15,0.393192,4.8258984,81.57303098,1,3,5,50,90.4335504,1.517904,51,74.5543848,2.066544,4,92.8561008,1.182624,27,84.8971632,1.0668 75 | 13,305,12.731496,85.1251536,4.51104,1.95072,0.146304,0.9906,0,0.03048,2,4,15,0.381,4.8639984,81.59858948,1,3,5,50,90.57132,1.377696,51,74.7610392,2.066544,4,93.0042336,1.481328,27,85.00872,1.115568 76 | 13,306,12.7464312,85.2242136,4.51104,1.95072,0.149352,0.9906,0.03048,1.73E-12,2,4,15,0.381,4.9020984,81.42613542,1,3,5,50,90.697812,1.26492,51,74.9676936,2.066544,4,93.1639488,1.597152,27,85.1208864,1.121664 77 | 13,307,12.7613664,85.3235784,4.51104,1.95072,0.149352,0.993648,0,0.03048,2,4,15,0.377952,4.9398936,81.45204652,1,3,5,50,90.8337528,1.359408,51,75.1740432,2.063496,4,93.3062904,1.423416,27,85.232748,1.118616 78 | 13,308,12.7759968,85.4226384,4.51104,1.95072,0.146304,0.9906,-0.03048,-0.03048,2,4,15,0.381,4.9779936,81.59858948,1,3,5,50,90.9956016,1.618488,51,75.3806976,2.066544,4,93.4035216,0.972312,27,85.3443048,1.115568 79 | 13,309,12.7906272,85.5216984,4.51104,1.95072,0.146304,0.9906,2.17E-13,1.73E-12,2,4,15,0.381,5.0160936,81.59858948,1,3,5,50,91.1784816,1.8288,51,75.587352,2.066544,4,93.46692,0.633984,27,85.4561664,1.118616 80 | 13,310,12.8055624,85.6207584,4.51104,1.95072,0.149352,0.9906,0.03048,-1.73E-12,2,4,15,0.381,5.0541936,81.42613542,1,3,5,50,91.3647144,1.862328,51,75.7937016,2.063496,4,93.523308,0.56388,27,85.5677232,1.115568 81 | 13,311,12.8201928,85.7201232,4.51104,1.95072,0.146304,0.993648,-0.03048,0.03048,2,4,15,0.377952,5.0919888,81.62399452,1,3,5,50,91.5488136,1.840992,51,76.000356,2.066544,4,93.5967648,0.734568,27,85.6795848,1.118616 82 | 13,312,12.835128,85.8191832,4.51104,1.95072,0.149352,0.9906,0.03048,-0.03048,2,4,15,0.381,5.1300888,81.42613542,1,3,5,50,91.7319984,1.831848,51,76.2070104,2.066544,4,93.7022256,1.054608,27,85.7914464,1.118616 83 | 13,313,12.8497584,85.918548,4.51104,1.95072,0.146304,0.993648,-0.03048,0.03048,2,4,15,0.377952,5.167884,81.62399452,1,3,5,50,91.9145736,1.825752,51,76.4136648,2.066544,4,93.8329848,1.307592,27,85.9030032,1.115568 84 | 13,314,12.8643888,86.0173032,4.51104,1.95072,0.146304,0.987552,0,-0.06096,2,4,15,0.387096,5.2065936,81.57303098,1,3,5,50,92.0974536,1.8288,51,76.6203192,2.066544,4,93.9829464,1.499616,27,86.0148648,1.118616 85 | 13,315,12.879324,86.1130104,4.51104,1.95072,0.149352,0.957072,0.03048,-0.3048,2,4,15,0.414528,5.2480464,81.13047381,1,3,5,50,92.2803336,1.8288,51,76.8266688,2.063496,27,86.1267264,1.118616,31,68.9402736,3.264408 86 | 13,316,12.8951736,86.2074984,4.51104,1.95072,0.158496,0.94488,0.09144,-0.12192,2,4,15,0.423672,5.2904136,80.47774499,1,3,5,50,92.4629088,1.825752,51,77.0333232,2.066544,27,86.238588,1.118616,31,69.2664096,3.26136 87 | 13,317,12.909804,86.31174,4.51104,1.95072,0.146304,1.042416,-0.12192,0.97536,2,4,15,0.310896,5.3215032,82.01067323,1,3,5,50,92.6457888,1.8288,51,77.2399776,2.066544,27,86.3501448,1.115568,31,69.5928504,3.264408 88 | 13,318,12.9198624,86.4415848,4.51104,1.95072,0.100584,1.298448,-0.4572,2.56032,2,4,15,0.048768,5.32638,85.5704407,1,3,5,50,92.8286688,1.8288,51,77.446632,2.066544,27,86.4620064,1.118616,31,69.9192912,3.264408 89 | 13,319,12.92352,86.6049576,4.51104,1.95072,0.036576,1.633728,-0.64008,3.3528,2,4,15,-0.2286,5.30352,88.71747292,1,3,5,50,93.0115488,1.8288,51,77.6505432,2.039112,4,94.7489088,1.527048,27,86.5735632,1.115568 90 | 13,320,12.9229104,86.7939336,4.51104,1.95072,-0.006096,1.88976,-0.42672,2.56032,2,4,15,-0.326136,5.2709064,90.18482445,1,3,5,50,93.197172,1.856232,51,77.859636,2.090928,4,94.9022232,1.533144,27,86.6854248,1.118616 91 | 13,321,12.9207768,86.9923584,4.51104,1.95072,-0.021336,1.984248,-0.1524,0.94488,2,4,15,-0.207264,5.25018,90.61605991,1,3,5,50,93.377004,1.79832,51,78.079092,2.19456,4,95.054928,1.527048,27,86.7972864,1.118616 92 | 13,322,12.9198624,87.1898688,4.51104,1.95072,-0.009144,1.975104,0.12192,-0.09144,2,4,15,-0.03048,5.247132,90.26525634,1,3,5,50,93.5455584,1.685544,51,78.3028152,2.237232,4,95.2070232,1.520952,27,86.9088432,1.115568 93 | 13,323,12.9192528,87.3840264,4.51104,1.95072,-0.006096,1.941576,0.03048,-0.33528,2,4,15,0.073152,5.2544472,90.17989197,1,3,5,50,93.7089312,1.633728,51,78.5222712,2.19456,4,95.3591184,1.520952,27,87.0207048,1.118616 94 | 13,324,12.9183384,87.5784888,4.51104,1.95072,-0.009144,1.944624,-0.03048,0.03048,2,4,15,0.064008,5.260848,90.26941391,1,3,5,50,93.875352,1.664208,51,78.731364,2.090928,4,95.5112136,1.520952,27,87.1325664,1.118616 95 | 13,325,12.917424,87.7708176,4.51104,1.95072,-0.009144,1.923288,0,-0.21336,2,4,15,0.06096,5.266944,90.2724026,1,3,5,50,94.0533552,1.780032,51,78.93558,2.04216,4,95.6636136,1.524,27,87.2441232,1.115568 96 | 13,326,12.9162048,87.9567456,4.51104,1.95072,-0.012192,1.85928,-0.03048,-0.64008,2,4,15,0.118872,5.2788312,90.37570464,1,3,5,50,94.2417216,1.883664,51,79.1419296,2.063496,4,95.8166232,1.530096,27,87.3568992,1.12776 97 | 13,327,12.9171192,88.151208,4.51104,1.95072,0.009144,1.944624,0.21336,0.85344,2,4,15,0.033528,5.282184,89.73058609,1,3,5,50,94.4395368,1.978152,51,79.348584,2.066544,4,95.9681088,1.514856,27,87.4705896,1.136904 98 | 13,328,12.9134616,88.375236,4.51104,1.95072,-0.036576,2.24028,-0.4572,2.95656,2,4,15,-0.25908,5.256276,90.9353582,1,3,5,50,94.6532016,2.136648,51,79.5552384,2.066544,4,96.1153272,1.472184,27,87.5769648,1.063752 99 | 13,329,12.8997456,88.6257816,4.51104,1.95072,-0.13716,2.505456,-1.00584,2.65176,2,4,15,-0.524256,5.2038504,93.13350243,1,3,5,50,94.8793632,2.261616,51,79.7618928,2.066544,4,96.2652888,1.499616,27,87.67572,0.987552 100 | 13,330,12.9177288,88.8723648,4.51104,1.95072,0.179832,2.465832,3.16992,-0.39624,2,4,15,-0.484632,5.1553872,85.82882964,1,3,5,50,95.1100968,2.307336,51,79.9685472,2.066544,4,96.4332336,1.679448,27,87.7802664,1.045464 101 | 13,331,12.9475992,89.0729232,4.51104,1.95072,0.298704,2.005584,1.18872,-4.60248,2,4,15,-0.021336,5.1532536,81.52885537,1,3,5,50,95.3405256,2.304288,51,80.1748968,2.063496,4,96.627696,1.944624,27,87.9152928,1.350264 102 | 100,470,12.4108464,68.864988,4.69392,1.79832,0.155448,4.614672,0.03048,8.66E-13,2,4,84,-0.637032,10.15746,88.07068675,1,3,5,86,86.2257864,3.313176,90,59.432952,3.206496,67,71.634096,3.788664,77,52.2939264,2.886456 103 | 100,471,12.4260864,69.3264552,4.69392,1.79832,0.1524,4.614672,-0.03048,0,2,4,84,-0.481584,10.1093016,88.10848867,1,3,5,86,86.557104,3.313176,90,59.7523824,3.194304,67,72.0419184,4.078224,77,52.6136616,3.197352 104 | 100,472,12.4416312,69.7879224,4.69392,1.79832,0.155448,4.614672,0.03048,-8.66E-13,2,4,84,-0.637032,10.0455984,88.07068675,1,3,5,86,86.8884216,3.313176,90,60.066936,3.145536,67,72.4409016,3.989832,77,52.9355304,3.218688 105 | 100,473,12.4568712,70.2493896,4.69392,1.79832,0.1524,4.614672,-0.03048,8.66E-13,2,4,84,-0.917448,9.9538536,88.10848867,1,3,5,86,87.2197392,3.313176,90,60.3817944,3.148584,67,72.8078808,3.669792,77,53.2488648,3.133344 106 | 100,474,12.472416,70.7108568,4.69392,1.79832,0.155448,4.614672,0.03048,0,2,4,84,-1.121664,9.8416872,88.07068675,1,3,5,86,87.5510568,3.313176,90,60.7125024,3.30708,67,73.1571816,3.493008,77,53.5542744,3.054096 107 | 100,475,12.487656,71.172324,4.69392,1.79832,0.1524,4.614672,-0.03048,-8.66E-13,2,4,84,-1.069848,9.7347024,88.10848867,1,3,5,86,87.8820696,3.310128,90,61.0825296,3.700272,67,73.5256848,3.685032,77,53.8517592,2.974848 108 | 100,476,12.5032008,71.6334864,4.69392,1.79832,0.155448,4.611624,0.03048,-0.03048,2,4,84,-0.917448,9.6429576,88.06941256,1,3,5,86,88.2133872,3.313176,90,61.4897424,4.072128,67,73.927716,4.020312,77,54.1425384,2.907792 109 | 100,477,12.5187456,72.0949536,4.69392,1.79832,0.155448,4.614672,0,0.03048,2,4,84,-0.874776,9.55548,88.07068675,1,3,5,86,88.5447048,3.313176,90,61.9362744,4.46532,67,74.359008,4.31292,77,54.4308792,2.883408 110 | 100,478,12.5339856,72.5564208,4.69392,1.79832,0.1524,4.614672,-0.03048,-8.66E-13,2,4,84,-0.877824,9.4676976,88.10848867,1,3,5,86,88.8760224,3.313176,90,62.3992656,4.629912,67,74.7973104,4.383024,77,54.7195248,2.886456 111 | 100,479,12.5495304,73.017888,4.69392,1.79832,0.155448,4.614672,0.03048,8.66E-13,2,4,84,-0.893064,9.3783912,88.07068675,1,3,5,86,89.20734,3.313176,90,62.8625616,4.63296,67,75.2289072,4.315968,77,55.0093896,2.898648 112 | 100,480,12.5647704,73.4793552,4.69392,1.79832,0.1524,4.614672,-0.03048,0,2,4,84,-0.810768,9.2973144,88.10848867,1,3,5,86,89.5386576,3.313176,90,63.3194568,4.568952,67,75.6656856,4.367784,77,55.2986448,2.892552 113 | 100,481,12.5803152,73.9408224,4.69392,1.79832,0.155448,4.614672,0.03048,-8.66E-13,2,4,84,-0.77724,9.2195904,88.07068675,1,3,5,86,89.8699752,3.313176,90,63.7806192,4.611624,67,76.1088648,4.431792,77,55.5827184,2.840736 114 | 100,482,12.5955552,74.4022896,4.69392,1.79832,0.1524,4.614672,-0.03048,8.66E-13,2,4,84,-0.966216,9.1229688,88.10848867,1,3,5,86,90.2012928,3.313176,90,64.2466584,4.660392,67,76.5499104,4.410456,77,55.8670968,2.843784 115 | 100,483,12.6111,74.8637568,4.69392,1.79832,0.155448,4.614672,0.03048,0,2,4,84,-1.161288,9.00684,88.07068675,1,3,5,86,90.5323056,3.310128,90,64.6974576,4.507992,67,76.97724,4.273296,77,56.1667152,2.996184 116 | 100,484,12.62634,75.325224,4.69392,1.79832,0.1524,4.614672,-0.03048,-8.66E-13,2,4,84,-1.237488,8.8830912,88.10848867,1,3,5,86,90.8636232,3.313176,90,65.1086328,4.111752,67,77.407008,4.29768,77,56.5059576,3.392424 117 | 100,485,12.64158,75.7866912,4.69392,1.79832,0.1524,4.614672,2.17E-13,8.66E-13,2,4,84,-1.17348,8.7657432,88.10848867,1,3,5,86,91.1949408,3.313176,90,65.47866,3.700272,67,77.8797528,4.727448,77,56.8826904,3.767328 118 | 100,486,12.65682,76.2478536,4.69392,1.79832,0.1524,4.611624,-2.17E-13,-0.03048,2,4,84,-0.947928,8.6709504,88.1072394,1,3,5,86,91.5262584,3.313176,90,65.8425912,3.639312,67,78.3921216,5.123688,77,57.299352,4.166616 119 | 100,487,12.6723648,76.7093208,4.69392,1.79832,0.155448,4.614672,0.03048,0.03048,2,4,84,-0.621792,8.6087712,88.07068675,1,3,5,86,91.857576,3.313176,90,66.265044,4.224528,67,78.937104,5.449824,77,57.7315584,4.322064 120 | 100,488,12.6879096,77.1671304,4.69392,1.79832,0.155448,4.578096,0,-0.36576,2,4,84,-0.19812,8.5889592,88.05528459,1,3,5,86,92.1888936,3.313176,90,66.723768,4.58724,67,79.4848296,5.477256,77,58.1637648,4.322064 121 | 100,489,12.7031496,77.6322552,4.69392,1.79832,0.1524,4.651248,-0.03048,0.73152,2,4,84,0.170688,8.606028,88.12335226,1,3,5,86,92.5202112,3.313176,90,67.2321744,5.084064,67,80.020668,5.358384,77,58.5913992,4.276344 122 | 100,490,12.7186944,78.1132296,4.69392,1.79832,0.155448,4.809744,0.03048,1.58496,2,4,84,0.283464,8.6343744,88.14887961,1,3,5,86,92.8539672,3.33756,90,67.7640504,5.31876,67,80.540352,5.19684,77,59.0169,4.255008 123 | 100,491,12.7318008,78.6003,4.69392,1.79832,0.131064,4.870704,-0.24384,0.6096,2,4,84,0.128016,8.647176,88.45862069,1,3,5,86,93.1828464,3.288792,90,68.2931832,5.291328,67,81.037176,4.96824,77,59.437524,4.20624 124 | 100,492,12.7449072,79.0809696,4.69392,1.79832,0.131064,4.806696,0,-0.64008,2,4,84,-0.067056,8.6404704,88.43810513,1,3,5,86,93.5016672,3.188208,90,68.8159152,5.22732,67,81.51876,4.81584,77,59.8599768,4.224528 125 | 100,493,12.7577088,79.543656,4.69392,1.79832,0.128016,4.626864,-0.03048,-1.79832,2,4,84,-0.143256,8.6261448,88.41514561,1,3,5,86,93.8165256,3.148584,90,69.3395616,5.236464,67,81.994248,4.75488,77,60.3007176,4.407408 126 | 100,494,12.7708152,79.997808,4.69392,1.79832,0.131064,4.54152,0.03048,-0.85344,2,4,84,-0.103632,8.6157816,88.34695645,1,3,5,86,94.1353464,3.188208,90,69.8635128,5.239512,67,82.4679072,4.736592,77,60.7883976,4.8768 127 | 100,495,12.7839216,80.4632376,4.69392,1.79832,0.131064,4.654296,0,1.12776,2,4,84,0.039624,8.619744,88.38698912,1,3,5,86,94.4642256,3.288792,90,70.3871592,5.236464,67,82.95132,4.834128,77,61.3096056,5.21208 128 | 100,496,12.797028,80.9481744,4.69392,1.79832,0.131064,4.849368,0,1.95072,2,4,84,0.170688,8.6368128,88.4518423,1,3,5,86,94.7979816,3.33756,90,70.9111104,5.239512,67,83.4627744,5.114544,77,61.8771432,5.675376 129 | 100,497,12.8098296,81.4584096,4.69392,1.79832,0.128016,5.102352,-0.03048,2.52984,2,4,84,0.188976,8.6557104,88.562773,1,3,5,86,95.1289944,3.310128,90,71.4350616,5.239512,67,84.0080616,5.452872,77,62.4644928,5.873496 130 | 100,498,12.8226312,81.9878472,4.69392,1.79832,0.128016,5.294376,0,1.92024,2,4,84,0.149352,8.6706456,88.61487972,1,3,5,86,95.460312,3.313176,90,71.958708,5.236464,67,84.5679792,5.599176,77,63.0536712,5.891784 131 | 100,499,12.8354328,82.5246,4.69392,1.79832,0.128016,5.367528,-2.17E-13,0.73152,2,4,84,0.09144,8.6797896,88.63374979,1,3,5,86,95.7916296,3.313176,90,72.4826592,5.239512,67,85.1208864,5.529072,77,63.6373632,5.83692 132 | 100,500,12.8479296,83.0607432,4.69392,1.79832,0.124968,5.361432,-0.03048,-0.06096,2,4,84,0.143256,8.6941152,88.66475175,1,3,5,86,96.123252,3.316224,90,73.0063056,5.236464,67,85.6612968,5.404104,77,64.2189216,5.815584 133 | 100,501,12.8607312,83.594448,4.69392,1.79832,0.128016,5.337048,0.03048,-0.24384,2,4,84,0.231648,8.71728,88.62595009,1,3,5,86,96.4542648,3.310128,90,73.5302568,5.239512,67,86.1953064,5.340096,77,64.8007848,5.818632 134 | 100,502,12.873228,84.1275432,4.69392,1.79832,0.124968,5.330952,-0.03048,-0.06096,2,4,84,0.48768,8.766048,88.65712018,1,3,5,86,96.7822296,3.279648,90,74.0539032,5.236464,67,86.7174288,5.221224,77,65.382648,5.818632 135 | 100,503,12.8863344,84.6606384,4.69392,1.79832,0.131064,5.330952,0.06096,-1.73E-12,2,4,84,0.829056,8.8489536,88.59163962,1,3,5,86,97.1089752,3.267456,90,74.5778544,5.239512,67,87.206328,4.888992,77,65.964816,5.82168 136 | 100,504,12.9000504,85.1934288,4.69392,1.79832,0.13716,5.327904,0.06096,-0.03048,2,4,84,0.947928,8.9437464,88.52531995,1,3,5,86,97.4454744,3.364992,90,75.1018056,5.239512,67,87.6595656,4.532376,77,66.5466792,5.818632 137 | 100,505,12.9125472,85.7274384,4.69392,1.79832,0.124968,5.340096,-0.12192,0.12192,2,4,84,0.451104,8.9888568,88.65941879,1,3,5,86,97.807272,3.617976,90,75.625452,5.236464,67,88.10244,4.428744,77,67.1288472,5.82168 138 | 100,506,12.9207768,86.26602,4.69392,1.79832,0.082296,5.385816,-0.42672,0.4572,2,4,84,0.042672,8.993124,89.12458083,1,3,5,86,98.2032072,3.959352,90,76.1494032,5.239512,67,88.5648216,4.623816,77,67.7107104,5.818632 139 | 100,507,12.9229104,86.8097832,4.69392,1.79832,0.021336,5.437632,-0.6096,0.51816,2,4,84,-0.573024,8.9358216,89.77518588,1,3,5,86,98.6247456,4.215384,90,76.6703064,5.209032,67,89.0582928,4.934712,77,68.2928784,5.82168 140 | 100,508,12.9201672,87.3575088,4.69392,1.79832,-0.027432,5.477256,-0.48768,0.39624,2,4,84,-0.633984,8.8724232,90.28695476,1,3,5,86,99.0560376,4.31292,90,77.196696,5.263896,67,89.567004,5.087112,77,68.8747416,5.818632 141 | 100,509,12.9168144,87.9070632,4.69392,1.79832,-0.033528,5.495544,-0.06096,0.18288,2,4,84,-0.374904,8.8349328,90.34955394,1,3,5,86,99.4861104,4.300728,90,77.7349728,5.382768,67,90.0796776,5.126736,77,69.4566048,5.818632 142 | 100,510,12.9140712,88.456008,4.69392,1.79832,-0.027432,5.489448,0.06096,-0.06096,2,4,84,-0.03048,8.8318848,90.28631745,1,3,5,86,99.91344,4.273296,90,78.2762976,5.413248,67,90.5984472,5.187696,77,70.0387728,5.82168 143 | 100,511,12.911328,89.0040384,4.69392,1.79832,-0.027432,5.480304,0,-0.09144,2,4,84,0.222504,8.8541352,90.28679517,1,3,5,86,100.3395504,4.261104,90,78.8191464,5.428488,67,91.130628,5.321808,77,70.620636,5.818632 144 | 100,512,12.9088896,89.5542024,4.69392,1.79832,-0.024384,5.50164,0.03048,0.21336,2,4,84,0.41148,8.8952832,90.25394085,1,3,5,86,100.7662704,4.2672,90,79.35468,5.355336,67,91.6814016,5.507736,77,71.2024992,5.818632 145 | 100,513,12.9064512,90.1092432,4.69392,1.79832,-0.024384,5.550408,2.17E-13,0.48768,2,4,84,0.50292,8.9455752,90.25170966,1,3,5,86,101.1929904,4.2672,90,79.8679632,5.132832,67,92.2483296,5.66928,77,71.7846672,5.82168 146 | 100,514,12.9085848,90.6591024,4.69392,1.79832,0.021336,5.498592,0.4572,-0.51816,2,4,84,0.64008,9.0095832,89.77767825,1,3,5,86,101.6197104,4.2672,90,80.331564,4.636008,67,92.8036752,5.553456,77,72.3665304,5.818632 147 | 100,515,12.9012696,91.1882352,4.69392,1.79832,-0.073152,5.291328,-0.94488,-2.07264,2,4,84,0.877824,9.0973656,90.79205709,1,3,5,86,102.0473448,4.276344,90,80.7518832,4.203192,67,93.325188,5.215128,77,72.9486984,5.82168 148 | 100,516,12.8750568,91.6871928,4.69392,1.79832,-0.262128,4.989576,-1.88976,-3.01752,2,4,84,1.118616,9.2092272,93.00727635,1,3,5,86,102.4731504,4.258056,90,81.1292256,3.773424,67,93.8268888,5.017008,77,73.5305616,5.818632 149 | 100,517,12.841224,92.1639,4.69392,1.79832,-0.338328,4.767072,-0.762,-2.22504,2,4,84,1.164336,9.3256608,94.05958153,1,3,5,86,102.895908,4.227576,90,81.4510944,3.218688,67,94.3304184,5.035296,77,74.1124248,5.818632 150 | 100,518,12.8147064,92.6479224,4.69392,1.79832,-0.265176,4.840224,0.73152,0.73152,2,4,84,0.86868,9.4125288,93.13586559,1,3,5,86,103.3174464,4.215384,90,81.764124,3.130296,67,94.8586368,5.282184,77,74.6945928,5.82168 151 | 100,519,12.8083056,93.1389552,4.69392,1.79832,-0.064008,4.910328,2.01168,0.70104,2,4,84,0.74676,9.4872048,90.74683006,1,3,5,86,103.7398992,4.224528,90,82.0930032,3.288792,67,95.4020952,5.434584,77,75.276456,5.818632 152 | --------------------------------------------------------------------------------