신호생성 repo (24. 1. 5 ~).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

5111 lines
259 KiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import pandas as pd\n",
"\n",
"import sys\n",
"from datetime import datetime\n",
"sys.path.append('../../Scripts')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"표준테이블 목록\n",
"|순번|테이블명|설명|획득방법|\n",
"|:-:|:-:|:-:|:-:|\n",
"|1|교차로번호 |각 교차로의 이름, 위치|DB|\n",
"|2|방위각정보 |각 교차로의 (현시, 링)별 진입·진출 방위각|DB|\n",
"|3|이동류번호 |각 교차로의 (현시, 링)별 이동류번호|DB|\n",
"|4|신호계획 |각 교차로의 신호계획|DB|\n",
"|5|신호이력 |각 교차로의 (현시, 링)별 현시시간|DB|\n",
"|6|교차로-노드 매칭 |교차로번호와 노드ID를 매칭정보 및 parent/child 여부|수작업|\n",
"|7|유턴교차로정보 |각 유턴교차로별 부모교차로, 방향, 유턴옵션|수작업|\n",
"|8|연동교차로정보 |각 연동교차로별 부모교차로, (현시, 링)별 진입진출ID|수작업|\n",
"|9|NEMA 정보 |NEMA에서 정의한 이동류번호에 대한 진입·진출 방향|수작업|\n",
"|10|<미정> |(현시, 링)별로 이동류번호가 두 개 이상 부여된 경우에 대비한 테이블|수작업|"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"스크립트 목록\n",
"|스크립트명|`preprocess_daily.py`|`generate_signal.py`|\n",
"|:-:|:-:|:-:|\n",
"|실행주기|매일|매5분|\n",
"|목적|신호생성에 사용되는 중간산출물 생성|실시간 신호파일 생성|\n",
"|산출물목록|`match.csv`<br>`match6.csv`<br>`matching.csv`<br>`node2num_cycles.json`|`sn_[timestamp].add.xml`|"
]
},
{
"attachments": {
"image.png": {
"image/png": "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yY933r0sbti+rXJz3569jn2iRWwYDqvhMDcJw3MsHfvMfcJxPjasp+1iSdM21Jb6B1MDN7FvMvo8cbjYsCWWZCayh+E2CFV5onpKePyqCBEQAREQARFoLQGJJRU77XHBZPO2BUWV1MC8tXekGl4JgbY4SmpnsqjTFrGkDYJGlW0cFVki20627WFcXjo2cLsffm7sMJmk/CzNzLLMTNzKyjZFVhyq5IGsQkVABERABESgJQSCEktu+d9/4a74m3s6/fn6f3dvp6/P+o++jAtFdX5vyf2nZtZEIMmh0LFszluTvCSWXFiOWKlS7ChatsSS8u6pbXsn3Tsnhk+8mnQ/IowgkCCUIJgkpcl6rKZHtKoRAREQAREQgSAJBCWW4GgX/bGm/GH8qKYv6xRH4nUFebepUY0RyOogKH15Tl8ZLCWWhPFcH/d+lVhSzn3z4el59917nkkldjC0hiE2trINQ2/KuOesjMYe2qpYBERABERABAIgILHk9+34ETruR2po5yWWBHB3qwnLBOyHv7blOHN1c5RY0o73lMSScu6vhx474pi7ZNR9xiStTNZqK9swge6o9HnPLT9EtSMCIiACIiACPSQgsURiSSXRPBJLevg0CfiS8zoKyleO81eUo8QSiSVFbahN+UdN7MpqQrayDcsAV726UMCPdTVNBERABERABConILFEYonEkspvM1XQNIE2OUpq62qBRmKJxJK+3xdEjmy9cxANt9n1wCDXyjZ5GDb97Fb9IiACIiACItAkAYklEkskljR5B6ruWgjkcRKUZ7Vo0RQTiSUSS5qyvabrPTo56zZsW1rZhrlJiqxsk+daanlAqxIREAEREAERCJSAxBKJJRJLAr051azyCORxEpQnILHkhs86BJMufe68+rpOXU/UNzd8tpJ5M/p4L7KyzfqbpqMP+00xKO8prJJEQAREQAREoH0EJJZILJFY0r77Vi3OSKApR0P1hiO4hNYXn9twpDEHODQWas/SfULUyMO/nImW/yWahKiSptlkfNQquQiIgAiIgAh0ikBvxZJfPXpwqEhwZGrgJn74IzcqTdOrz5w5+2aq9qVNV/b1aILXTj0nWn8xTTscql+iSdwGJJbIJswmWP6XeUhs+d+qVrax+rJsW//w1wWIgAiIgAiIQAECvRVLtmz5XqJY8psTr7ivfu1yNzM372697Xb3+KGnEtOVLS5kLY92DrsGv6y33l50z7+wUPs1SCwpcFcqa+kEsjgHSisntg4bkFgiO2MlG1a0seV/q17ZJo9dl/4wVoEiIAIiIAIi0CICrRdLLHJi1z273S8OPLIsCiAmEB3iix12DCHEhIaTr55xP95593I6yiMdggN5OZdUhx0jHfuHn3l2Rbr79uyNvtMGIlV8AcPftzaRn+NcAwKHlWvRLfF0fB92DX75fjupg/ZYXaSzco2TpY/z9MtMsy+xpEVPgR40NY+ToDxyZqu0AYkl/bWv145fXP535/0Dt3jiWOPDbYbZeg9eD7pEERABERABERhKoPViCc7+F76wNooEQQh4YN9+hwBy5VVXRxEVd2z/gUO44NgVV3wz2iIEIDRw7Evr10fpEEU47gsBlIGwklSHL1aY4MB2zZo1UXlEpVAfUR3XbdwUCSd+2exbO60sRAzEEtrLebaIJUnpLM+4a7B01g6+0x4EGSuXc8aJ83Ge8Xan+f5//4//4nbt+q17/+gF9+n8H2v/DLV4neglgWGOgI7312Ftuu8llvTP9uan5tzmiaPRcBtWtmH4TdN2OK7+Xr4wdNEiIAIiIAIi8FcCnRBLLMICp98EE4vIwLFHtOC7iRAcIw/HOEcexAKG35gQwDETT0xw4JzV4R9jn/RsEUlIh/Bh9bH1ozmsDoQdPvadLSIGIg37bPmelM7qH3UNlGHpiBjhWmkf18A5yo1zsvSct2tlP+vnK/92r9u8bcGtueZoI6KJ7nAR8AmMcwh0vn+Oa9N9LrGkPzY3+fSsu/zWpeV/Wdmm7uV/i9i6/xzVvgiIgAiIgAj0jUCnxBIcfUQLojNMhEBsQCRgmImJHxwzscQEDY75IgLlmEDgCwhWB1EZRGiQxo7ZlmOII9YGtkliiR9FQnl8yIuggYiBgMP3pHTWJtIlXQP5+Fg6tggmbC3qJomTpbe8PgcrM83WhuG8dvhdd8vEiUg0mdj5iluceq+WKJO+3ci63tEEijgLytsfp7bOvpZY0n27Qhi59IapSChBMKnTvsqqa/STVWdFQAREQAREoNsEOimWIHwQJYJAgSiCKGDHEBcQI2woCukQUkhHej4MQ0Ek4IPQMUxAQIShbMojLelMXKCccWKJtYm0tMPEEkSbz3/+81F5CBNJ6axNds6/BvKYMGTpmDfFrtHqsrzUb5wsPWX415NGIPHTmFhiQ3DOTb4XiSaXfHva1SGadPu21dVlJVCW46Byuu/g1tXHiCUT+yajz8afHHavHp8Z60y/sTDrPjw972w7rq2UPy6NnY+nveuhZ6O8/vGHHjsS1W15tF19PzC0hiE2trINQ2/azCnrs1bpRUAEREAERKBLBFovluDwW0QI+zj4OO1EUSAC2DmOIUZwjDTMReKnM6HC0pCOD+mG1cFxK48y4/X7ZdIeX0ywfavP0nKccixqZVg6v012rX4ZNqks7UIIoRz2aa+fzvIaJ79c/3qsHWm3cbHEF00QSxies+3OEw4Rxc6Vue3STaprKU6gzc6K2r7aIe0CEz+y5Lv3PJPoUF84OecGUwPHFpEEUeVXh6ai7ROHp6Pjdh4mpOH7OyeWHHSEjpeODRIFjnFpEWQokzKsHbsffi4qi3PPzwyW67O0bIfV14U+G3UNTNLKZK22sg2TuI5K35ZzxZ++KkEEREAEREAE2kug9WJJWuc9hHREmljECluEi6R2MazGn0skKU3aYzd+/6blCJe0ecpIN0wsMUGE4TiIJkSaMEynbNGkvbekWl4FgbY4JmpnN4WRpH41sQRhw4/e8NMS3YH4sW3vZKJY4p8n3833PROlR1Th+5U7n3aIKogxCB5+2ePSWpvYkp92UC6CyDd2PBWVSxmTz05Hx7kO6rPviDF+fV3dZ7nfbbuWRBKWAQ5x+d8i7Kt4HqtMERABERABEWgLAYklOSYvLUNM6HoZ48QSXzTZ+ZOTUaQJoglznNi5Itu23IBqZz0EijgLytsPp7fufjaxBCHEIkHibSCS4+ePPheJEZxDuECssG38fDxChbLJlzR8ZlxaXyyxfQQT6rdyEU04h2hCRIkdt/bFr6dL30/Ozbmtdw6i4Ta7Hhi0YmWbPPzreUKrFhEQAREQAREIk4DEEoklidEtRcWctGKJCSIsMcxSwwzPYRWdk4cWC4kmYd5ualVTBPI4CcojkaRKG0AsIfrCFy3i85ZwjogQIjZoC+IIaWwbP893yvRFC/INE0tGpTWBhC0RJaRFFDGxhnKtfrZ+hEyXxZKjk7Nuw7allW0e/uVMq1a2yWPPTT2zVa8IiIAIiIAIhEBAYonEkiDEEl802XPvKbf2uplINFl4/J1cokkIN5faEA6BPE6C8kgsqdIGTCxBfLB6GDJj+2yJ1vCFDoQTIk1sGz+PYOGnt7I5zofIEPtwblhahBHLy5a81ItQQ912ztphIo8dZ0sZ/rW0ff/QEzNu/U3T0YdVbtp+PWnbH85TXC0RAREQAREQgfoJSCyRWBKUWGKiyUdz77t9e05HosmGW467+YNvZxJN6r+VVGPIBNI6BkrXLQc35P60YTh1tRFhw4QStl0TM6rg+NHpeUf0yLot01E0CVElVdQTcpkhP9fVNhEQAREQARGomoDEEoklQYolcdFk3eZZl0U0qfrGUfntIhCyM6K29VOgqVsskZ2ltzOW/2UeEpb/ZV4S5ifpK792PenVWhEQAREQAREol4DEEoklQYslJpqwPbjvrEM0Wb/1mJt8+I2RkSbl3iYqre0E+uro6LrTO8h1s5JYEl7fsPwvK9rY8r9dW9kmj423/dmv9ouACIiACIhAEQJBiSXXfGaPY2JQfdrPgL70hY4y9xFNLt0yN1I0KXJTKG/3CORxEpQnPGe2S30isSQc+3rt+DF3y11LIsnO+wcO0aRLtlbkWrr3NtAViYAIiIAIiEB6AkGJJWU61Crrj5WJFaGwJbqEKBOEEwQUv13pbwGl7AOBIs6C8obj1HapLySWNG9X81NzbvPE0Wi4zb4DM51d/rfIfdOH94OuUQREQAREQASGEZBYMt99UcEXEbq4b6IJQ3RMNBlm8DreTwJFnAXlbd6p7WIfSCxpzq4mn551l9+6tPxvn1a2yXMf9fONoasWAREQAREQgSUCEksklqyIyGizmMKKOUwCi2jy4OQ598mnf9F9LgIRgTxOgvI058x2kT0OOgLJsA/nu3jdIV0TwsilN0xFQol4p7u/9QoRAREQAREQgT4TkFgisaQzYokJPYgm39qx4NZeL9Gkzw83/9pDctjUlnROWhc5rb9pOlEs4XgXrzeEa2JlG4bYsLINQ24YehNCu9rSBv85qn0REAEREAER6BsBiSUSSzonliCa8HfqrQ/d9T99ORJN9j75pvvTx5/27f7W9f6VQFscE7Wz20LKsOgSRTmU3+9M0spkrbayDZO46v7KzlkvEREQAREQARHoMwGJJRJLOiuW2I1tosmajQO3+7HXJZoYmB5t5SRld5LErBpm8egSRZWUy5nlfrftWhJJWAZYy/8W49uj14QuVQREQAREQARWEZBYIrGk82KJWf0bix+72/a+6kw0Of/BJ3ZK244TkONfzGESv/L4xaNLFFVSDtuTc3Nu652DaLjNrgcGWtnmbDlcO/5q0OWJgAiIgAiIwEgCEksklvRGLLE74Xfn/xyJJpdcNe12HDjjJJoYme5u5eyX4ziJYzkcLbpEUSXFeR6dnHUbti2tbPPwL2fcR6eLlyk7v8iwu28FXZkIiIAIiIAIjCcgsURiSe/EErstEE0QS4g0Yct3/XWTgJyfi86PWDTPwqJLFFWSvy8OPTHjEJv4aPnf/BzHPQ+6+UbQVYmACIiACIhAOgISSySW9FYssVuEyBLEEiJNGKYj0cTIdGc7ziHQ+eqcLbFNZnvLXQNNOJpxqAhRI0SPrNsyHUWTEFUi+0q2r7K4dOctoCsRAREQAREQgewEJJZILOm9WGK3DaLJ3Y+ejSJNJJoYlW5sy3IcVE61jtkwvu9vX+POf+dv9QmcAf00rA+LHGf5X+YhYflf5iVhfpIi5Slv+vu4G28AXYUIiIAIiIAI5CMgsURiicSS2L3DEsOsmsPwHJYeZjUd/bWbgJyj9M5RiKwQShZ/f0GfwBnQT2XaD8v/sqINy/+ywo1Wtqn/Pm73k1+tFwEREAEREIFiBCSWSCyRWDLkHkI02fvkm27t9bMSTYYwasvhMh04lVW/wyaxpB1CUVliyWvHjzmGKSGS7Lx/4BBNdN/Vf9/BXH8iIAIiIAIi0GcCEksklkgsGfME+OTTv7gHJ89Fosm1O19yL5z6w5gcOh0aATlazThaZXGXWNIPsWR+as5tnjgaDbfZd2BGy/9mnNOlrPvNLye0Z7naIwIiIAIiIAJ1EpBYIrFEYknKO85Eky9uPea+tWNBoklKbiEk83/8a799wonEknaLJcw5Muq+Y1Wgy2+ddpfeMKWVbQIQSPy+CuH5rTaIgAiIgAiIQFMEJJZILJFYkuPue3x20SGafH37r92RhfdylKAsdRLwf/xrX2KJ5j+pRnxJGoazZ/9MNO9I0n3Hkr8IJAglWkY5zPuyzue06hIBERABERCB0AhILJFYIrGkwF1posmXbz8u0aQAx6qzJjlqOhamc5bUL4osqUbcKFs0ioslLO37uQ1H3CVXHlmed4QoE4bYsLINQ24YepPU5zoWxv1Z9bNZ5YuACIiACIhAyAQklkgskVhSwh1KdAmCCR8EFP2FRUCOVxiOV95+kFjSPrGElWuYoBWxhA+r2TBZK8eYvJVJXPPag/LVdz+H9SRXa0RABERABESgXgISSySWSCwp8Z4z0YQhOhJNSgRbsCg5V/U5V1WwDl0s2bLle6uWNb71tttXHUuK5EhKl1ReUt7QjllkyUen56PhNSaU2BbBRCvbtOteLPjoVXYREAEREAERaDUBiSUSSySWVHALs2IOk8CaaMLksPprjkAVDrzKrM/pa6NYMkrIeGDffnf4mWeHiiltF0sYXmMCib9l+I3um/rumzJYN/fUVs0iIAIiIAIi0DwBiSUSSySWVHgfmmiy9vrZaPlhiSYVwh5RdBlOg8pozskLXSy5buMm9+OddzuiRBBCEEq++rXLo+2ue3a7O7b/wN34/Zvcb068En2uvOpqhyAyMze/nO7I1CBKQ9pheUcJMCGco5+Y0NUXSPx95ikh6kT3UnsYjHis6pQIiIAIiIAIdJ6AxBKJJRJLarjNT5z9wF3/05ediSZ/+vjTGmpVFUZAzll7nLOkvgpdLEHcQAhBsLjiim+uEEsuvfQyd+bsm+75FxYcgghp/MgSE0YQUN56ezE6Tx7SJeUNQRQZ1oZXNn7Obdg2nfix+Uu06k277kV7hmorAiIgAiIgAn0kILFEYonEkhrv/FNvfRiJJms2Dtzux153Ek3qgZ/kgOtYe5y20MUSIktMQLAhNCaCIJBw3iJJSJckllh6zlsZSXmtnhC39JPuq/bcV2n6qp4ntGoRAREQAREQgTAJSCyRWCKxpIF7843Fj91te191Ek3qgZ/GKVCacJ280MUSEzd8ocPEDxuWw5AbS/eLA4+4xw89FQkslo6IFIss+dL69dG5pLwhiiTWJokl4d5DeZ9v9TyhVYsIiIAIiIAIhElAYonEEoklDd6bvzv/50g0ueSqabfjwBl3/oNPGmxNd6vO6ygoXxjOX+hiCfOVmGBg+7bKDXOQIIQwzAbBhHQMyUEkYZJXS4d4YnOZIKognCTltXpC3EosCeN+KfO51d23gq5MBERABERABMYTkFgisURiyfj7pM78JsIAACAASURBVPIUiCZ37D8VRZpINCkfd5nOg8qq3yEMXSwJUbhook0SS+q/N6p+HpX/NFaJIiACIiACItAeAhJLJJZILAnofiWyBLGE4TkM00FE0V9xAlU7FCq/WidRYsmF5ciVJkSQtHVKLKn2PmjiOVP86asSREAEREAERKC9BCKxpL3NV8tFoJsEEE3ufvSsRJOSurcJJ0N1luc4SiyRWKL7qbz7KQvLkh7BKkYEREAEREAEWklAYkkru02N7gsBVsth1RwiTW782UnHajr6y04gi3OgtM04ZaO4SyyRWDLKPnSuuns2+9NWOURABERABESgOwQklnSnL3UlHSZgosna62ejpYclmmTrbDlT1TlTdbCVWCKxpA47Ux2rnxPZnrRKLQIiIAIiIALdIiCxpFv9qavpOIFPPv2Le3DynDPR5IVTf+j4FZdzeXKCVjtBbWIisURiSZvstUttLecJrFJEQAREQAREoJ0EJJa0s9/U6p4TMNHki1uPuW/tWHASTUYbRJeclz5ei8QSiSV9tPsQrnn0k1VnRUAEREAERKDbBCSWdLt/dXU9IPD47KIz0WT25Qs9uOLslxiC06E25I9uOX/DZx2CSZc+d159XaeuJ+qbGz7rZOf57TxEdtmftsohAiIgAiIgAt0hILGkO32pK+k5ARNNvnz7cXdk4b2e01h5+SE6IWpTt5zKrP35uQ1HJCyc7bcNZLWZJtKvfJLqmwiIgAiIgAj0i4DEkn71t662BwQQShBM+Dz9/Ls9uOLxl9iEk6E65QiPsgGJJbKPUfYRyrnxT1elEAEREAEREIHuEpBY0t2+1ZX1nICJJgzRIeqkz3+hOB5qhxxkswGJJbIFs4WQt31+b+jaRUAEREAEREBiiWxABDpOgMlfmQS2z6JJyM6I2tZPp1liST/7vW33e8dfj7o8ERABERABERhJQGLJSDw6KQLdIWCiCcsOs/wwK+r05a9tDora231HWmJJ9/u4C/dxX94Ruk4REAEREAERSCIgsSSJio6JQIcJnDj7gbv+py+7PokmXXBadA3dcq4llnSrP7t6f3b4VahLEwEREAEREIGxBCSWjEWkBCLQTQKn3vpwWTTZ/djr7k8ff9rNC3VOq45o1ZHgbEBiicSSNggsnX0p6MJEQAREQAREIAUBiSUpICmJCHSZwBuLH7vb9r7q1mwcuK6KJm1wStTGfjnPEkv61d9tvb+7/O7TtYmACIiACIjAOAISS8YR0nkR6AmB353/87JosuPAGXf+g086c+VtdVTU7u461BJLutu3XbpvO/MS0IWIgAiIgAiIQA4CEktyQFMWEegyAUSTO/afiiJNuiKadMl50bV0w8mWWNKNfuz6/djld52uTQREQAREQATG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"
}
},
"cell_type": "markdown",
"metadata": {},
"source": [
"![image.png](attachment:image.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## `preprocess_daily.py`"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1. 데이터를 로드합니다.\n",
"1-1. 네트워크가 로드되었습니다.\n",
"1-2. 테이블들이 로드되었습니다.\n",
"1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.\n",
"1-4. 테이블들의 무결성 검사를 완료했습니다.\n",
"2. 중간산출물을 생성합니다.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"이동류정보 불러오는 중: 100%|██████████| 17280/17280 [00:14<00:00, 1213.47it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"2-1. 매칭 테이블들을 생성했습니다.\n",
"2-2. 비보호우회전(g)을 배정했습니다.\n",
"2-3. 직진 및 좌회전(G)을 배정했습니다.\n",
"2-2. node2num_cycles.json를 저장했습니다.\n",
"3. 이슈사항을 저장합니다.\n"
]
}
],
"source": [
"# 매일 실행하는 스크립트\n",
"from preprocess_daily import DailyPreprocessor\n",
"dp = DailyPreprocessor()\n",
"\n",
"# 1. 데이터 불러오기\n",
"dp.load_data()\n",
"# 2. 중간산출물 만들기\n",
"dp.get_intermediates()\n",
"# 3. 이슈사항 저장\n",
"dp.write_issues()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phas_A</th>\n",
" <th>phas_B</th>\n",
" <th>move_A</th>\n",
" <th>move_B</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>176</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>176</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>8</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>176</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>177</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>177</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>17</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>177</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>178</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>178</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>178</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no phas_A phas_B move_A move_B\n",
"0 175 1 1 8 4\n",
"1 175 2 2 7 3\n",
"2 175 3 3 6 1\n",
"3 175 3 4 6 2\n",
"4 175 4 4 5 2\n",
"5 176 1 1 8 4\n",
"6 176 2 2 8 3\n",
"7 176 3 3 5 18\n",
"8 177 1 1 8 4\n",
"9 177 2 2 7 3\n",
"10 177 3 3 17 18\n",
"11 177 4 4 5 1\n",
"12 178 1 1 8 4\n",
"13 178 2 2 7 3\n",
"14 178 3 3 5 2"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 2-1-1 match1 : 각 교차로마다 (A현시번호, B현시번호)를 (A이동류번호, B이동류번호)로 대응시키는 테이블입니다.\n",
"# 이러한 대응은 유일하지 않을 수 있지만(시차제), 임의의 대응 하나만 만들어놓아도 전체 프로세스에는 문제 없습니다.\n",
"dp.match1[:15]\n",
"# 이때, [표준테이블 3 : 이동류정보]를 사용합니다.\n",
"# [이동류정보] 테이블은 매 1초마다 바뀌는 테이블로서, 스크립트는 5초마다 한번씩 이 테이블을 불러옵니다.\n",
"# path_move = os.path.join(dp.path_tables, 'move')\n",
"# move = pd.read_csv(os.path.join(path_move, os.listdir(path_move)[400]), index_col=0)\n",
"# move"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>move_no</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>176</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>176</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>176</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>176</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>176</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>176</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>177</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no phase_no ring_type move_no\n",
"0 175 1 A 8\n",
"0 175 1 B 4\n",
"1 175 2 A 7\n",
"1 175 2 B 3\n",
"2 175 3 A 6\n",
"2 175 3 B 1\n",
"4 175 4 A 5\n",
"3 175 4 B 2\n",
"5 176 1 A 8\n",
"5 176 1 B 4\n",
"6 176 2 A 8\n",
"6 176 2 B 3\n",
"7 176 3 A 5\n",
"7 176 3 B 18\n",
"8 177 1 A 8"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 2-1-2 match2 : match1을 계층화합니다. (세로로 길게 늘립니다.)\n",
"dp.match2[:15]"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>move_no</th>\n",
" <th>inc_dir</th>\n",
" <th>out_dir</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>북</td>\n",
" <td>남</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>북</td>\n",
" <td>동</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>남</td>\n",
" <td>서</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>6</td>\n",
" <td>동</td>\n",
" <td>서</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>동</td>\n",
" <td>남</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>서</td>\n",
" <td>북</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" <td>서</td>\n",
" <td>동</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>176</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>176</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>북</td>\n",
" <td>남</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>176</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>176</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>남</td>\n",
" <td>서</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>176</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>서</td>\n",
" <td>북</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>176</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>18</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>177</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no phase_no ring_type move_no inc_dir out_dir\n",
"0 175 1 A 8 남 북\n",
"1 175 1 B 4 북 남\n",
"2 175 2 A 7 북 동\n",
"3 175 2 B 3 남 서\n",
"4 175 3 A 6 동 서\n",
"5 175 3 B 1 동 남\n",
"6 175 4 A 5 서 북\n",
"7 175 4 B 2 서 동\n",
"8 176 1 A 8 남 북\n",
"9 176 1 B 4 북 남\n",
"10 176 2 A 8 남 북\n",
"11 176 2 B 3 남 서\n",
"12 176 3 A 5 서 북\n",
"13 176 3 B 18 NaN NaN\n",
"14 177 1 A 8 남 북"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 2-1-3 match3 : 각 행에 진입방향, 진출방향을 부여합니다.\n",
"dp.match3[:15]\n",
"# 이때 [표준테이블 9 : NEMA 정보]를 사용합니다.\n",
"# [NEMA 정보] 테이블은 한 번 만들어두고 계속 사용하는 테이블입니다.\n",
"# dp.nema"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>move_no</th>\n",
" <th>inc_dir</th>\n",
" <th>out_dir</th>\n",
" <th>inc_angle</th>\n",
" <th>out_angle</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" <td>179</td>\n",
" <td>004</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>북</td>\n",
" <td>남</td>\n",
" <td>003</td>\n",
" <td>176</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>북</td>\n",
" <td>동</td>\n",
" <td>001</td>\n",
" <td>095</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>남</td>\n",
" <td>서</td>\n",
" <td>179</td>\n",
" <td>270</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>6</td>\n",
" <td>동</td>\n",
" <td>서</td>\n",
" <td>090</td>\n",
" <td>270</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>동</td>\n",
" <td>남</td>\n",
" <td>090</td>\n",
" <td>180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>서</td>\n",
" <td>북</td>\n",
" <td>268</td>\n",
" <td>000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" <td>서</td>\n",
" <td>동</td>\n",
" <td>270</td>\n",
" <td>090</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>176</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" <td>180</td>\n",
" <td>000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>176</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>북</td>\n",
" <td>남</td>\n",
" <td>359</td>\n",
" <td>180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>176</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" <td>180</td>\n",
" <td>000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>176</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>남</td>\n",
" <td>서</td>\n",
" <td>180</td>\n",
" <td>270</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>176</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>서</td>\n",
" <td>북</td>\n",
" <td>270</td>\n",
" <td>356</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>176</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>18</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>177</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" <td>180</td>\n",
" <td>000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle\n",
"0 175 1 A 8 남 북 179 004\n",
"1 175 1 B 4 북 남 003 176\n",
"2 175 2 A 7 북 동 001 095\n",
"3 175 2 B 3 남 서 179 270\n",
"4 175 3 A 6 동 서 090 270\n",
"5 175 3 B 1 동 남 090 180\n",
"6 175 4 A 5 서 북 268 000\n",
"7 175 4 B 2 서 동 270 090\n",
"8 176 1 A 8 남 북 180 000\n",
"9 176 1 B 4 북 남 359 180\n",
"10 176 2 A 8 남 북 180 000\n",
"11 176 2 B 3 남 서 180 270\n",
"12 176 3 A 5 서 북 270 356\n",
"13 176 3 B 18 NaN NaN NaN NaN\n",
"14 177 1 A 8 남 북 180 000"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 2-1-4 match4 : 각 행에 진입각도, 진출각도를 부여합니다.\n",
"dp.match4[:15]\n",
"# 이때 [표준테이블 2 : 방위각정보]를 사용합니다.\n",
"# [방위각정보] 테이블은 하루에 한 번씩 업데이트되는 테이블입니다.\n",
"# dp.angle"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>move_no</th>\n",
" <th>inc_dir</th>\n",
" <th>out_dir</th>\n",
" <th>inc_angle</th>\n",
" <th>out_angle</th>\n",
" <th>inc_edge</th>\n",
" <th>out_edge</th>\n",
" <th>node_id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" <td>179</td>\n",
" <td>004</td>\n",
" <td>-571542797_02</td>\n",
" <td>571500487_01</td>\n",
" <td>i0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>북</td>\n",
" <td>남</td>\n",
" <td>003</td>\n",
" <td>176</td>\n",
" <td>-571500487_01</td>\n",
" <td>571542797_02</td>\n",
" <td>i0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>북</td>\n",
" <td>동</td>\n",
" <td>001</td>\n",
" <td>095</td>\n",
" <td>-571500487_01</td>\n",
" <td>571545870_01</td>\n",
" <td>i0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>남</td>\n",
" <td>서</td>\n",
" <td>179</td>\n",
" <td>270</td>\n",
" <td>-571542797_02</td>\n",
" <td>571510153_01</td>\n",
" <td>i0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>6</td>\n",
" <td>동</td>\n",
" <td>서</td>\n",
" <td>090</td>\n",
" <td>270</td>\n",
" <td>571545870_02</td>\n",
" <td>571510153_01</td>\n",
" <td>i0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>동</td>\n",
" <td>남</td>\n",
" <td>090</td>\n",
" <td>180</td>\n",
" <td>571545870_02</td>\n",
" <td>571542797_02</td>\n",
" <td>i0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>서</td>\n",
" <td>북</td>\n",
" <td>268</td>\n",
" <td>000</td>\n",
" <td>571510153_02</td>\n",
" <td>571500487_01</td>\n",
" <td>i0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" <td>서</td>\n",
" <td>동</td>\n",
" <td>270</td>\n",
" <td>090</td>\n",
" <td>571510153_02</td>\n",
" <td>571545870_01</td>\n",
" <td>i0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>176</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" <td>180</td>\n",
" <td>000</td>\n",
" <td>-571542810_01</td>\n",
" <td>-571542797_02.99</td>\n",
" <td>i1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>176</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>북</td>\n",
" <td>남</td>\n",
" <td>359</td>\n",
" <td>180</td>\n",
" <td>571542797_02.99</td>\n",
" <td>571542810_01</td>\n",
" <td>i1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>176</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" <td>180</td>\n",
" <td>000</td>\n",
" <td>-571542810_01</td>\n",
" <td>-571542797_02.99</td>\n",
" <td>i1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>176</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>남</td>\n",
" <td>서</td>\n",
" <td>180</td>\n",
" <td>270</td>\n",
" <td>-571542810_01</td>\n",
" <td>571543469_01</td>\n",
" <td>i1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>176</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>서</td>\n",
" <td>북</td>\n",
" <td>270</td>\n",
" <td>356</td>\n",
" <td>571543469_02</td>\n",
" <td>-571542797_02.99</td>\n",
" <td>i1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>176</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>18</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>i1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>177</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" <td>180</td>\n",
" <td>000</td>\n",
" <td>-571542809_01</td>\n",
" <td>571542811_01</td>\n",
" <td>i2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>177</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>북</td>\n",
" <td>남</td>\n",
" <td>001</td>\n",
" <td>176</td>\n",
" <td>571542811_02</td>\n",
" <td>571542809_01</td>\n",
" <td>i2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>177</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>북</td>\n",
" <td>동</td>\n",
" <td>000</td>\n",
" <td>090</td>\n",
" <td>571542811_02</td>\n",
" <td>571542107_01</td>\n",
" <td>i2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>177</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>남</td>\n",
" <td>서</td>\n",
" <td>179</td>\n",
" <td>270</td>\n",
" <td>-571542809_01</td>\n",
" <td>571542809_01</td>\n",
" <td>i2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>177</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>17</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>i2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>177</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>18</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>i2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
"0 175 1 A 8 남 북 179 004 \n",
"1 175 1 B 4 북 남 003 176 \n",
"2 175 2 A 7 북 동 001 095 \n",
"3 175 2 B 3 남 서 179 270 \n",
"4 175 3 A 6 동 서 090 270 \n",
"5 175 3 B 1 동 남 090 180 \n",
"6 175 4 A 5 서 북 268 000 \n",
"7 175 4 B 2 서 동 270 090 \n",
"8 176 1 A 8 남 북 180 000 \n",
"9 176 1 B 4 북 남 359 180 \n",
"10 176 2 A 8 남 북 180 000 \n",
"11 176 2 B 3 남 서 180 270 \n",
"12 176 3 A 5 서 북 270 356 \n",
"13 176 3 B 18 NaN NaN NaN NaN \n",
"14 177 1 A 8 남 북 180 000 \n",
"15 177 1 B 4 북 남 001 176 \n",
"16 177 2 A 7 북 동 000 090 \n",
"17 177 2 B 3 남 서 179 270 \n",
"18 177 3 A 17 NaN NaN NaN NaN \n",
"19 177 3 B 18 NaN NaN NaN NaN \n",
"\n",
" inc_edge out_edge node_id \n",
"0 -571542797_02 571500487_01 i0 \n",
"1 -571500487_01 571542797_02 i0 \n",
"2 -571500487_01 571545870_01 i0 \n",
"3 -571542797_02 571510153_01 i0 \n",
"4 571545870_02 571510153_01 i0 \n",
"5 571545870_02 571542797_02 i0 \n",
"6 571510153_02 571500487_01 i0 \n",
"7 571510153_02 571545870_01 i0 \n",
"8 -571542810_01 -571542797_02.99 i1 \n",
"9 571542797_02.99 571542810_01 i1 \n",
"10 -571542810_01 -571542797_02.99 i1 \n",
"11 -571542810_01 571543469_01 i1 \n",
"12 571543469_02 -571542797_02.99 i1 \n",
"13 NaN NaN i1 \n",
"14 -571542809_01 571542811_01 i2 \n",
"15 571542811_02 571542809_01 i2 \n",
"16 571542811_02 571542107_01 i2 \n",
"17 -571542809_01 571542809_01 i2 \n",
"18 NaN NaN i2 \n",
"19 NaN NaN i2 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 2-1-5 match5 : 각 행에 진입엣지id, 진출엣지id를 부여합니다.\n",
"# 이때 네트워크 파일을 사용하며, shape와 코사인유사도(내적)을 사용하는 과정이 있습니다.\n",
"dp.match5[:20]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>node_id</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>move_no</th>\n",
" <th>state</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>grrrgrrrgGGGGrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>gGGrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>grrGgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>grrrgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>6</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>grrrgrrGgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>grrrgrrrgrrrrrgrG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>175</td>\n",
" <td>u00</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>ggggrgggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>175</td>\n",
" <td>u00</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>ggggrgggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>175</td>\n",
" <td>u00</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>ggggGgggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>175</td>\n",
" <td>u00</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>ggggrgggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>175</td>\n",
" <td>u00</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>6</td>\n",
" <td>ggggrgggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>175</td>\n",
" <td>u00</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>ggggrgggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>175</td>\n",
" <td>u00</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>ggggrgggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>175</td>\n",
" <td>u00</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" <td>ggggrgggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>grrGGGrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>gGGrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>grrGGGrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>grrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>grrrrrrgGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>18</td>\n",
" <td>grrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>rrgrGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>GGgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>17</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>18</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>rrgrGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>177</td>\n",
" <td>u20</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>ggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>177</td>\n",
" <td>u20</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>ggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>177</td>\n",
" <td>u20</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>ggGggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>177</td>\n",
" <td>u20</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>ggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>177</td>\n",
" <td>u20</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>17</td>\n",
" <td>ggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>177</td>\n",
" <td>u20</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>18</td>\n",
" <td>ggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>177</td>\n",
" <td>u20</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>ggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>177</td>\n",
" <td>u20</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>ggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>20</td>\n",
" <td>rrrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>20</td>\n",
" <td>rrrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>20</td>\n",
" <td>GGGrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>20</td>\n",
" <td>rrrGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>20</td>\n",
" <td>GGGrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>20</td>\n",
" <td>rrrGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>20</td>\n",
" <td>GGGrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>45</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>20</td>\n",
" <td>rrrGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>46</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>grrrrgrrrrgGGGrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>gGGGrgrrrrgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>grrrGgrrrrgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>grrrrgrrrrgrrrGgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>grrrrgrrrrgrrrrgrrrG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>51</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" <td>grrrrgrrrrgrrrrgGGGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>6</td>\n",
" <td>grrrrgGGGrgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>53</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>grrrrgrrrGgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>54</th>\n",
" <td>178</td>\n",
" <td>u30</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>ggggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>55</th>\n",
" <td>178</td>\n",
" <td>u30</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>ggggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56</th>\n",
" <td>178</td>\n",
" <td>u30</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>ggggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>57</th>\n",
" <td>178</td>\n",
" <td>u30</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>ggggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58</th>\n",
" <td>178</td>\n",
" <td>u30</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>ggggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>59</th>\n",
" <td>178</td>\n",
" <td>u30</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" <td>ggggrggg</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no node_id phase_no ring_type move_no state\n",
"0 175 i0 1 A 8 grrrgrrrgGGGGrgrr\n",
"1 175 i0 1 B 4 gGGrgrrrgrrrrrgrr\n",
"2 175 i0 2 A 7 grrGgrrrgrrrrrgrr\n",
"3 175 i0 2 B 3 grrrgrrrgrrrrGgrr\n",
"4 175 i0 3 A 6 grrrgGGrgrrrrrgrr\n",
"5 175 i0 3 B 1 grrrgrrGgrrrrrgrr\n",
"6 175 i0 4 A 5 grrrgrrrgrrrrrgrG\n",
"7 175 i0 4 B 2 grrrgrrrgrrrrrgGr\n",
"8 175 u00 1 A 8 ggggrgggg\n",
"9 175 u00 1 B 4 ggggrgggg\n",
"10 175 u00 2 A 7 ggggGgggg\n",
"11 175 u00 2 B 3 ggggrgggg\n",
"12 175 u00 3 A 6 ggggrgggg\n",
"13 175 u00 3 B 1 ggggrgggg\n",
"14 175 u00 4 A 5 ggggrgggg\n",
"15 175 u00 4 B 2 ggggrgggg\n",
"16 176 i1 1 A 8 grrGGGrgrr\n",
"17 176 i1 1 B 4 gGGrrrrgrr\n",
"18 176 i1 2 A 8 grrGGGrgrr\n",
"19 176 i1 2 B 3 grrrrrGgrr\n",
"20 176 i1 3 A 5 grrrrrrgGG\n",
"21 176 i1 3 B 18 grrrrrrgrr\n",
"22 177 i2 1 A 8 rrgrGGG\n",
"23 177 i2 1 B 4 GGgrrrr\n",
"24 177 i2 2 A 7 rrgrrrr\n",
"25 177 i2 2 B 3 rrgrrrr\n",
"26 177 i2 3 A 17 rrgrrrr\n",
"27 177 i2 3 B 18 rrgrrrr\n",
"28 177 i2 4 A 5 rrgrGGG\n",
"29 177 i2 4 B 1 rrgrrrr\n",
"30 177 u20 1 A 8 ggrggg\n",
"31 177 u20 1 B 4 ggrggg\n",
"32 177 u20 2 A 7 ggGggg\n",
"33 177 u20 2 B 3 ggrggg\n",
"34 177 u20 3 A 17 ggrggg\n",
"35 177 u20 3 B 18 ggrggg\n",
"36 177 u20 4 A 5 ggrggg\n",
"37 177 u20 4 B 1 ggrggg\n",
"38 178 c30 1 A 20 rrrrrr\n",
"39 178 c30 1 B 20 rrrrrr\n",
"40 178 c30 2 A 20 GGGrrr\n",
"41 178 c30 2 B 20 rrrGGG\n",
"42 178 c30 3 A 20 GGGrrr\n",
"43 178 c30 3 B 20 rrrGGG\n",
"44 178 c30 4 A 20 GGGrrr\n",
"45 178 c30 4 B 20 rrrGGG\n",
"46 178 i3 1 A 8 grrrrgrrrrgGGGrgrrrr\n",
"47 178 i3 1 B 4 gGGGrgrrrrgrrrrgrrrr\n",
"48 178 i3 2 A 7 grrrGgrrrrgrrrrgrrrr\n",
"49 178 i3 2 B 3 grrrrgrrrrgrrrGgrrrr\n",
"50 178 i3 3 A 5 grrrrgrrrrgrrrrgrrrG\n",
"51 178 i3 3 B 2 grrrrgrrrrgrrrrgGGGr\n",
"52 178 i3 4 A 6 grrrrgGGGrgrrrrgrrrr\n",
"53 178 i3 4 B 1 grrrrgrrrGgrrrrgrrrr\n",
"54 178 u30 1 A 8 ggggrggg\n",
"55 178 u30 1 B 4 ggggrggg\n",
"56 178 u30 2 A 7 ggggrggg\n",
"57 178 u30 2 B 3 ggggrggg\n",
"58 178 u30 3 A 5 ggggrggg\n",
"59 178 u30 3 B 2 ggggrggg"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 2-1-6 match6 : 부교차로(유턴교차로와 연동교차로)에도 진입엣지id, 진출엣지id를 부여합니다.\n",
"# 부교차로의 다른 컬럼들 (inter_no ~ out_angle)은 주교차로의 값을 그대로 따릅니다.\n",
"# 부교차로의 진입엣지id, 진출엣지id는 별도로 부여되지 않으면 NaN이 됩니다.\n",
"# 마지막으로 노드id(네트워크에서의 junction id)도 부여됩니다.\n",
"dp.match6[:60]\n",
"\n",
"# 이때 [표준테이블 6 : 교차로-노드 매칭]과 [표준테이블 7 : 유턴교차로정보], [표준테이블 8 : 연동교차로정보]가 사용됩니다.\n",
"# dp.inter_node\n",
"# dp.uturn\n",
"# dp.load_tables()\n",
"# dp.coord"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>node_id</th>\n",
" <th>move_no</th>\n",
" <th>state</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1</td>\n",
" <td>grrrgrrGgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>2</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>3</td>\n",
" <td>grrrgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>4</td>\n",
" <td>gGGrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>5</td>\n",
" <td>grrrgrrrgrrrrrgrG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>6</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>7</td>\n",
" <td>grrGgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>8</td>\n",
" <td>grrrgrrrgGGGGrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>21</td>\n",
" <td>grrrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>21</td>\n",
" <td>grrrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>21</td>\n",
" <td>grrrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>21</td>\n",
" <td>grrrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>175</td>\n",
" <td>u00</td>\n",
" <td>7</td>\n",
" <td>ggggGgggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>3</td>\n",
" <td>grrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>4</td>\n",
" <td>gGGrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>5</td>\n",
" <td>grrrrrrgGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>8</td>\n",
" <td>grrGGGrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>21</td>\n",
" <td>grrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>21</td>\n",
" <td>grrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>1</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>2</td>\n",
" <td>rrgGrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>3</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>4</td>\n",
" <td>GGgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>5</td>\n",
" <td>rrgrGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>6</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>7</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>8</td>\n",
" <td>rrgrGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>21</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>21</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>21</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>21</td>\n",
" <td>rrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>177</td>\n",
" <td>u20</td>\n",
" <td>7</td>\n",
" <td>ggGggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>1</td>\n",
" <td>grrrrgrrrGgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>2</td>\n",
" <td>grrrrgrrrrgrrrrgGGGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>3</td>\n",
" <td>grrrrgrrrrgrrrGgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>4</td>\n",
" <td>gGGGrgrrrrgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>5</td>\n",
" <td>grrrrgrrrrgrrrrgrrrG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>6</td>\n",
" <td>grrrrgGGGrgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>7</td>\n",
" <td>grrrGgrrrrgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>8</td>\n",
" <td>grrrrgrrrrgGGGrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>21</td>\n",
" <td>grrrrgrrrrgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>21</td>\n",
" <td>grrrrgrrrrgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>21</td>\n",
" <td>grrrrgrrrrgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>21</td>\n",
" <td>grrrrgrrrrgrrrrgrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td>178</td>\n",
" <td>u30</td>\n",
" <td>6</td>\n",
" <td>ggggGggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>45</th>\n",
" <td>178</td>\n",
" <td>u31</td>\n",
" <td>8</td>\n",
" <td>ggggGggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>46</th>\n",
" <td>178</td>\n",
" <td>u32</td>\n",
" <td>4</td>\n",
" <td>gggggggG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>1</td>\n",
" <td>grrrrrrGgrrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>2</td>\n",
" <td>grrrrrrrgrrrgGGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>3</td>\n",
" <td>grrrrrrrgrrGgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>4</td>\n",
" <td>gGGrrrrrgrrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>51</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>5</td>\n",
" <td>grrrrrrrgrrrgrrG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>6</td>\n",
" <td>grrrGGGrgrrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>53</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>7</td>\n",
" <td>grrGrrrrgrrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>54</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>8</td>\n",
" <td>grrrrrrrgGGrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>55</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>21</td>\n",
" <td>grrrrrrrgrrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>21</td>\n",
" <td>grrrrrrrgrrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>57</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>21</td>\n",
" <td>grrrrrrrgrrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>21</td>\n",
" <td>grrrrrrrgrrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>59</th>\n",
" <td>202</td>\n",
" <td>i9</td>\n",
" <td>2</td>\n",
" <td>rrGG</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no node_id move_no state\n",
"0 175 i0 1 grrrgrrGgrrrrrgrr\n",
"1 175 i0 2 grrrgrrrgrrrrrgGr\n",
"2 175 i0 3 grrrgrrrgrrrrGgrr\n",
"3 175 i0 4 gGGrgrrrgrrrrrgrr\n",
"4 175 i0 5 grrrgrrrgrrrrrgrG\n",
"5 175 i0 6 grrrgGGrgrrrrrgrr\n",
"6 175 i0 7 grrGgrrrgrrrrrgrr\n",
"7 175 i0 8 grrrgrrrgGGGGrgrr\n",
"8 175 i0 21 grrrgrrrgrrrrrgrr\n",
"9 175 i0 21 grrrgrrrgrrrrrgrr\n",
"10 175 i0 21 grrrgrrrgrrrrrgrr\n",
"11 175 i0 21 grrrgrrrgrrrrrgrr\n",
"12 175 u00 7 ggggGgggg\n",
"13 176 i1 3 grrrrrGgrr\n",
"14 176 i1 4 gGGrrrrgrr\n",
"15 176 i1 5 grrrrrrgGG\n",
"16 176 i1 8 grrGGGrgrr\n",
"17 176 i1 21 grrrrrrgrr\n",
"18 176 i1 21 grrrrrrgrr\n",
"19 177 i2 1 rrgrrrr\n",
"20 177 i2 2 rrgGrrr\n",
"21 177 i2 3 rrgrrrr\n",
"22 177 i2 4 GGgrrrr\n",
"23 177 i2 5 rrgrGGG\n",
"24 177 i2 6 rrgrrrr\n",
"25 177 i2 7 rrgrrrr\n",
"26 177 i2 8 rrgrGGG\n",
"27 177 i2 21 rrgrrrr\n",
"28 177 i2 21 rrgrrrr\n",
"29 177 i2 21 rrgrrrr\n",
"30 177 i2 21 rrgrrrr\n",
"31 177 u20 7 ggGggg\n",
"32 178 i3 1 grrrrgrrrGgrrrrgrrrr\n",
"33 178 i3 2 grrrrgrrrrgrrrrgGGGr\n",
"34 178 i3 3 grrrrgrrrrgrrrGgrrrr\n",
"35 178 i3 4 gGGGrgrrrrgrrrrgrrrr\n",
"36 178 i3 5 grrrrgrrrrgrrrrgrrrG\n",
"37 178 i3 6 grrrrgGGGrgrrrrgrrrr\n",
"38 178 i3 7 grrrGgrrrrgrrrrgrrrr\n",
"39 178 i3 8 grrrrgrrrrgGGGrgrrrr\n",
"40 178 i3 21 grrrrgrrrrgrrrrgrrrr\n",
"41 178 i3 21 grrrrgrrrrgrrrrgrrrr\n",
"42 178 i3 21 grrrrgrrrrgrrrrgrrrr\n",
"43 178 i3 21 grrrrgrrrrgrrrrgrrrr\n",
"44 178 u30 6 ggggGggg\n",
"45 178 u31 8 ggggGggg\n",
"46 178 u32 4 gggggggG\n",
"47 201 i8 1 grrrrrrGgrrrgrrr\n",
"48 201 i8 2 grrrrrrrgrrrgGGr\n",
"49 201 i8 3 grrrrrrrgrrGgrrr\n",
"50 201 i8 4 gGGrrrrrgrrrgrrr\n",
"51 201 i8 5 grrrrrrrgrrrgrrG\n",
"52 201 i8 6 grrrGGGrgrrrgrrr\n",
"53 201 i8 7 grrGrrrrgrrrgrrr\n",
"54 201 i8 8 grrrrrrrgGGrgrrr\n",
"55 201 i8 21 grrrrrrrgrrrgrrr\n",
"56 201 i8 21 grrrrrrrgrrrgrrr\n",
"57 201 i8 21 grrrrrrrgrrrgrrr\n",
"58 201 i8 21 grrrrrrrgrrrgrrr\n",
"59 202 i9 2 rrGG"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 2-1-7 matching : 부교차로(유턴교차로와 연동교차로)에도 진입엣지id, 진출엣지id를 부여합니다.\n",
"# 또한, 모든 교차로에 대하여, 가능한 모든 이동류번호에 대하여 진입엣지id, 진출엣지id를 부여합니다.\n",
"dp.matching[:60]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## `generate_signal.py`"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1. 데이터를 준비합니다.\n",
"1-1. 네트워크가 로드되었습니다.\n",
"1-2. 테이블들이 로드되었습니다.\n",
"2. 신호이력 테이블을 변환합니다.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"3. 이동류정보 테이블을 변환합니다.\n",
"4. 통합 테이블을 생성합니다.\n",
"5. 신호를 생성합니다.\n",
"6. 이슈사항을 저장합니다.\n"
]
}
],
"source": [
"# 5분마다 실행하는 스크립트\n",
"from generate_signals import SignalGenerator\n",
"sg = SignalGenerator()\n",
"\n",
"# 1. 데이터 준비\n",
"sg.prepare_data()\n",
"# 2. 신호이력 전처리\n",
"sg.process_history()\n",
"# 3. 이동류정보 전처리\n",
"sg.process_movement()\n",
"# 4. 통합테이블 생성\n",
"sg.make_histids()\n",
"# 5. 신호 생성\n",
"sg.get_signals()\n",
"# 6. 이슈사항 저장\n",
"sg.write_issues()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>start_unix</th>\n",
" <th>dura_A1</th>\n",
" <th>dura_A2</th>\n",
" <th>dura_A3</th>\n",
" <th>dura_A4</th>\n",
" <th>dura_A5</th>\n",
" <th>dura_A6</th>\n",
" <th>dura_A7</th>\n",
" <th>dura_A8</th>\n",
" <th>dura_B1</th>\n",
" <th>dura_B2</th>\n",
" <th>dura_B3</th>\n",
" <th>dura_B4</th>\n",
" <th>dura_B5</th>\n",
" <th>dura_B6</th>\n",
" <th>dura_B7</th>\n",
" <th>dura_B8</th>\n",
" <th>cycle</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1811</th>\n",
" <td>210</td>\n",
" <td>1704414440</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>28</td>\n",
" <td>58</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1812</th>\n",
" <td>202</td>\n",
" <td>1704414490</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1813</th>\n",
" <td>178</td>\n",
" <td>1704414480</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>43</td>\n",
" <td>50</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>71</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1814</th>\n",
" <td>206</td>\n",
" <td>1704414510</td>\n",
" <td>45</td>\n",
" <td>53</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>45</td>\n",
" <td>53</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1815</th>\n",
" <td>201</td>\n",
" <td>1704414520</td>\n",
" <td>33</td>\n",
" <td>36</td>\n",
" <td>25</td>\n",
" <td>58</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>33</td>\n",
" <td>36</td>\n",
" <td>25</td>\n",
" <td>58</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1816</th>\n",
" <td>175</td>\n",
" <td>1704414509</td>\n",
" <td>43</td>\n",
" <td>45</td>\n",
" <td>55</td>\n",
" <td>37</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>43</td>\n",
" <td>45</td>\n",
" <td>33</td>\n",
" <td>59</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1817</th>\n",
" <td>177</td>\n",
" <td>1704414540</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1818</th>\n",
" <td>176</td>\n",
" <td>1704414560</td>\n",
" <td>37</td>\n",
" <td>103</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>37</td>\n",
" <td>103</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1819</th>\n",
" <td>210</td>\n",
" <td>1704414619</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>28</td>\n",
" <td>58</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1820</th>\n",
" <td>202</td>\n",
" <td>1704414650</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1821</th>\n",
" <td>206</td>\n",
" <td>1704414660</td>\n",
" <td>45</td>\n",
" <td>53</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>45</td>\n",
" <td>53</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1822</th>\n",
" <td>178</td>\n",
" <td>1704414651</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>43</td>\n",
" <td>50</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>71</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1823</th>\n",
" <td>201</td>\n",
" <td>1704414690</td>\n",
" <td>33</td>\n",
" <td>36</td>\n",
" <td>25</td>\n",
" <td>58</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>33</td>\n",
" <td>36</td>\n",
" <td>25</td>\n",
" <td>58</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1824</th>\n",
" <td>175</td>\n",
" <td>1704414690</td>\n",
" <td>43</td>\n",
" <td>45</td>\n",
" <td>55</td>\n",
" <td>37</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>43</td>\n",
" <td>45</td>\n",
" <td>33</td>\n",
" <td>59</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1825</th>\n",
" <td>177</td>\n",
" <td>1704414720</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n",
"1811 210 1704414440 43 43 70 24 0 \n",
"1812 202 1704414490 46 114 0 0 0 \n",
"1813 178 1704414480 38 39 43 50 0 \n",
"1814 206 1704414510 45 53 26 26 0 \n",
"1815 201 1704414520 33 36 25 58 18 \n",
"1816 175 1704414509 43 45 55 37 0 \n",
"1817 177 1704414540 43 27 70 40 0 \n",
"1818 176 1704414560 37 103 40 0 0 \n",
"1819 210 1704414619 43 43 70 24 0 \n",
"1820 202 1704414650 46 114 0 0 0 \n",
"1821 206 1704414660 45 53 26 26 0 \n",
"1822 178 1704414651 38 39 43 50 0 \n",
"1823 201 1704414690 33 36 25 58 18 \n",
"1824 175 1704414690 43 45 55 37 0 \n",
"1825 177 1704414720 43 27 70 40 0 \n",
"\n",
" dura_A6 dura_A7 dura_A8 dura_B1 dura_B2 dura_B3 dura_B4 dura_B5 \\\n",
"1811 0 0 0 28 58 70 24 0 \n",
"1812 0 0 0 46 114 0 0 0 \n",
"1813 0 0 0 38 39 71 22 0 \n",
"1814 0 0 0 45 53 26 26 0 \n",
"1815 0 0 0 33 36 25 58 18 \n",
"1816 0 0 0 43 45 33 59 0 \n",
"1817 0 0 0 43 27 70 40 0 \n",
"1818 0 0 0 37 103 40 0 0 \n",
"1819 0 0 0 28 58 70 24 0 \n",
"1820 0 0 0 46 114 0 0 0 \n",
"1821 0 0 0 45 53 26 26 0 \n",
"1822 0 0 0 38 39 71 22 0 \n",
"1823 0 0 0 33 36 25 58 18 \n",
"1824 0 0 0 43 45 33 59 0 \n",
"1825 0 0 0 43 27 70 40 0 \n",
"\n",
" dura_B6 dura_B7 dura_B8 cycle \n",
"1811 0 0 0 180 \n",
"1812 0 0 0 160 \n",
"1813 0 0 0 170 \n",
"1814 0 0 0 150 \n",
"1815 0 0 0 170 \n",
"1816 0 0 0 180 \n",
"1817 0 0 0 180 \n",
"1818 0 0 0 180 \n",
"1819 0 0 0 180 \n",
"1820 0 0 0 160 \n",
"1821 0 0 0 150 \n",
"1822 0 0 0 170 \n",
"1823 0 0 0 170 \n",
"1824 0 0 0 180 \n",
"1825 0 0 0 180 "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"### 2. 신호이력 전처리\n",
"\n",
"# 2-1. rhistory : 현재시점 기준으로 최근 30분간의 신호이력을 불러옵니다.\n",
"# 종료유닉스였던 것을 시작유닉스로 바꿉니다.\n",
"# 나중을 위해 현재시각 + 10분의 시점에 한주기의 신호를 추가합니다.\n",
"# rhistory에 모든 교차로번호가 존재하지 않으면 해당 교차로번호에 대한 신호이력을 추가합니다. (at 최근 프로그램 시작시각)\n",
"sg.rhistory[:15]\n",
"# 이때 [표준테이블 5 : 신호이력]을 사용합니다.\n",
"# [신호이력] 테이블은 매 주기마다 업데이트되는 테이블입니다.\n",
"# sg.history"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>start_unix</th>\n",
" <th>dura_A1</th>\n",
" <th>dura_A2</th>\n",
" <th>dura_A3</th>\n",
" <th>dura_A4</th>\n",
" <th>dura_A5</th>\n",
" <th>dura_A6</th>\n",
" <th>dura_A7</th>\n",
" <th>dura_A8</th>\n",
" <th>...</th>\n",
" <th>red_A4</th>\n",
" <th>red_B4</th>\n",
" <th>red_A5</th>\n",
" <th>red_B5</th>\n",
" <th>red_A6</th>\n",
" <th>red_B6</th>\n",
" <th>red_A7</th>\n",
" <th>red_B7</th>\n",
" <th>red_A8</th>\n",
" <th>red_B8</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>210</td>\n",
" <td>1704415520</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>210</td>\n",
" <td>1704415700</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>210</td>\n",
" <td>1704416060</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>210</td>\n",
" <td>1704416240</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>210</td>\n",
" <td>1704416420</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>210</td>\n",
" <td>1704416600</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>210</td>\n",
" <td>1704416780</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>202</td>\n",
" <td>1704415610</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>202</td>\n",
" <td>1704415770</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>202</td>\n",
" <td>1704415929</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>202</td>\n",
" <td>1704416090</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>202</td>\n",
" <td>1704416250</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>202</td>\n",
" <td>1704416410</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>202</td>\n",
" <td>1704416570</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>15 rows × 54 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n",
"6 210 1704415520 43 43 70 24 0 \n",
"7 210 1704415700 43 43 70 24 0 \n",
"8 210 1704415880 43 43 70 24 0 \n",
"9 210 1704416060 43 43 70 24 0 \n",
"10 210 1704416240 43 43 70 24 0 \n",
"11 210 1704416420 43 43 70 24 0 \n",
"12 210 1704416600 43 43 70 24 0 \n",
"13 210 1704416780 43 43 70 24 0 \n",
"7 202 1704415610 46 114 0 0 0 \n",
"8 202 1704415770 46 114 0 0 0 \n",
"9 202 1704415929 46 114 0 0 0 \n",
"10 202 1704416090 46 114 0 0 0 \n",
"11 202 1704416250 46 114 0 0 0 \n",
"12 202 1704416410 46 114 0 0 0 \n",
"13 202 1704416570 46 114 0 0 0 \n",
"\n",
" dura_A6 dura_A7 dura_A8 ... red_A4 red_B4 red_A5 red_B5 red_A6 \\\n",
"6 0 0 0 ... NaN NaN NaN NaN NaN \n",
"7 0 0 0 ... NaN NaN NaN NaN NaN \n",
"8 0 0 0 ... NaN NaN NaN NaN NaN \n",
"9 0 0 0 ... NaN NaN NaN NaN NaN \n",
"10 0 0 0 ... 2.0 2.0 2.0 2.0 2.0 \n",
"11 0 0 0 ... 2.0 2.0 2.0 2.0 2.0 \n",
"12 0 0 0 ... 2.0 2.0 2.0 2.0 2.0 \n",
"13 0 0 0 ... 2.0 2.0 2.0 2.0 2.0 \n",
"7 0 0 0 ... NaN NaN NaN NaN NaN \n",
"8 0 0 0 ... NaN NaN NaN NaN NaN \n",
"9 0 0 0 ... NaN NaN NaN NaN NaN \n",
"10 0 0 0 ... NaN NaN NaN NaN NaN \n",
"11 0 0 0 ... 1.0 1.0 1.0 1.0 1.0 \n",
"12 0 0 0 ... 1.0 1.0 1.0 1.0 1.0 \n",
"13 0 0 0 ... 1.0 1.0 1.0 1.0 1.0 \n",
"\n",
" red_B6 red_A7 red_B7 red_A8 red_B8 \n",
"6 NaN NaN NaN NaN NaN \n",
"7 NaN NaN NaN NaN NaN \n",
"8 NaN NaN NaN NaN NaN \n",
"9 NaN NaN NaN NaN NaN \n",
"10 2.0 2.0 2.0 2.0 2.0 \n",
"11 2.0 2.0 2.0 2.0 2.0 \n",
"12 2.0 2.0 2.0 2.0 2.0 \n",
"13 2.0 2.0 2.0 2.0 2.0 \n",
"7 NaN NaN NaN NaN NaN \n",
"8 NaN NaN NaN NaN NaN \n",
"9 NaN NaN NaN NaN NaN \n",
"10 NaN NaN NaN NaN NaN \n",
"11 1.0 1.0 1.0 1.0 1.0 \n",
"12 1.0 1.0 1.0 1.0 1.0 \n",
"13 1.0 1.0 1.0 1.0 1.0 \n",
"\n",
"[15 rows x 54 columns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 2-2. rhists : 참값판단프로세스\n",
"# rhistory에서 각 행마다 시간차이와 현시합을 비교하여 그 차이가 5초 이내이면 참값으로 판단하고, 그렇지 않으면 거짓값으로 판단합니다.\n",
"# 만약 해당 행이 거짓값이면, 다음 과정을 진행합니다.\n",
"# 이전 행과의 차이가 주기의 두 배보다 크면 신호계획에서 현시값을 불러와 채워나갑니다. (그 차이가 주기보다 작거나 같아질때까지) <결측치 처리>\n",
"# 이전 행과의 차이가 주기의 두 배보다 크지 않으면 해당 행을 \"삭제\"하거나 일정한 비율로 \"대체\"합니다. <이상치 처리>\n",
"sg.rhists[:15]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>start_unix</th>\n",
" <th>phas_A</th>\n",
" <th>phas_B</th>\n",
" <th>duration</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>210</td>\n",
" <td>1704415520</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>210</td>\n",
" <td>1704415520</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>210</td>\n",
" <td>1704415520</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>210</td>\n",
" <td>1704415520</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>70</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>210</td>\n",
" <td>1704415520</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>210</td>\n",
" <td>1704415700</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>210</td>\n",
" <td>1704415700</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>210</td>\n",
" <td>1704415700</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>210</td>\n",
" <td>1704415700</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>70</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>210</td>\n",
" <td>1704415700</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>70</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>24</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix phas_A phas_B duration\n",
"0 210 1704415520 1 1 28\n",
"1 210 1704415520 1 2 15\n",
"2 210 1704415520 2 2 43\n",
"3 210 1704415520 3 3 70\n",
"4 210 1704415520 4 4 24\n",
"0 210 1704415700 1 1 28\n",
"1 210 1704415700 1 2 15\n",
"2 210 1704415700 2 2 43\n",
"3 210 1704415700 3 3 70\n",
"4 210 1704415700 4 4 24\n",
"0 210 1704415880 1 1 28\n",
"1 210 1704415880 1 2 15\n",
"2 210 1704415880 2 2 43\n",
"3 210 1704415880 3 3 70\n",
"4 210 1704415880 4 4 24"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 2-3. hrhists : 계층화\n",
"# rhists를 계층화된 형태로 변환합니다.\n",
"sg.hrhists[:15]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phas_A</th>\n",
" <th>phas_B</th>\n",
" <th>move_A</th>\n",
" <th>move_B</th>\n",
" <th>start_unix</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>206</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>1704412820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>206</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>17</td>\n",
" <td>18</td>\n",
" <td>1704412820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>206</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>1704412820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>206</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>17</td>\n",
" <td>18</td>\n",
" <td>1704412820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>178</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>1704412880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>178</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>1704412880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>178</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>1704412880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>178</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>1704412880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>210</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>6</td>\n",
" <td>18</td>\n",
" <td>1704412880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>210</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>1704412880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>210</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>1704412880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>210</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>1704412880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>210</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>8</td>\n",
" <td>3</td>\n",
" <td>1704412880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>177</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>1704412890</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>177</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>1704412890</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no phas_A phas_B move_A move_B start_unix\n",
"0 206 1 1 8 4 1704412820\n",
"1 206 2 2 17 18 1704412820\n",
"2 206 3 3 8 4 1704412820\n",
"3 206 4 4 17 18 1704412820\n",
"4 178 1 1 8 4 1704412880\n",
"5 178 2 2 7 3 1704412880\n",
"6 178 3 3 5 2 1704412880\n",
"7 178 4 4 6 1 1704412880\n",
"8 210 1 1 6 18 1704412880\n",
"9 210 1 2 6 2 1704412880\n",
"10 210 2 2 5 2 1704412880\n",
"11 210 3 3 7 4 1704412880\n",
"12 210 4 4 8 3 1704412880\n",
"13 177 1 1 8 4 1704412890\n",
"14 177 2 2 7 3 1704412890"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"### 3. 이동류정보 전처리\n",
"\n",
"# 3-1. movement\n",
"# 5분간의 [이동류정보] 테이블을 모아서 concat합니다.\n",
"# 이때, 신호이력에서 최근의 종료유닉스시각을 가져와서 시작유닉스시각으로 둡니다.\n",
"sg.movement[:15]\n",
"\n",
"# 이때, [표준테이블 3 : 이동류정보]를 사용합니다.\n",
"# [이동류정보] 테이블은 매 1초마다 바뀌는 테이블로서, 스크립트는 5초마다 한번씩 이 테이블을 불러옵니다.\n",
"# path_move = os.path.join(dp.path_tables, 'move')\n",
"# move = pd.read_csv(os.path.join(path_move, os.listdir(path_move)[400]), index_col=0)\n",
"# move"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phas_A</th>\n",
" <th>phas_B</th>\n",
" <th>move_A</th>\n",
" <th>move_B</th>\n",
" <th>start_unix</th>\n",
" <th>Unnamed: 0</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>206</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>1704412820</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>206</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>17</td>\n",
" <td>18</td>\n",
" <td>1704412820</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>206</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>1704412820</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>206</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>17</td>\n",
" <td>18</td>\n",
" <td>1704412820</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>178</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>1704412880</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>928</th>\n",
" <td>177</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>1704416820</td>\n",
" <td>11.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>929</th>\n",
" <td>178</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>1704416010</td>\n",
" <td>12.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>930</th>\n",
" <td>178</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>1704416010</td>\n",
" <td>13.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>931</th>\n",
" <td>178</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>1704416010</td>\n",
" <td>14.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>932</th>\n",
" <td>178</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>1704416010</td>\n",
" <td>15.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>933 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no phas_A phas_B move_A move_B start_unix Unnamed: 0\n",
"0 206 1 1 8 4 1704412820 NaN\n",
"1 206 2 2 17 18 1704412820 NaN\n",
"2 206 3 3 8 4 1704412820 NaN\n",
"3 206 4 4 17 18 1704412820 NaN\n",
"4 178 1 1 8 4 1704412880 NaN\n",
".. ... ... ... ... ... ... ...\n",
"928 177 4 4 5 1 1704416820 11.0\n",
"929 178 1 1 8 4 1704416010 12.0\n",
"930 178 2 2 7 3 1704416010 13.0\n",
"931 178 3 3 5 2 1704416010 14.0\n",
"932 178 4 4 6 1 1704416010 15.0\n",
"\n",
"[933 rows x 7 columns]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 3-2. movement_updated\n",
"# 참값판단 프로세스의 결측처리시 추가한 시작유닉스를 추가합니다.\n",
"sg.movement_updated"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>start_unix</th>\n",
" <th>phas_A</th>\n",
" <th>phas_B</th>\n",
" <th>move_A</th>\n",
" <th>move_B</th>\n",
" <th>duration</th>\n",
" <th>node_id</th>\n",
" <th>state_A</th>\n",
" <th>state_B</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>6</td>\n",
" <td>18</td>\n",
" <td>28</td>\n",
" <td>i6</td>\n",
" <td>grrrgGGGrgrrgrrr</td>\n",
" <td>grrrgrrrrgrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>15</td>\n",
" <td>i6</td>\n",
" <td>grrrgGGGrgrrgrrr</td>\n",
" <td>grrrgrrrrgrrgGGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>43</td>\n",
" <td>i6</td>\n",
" <td>grrrgrrrrgrrgrrG</td>\n",
" <td>grrrgrrrrgrrgGGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>70</td>\n",
" <td>i6</td>\n",
" <td>grrGgrrrrgrrgrrr</td>\n",
" <td>gGGrgrrrrgrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>210</td>\n",
" <td>1704415880</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>8</td>\n",
" <td>3</td>\n",
" <td>24</td>\n",
" <td>i6</td>\n",
" <td>grrrgrrrrgGGgrrr</td>\n",
" <td>grrrgrrrrgrrgrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>266</th>\n",
" <td>176</td>\n",
" <td>1704416720</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>8</td>\n",
" <td>3</td>\n",
" <td>103</td>\n",
" <td>i1</td>\n",
" <td>grrGGGrgrr</td>\n",
" <td>grrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>267</th>\n",
" <td>176</td>\n",
" <td>1704416720</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>18</td>\n",
" <td>40</td>\n",
" <td>i1</td>\n",
" <td>grrrrrrgGG</td>\n",
" <td>grrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>268</th>\n",
" <td>176</td>\n",
" <td>1704416820</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>21</td>\n",
" <td>i1</td>\n",
" <td>grrGGGrgrr</td>\n",
" <td>gGGrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>269</th>\n",
" <td>176</td>\n",
" <td>1704416820</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>8</td>\n",
" <td>3</td>\n",
" <td>57</td>\n",
" <td>i1</td>\n",
" <td>grrGGGrgrr</td>\n",
" <td>grrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>270</th>\n",
" <td>176</td>\n",
" <td>1704416820</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>18</td>\n",
" <td>22</td>\n",
" <td>i1</td>\n",
" <td>grrrrrrgGG</td>\n",
" <td>grrrrrrgrr</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>210 rows × 10 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix phas_A phas_B move_A move_B duration node_id \\\n",
"10 210 1704415880 1 1 6 18 28 i6 \n",
"11 210 1704415880 1 2 6 2 15 i6 \n",
"12 210 1704415880 2 2 5 2 43 i6 \n",
"13 210 1704415880 3 3 7 4 70 i6 \n",
"14 210 1704415880 4 4 8 3 24 i6 \n",
".. ... ... ... ... ... ... ... ... \n",
"266 176 1704416720 2 2 8 3 103 i1 \n",
"267 176 1704416720 3 3 5 18 40 i1 \n",
"268 176 1704416820 1 1 8 4 21 i1 \n",
"269 176 1704416820 2 2 8 3 57 i1 \n",
"270 176 1704416820 3 3 5 18 22 i1 \n",
"\n",
" state_A state_B \n",
"10 grrrgGGGrgrrgrrr grrrgrrrrgrrgrrr \n",
"11 grrrgGGGrgrrgrrr grrrgrrrrgrrgGGr \n",
"12 grrrgrrrrgrrgrrG grrrgrrrrgrrgGGr \n",
"13 grrGgrrrrgrrgrrr gGGrgrrrrgrrgrrr \n",
"14 grrrgrrrrgGGgrrr grrrgrrrrgrrgrrr \n",
".. ... ... \n",
"266 grrGGGrgrr grrrrrGgrr \n",
"267 grrrrrrgGG grrrrrrgrr \n",
"268 grrGGGrgrr gGGrrrrgrr \n",
"269 grrGGGrgrr grrrrrGgrr \n",
"270 grrrrrrgGG grrrrrrgrr \n",
"\n",
"[210 rows x 10 columns]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"### 4. 통합테이블 생성\n",
"# 지금까지 만들어놓은 두 테이블 hrhists와 movement_updated를 통합합니다.\n",
"# 또한, matching 테이블을 사용하여 진입엣지id와 진출엣지id를 붙입니다.\n",
"\n",
"# display(sg.hrhists)\n",
"# display(sg.movement_updated)\n",
"# display(dp.matching)\n",
"\n",
"# 4-1. histid (history with edge_ids)\n",
"sg.histid"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>node_id</th>\n",
" <th>start_unix</th>\n",
" <th>phas_A</th>\n",
" <th>phas_B</th>\n",
" <th>move_A</th>\n",
" <th>move_B</th>\n",
" <th>duration</th>\n",
" <th>state_A</th>\n",
" <th>state_B</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>1704415820</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>37</td>\n",
" <td>grrGGGrgrr</td>\n",
" <td>gGGrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>1704415820</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>8</td>\n",
" <td>3</td>\n",
" <td>103</td>\n",
" <td>grrGGGrgrr</td>\n",
" <td>grrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>1704415820</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>18</td>\n",
" <td>40</td>\n",
" <td>grrrrrrgGG</td>\n",
" <td>grrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704415840</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>38</td>\n",
" <td>rrrrrr</td>\n",
" <td>rrrrrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704415840</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>39</td>\n",
" <td>GGGrrr</td>\n",
" <td>rrrGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>401</th>\n",
" <td>178</td>\n",
" <td>u31</td>\n",
" <td>1704416820</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>17</td>\n",
" <td>ggggrggg</td>\n",
" <td>ggggrggg</td>\n",
" </tr>\n",
" <tr>\n",
" <th>402</th>\n",
" <td>178</td>\n",
" <td>u32</td>\n",
" <td>1704416820</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>29</td>\n",
" <td>gggggggr</td>\n",
" <td>gggggggG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>403</th>\n",
" <td>178</td>\n",
" <td>u32</td>\n",
" <td>1704416820</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>30</td>\n",
" <td>gggggggr</td>\n",
" <td>gggggggr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>404</th>\n",
" <td>178</td>\n",
" <td>u32</td>\n",
" <td>1704416820</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>33</td>\n",
" <td>gggggggr</td>\n",
" <td>gggggggr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>405</th>\n",
" <td>178</td>\n",
" <td>u32</td>\n",
" <td>1704416820</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>17</td>\n",
" <td>gggggggr</td>\n",
" <td>gggggggr</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>406 rows × 10 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n",
"0 176 i1 1704415820 1 1 8 4 37 \n",
"1 176 i1 1704415820 2 2 8 3 103 \n",
"2 176 i1 1704415820 3 3 5 18 40 \n",
"3 178 c30 1704415840 1 1 8 4 38 \n",
"4 178 c30 1704415840 2 2 7 3 39 \n",
".. ... ... ... ... ... ... ... ... \n",
"401 178 u31 1704416820 4 4 6 1 17 \n",
"402 178 u32 1704416820 1 1 8 4 29 \n",
"403 178 u32 1704416820 2 2 7 3 30 \n",
"404 178 u32 1704416820 3 3 5 2 33 \n",
"405 178 u32 1704416820 4 4 6 1 17 \n",
"\n",
" state_A state_B \n",
"0 grrGGGrgrr gGGrrrrgrr \n",
"1 grrGGGrgrr grrrrrGgrr \n",
"2 grrrrrrgGG grrrrrrgrr \n",
"3 rrrrrr rrrrrr \n",
"4 GGGrrr rrrGGG \n",
".. ... ... \n",
"401 ggggrggg ggggrggg \n",
"402 gggggggr gggggggG \n",
"403 gggggggr gggggggr \n",
"404 gggggggr gggggggr \n",
"405 gggggggr gggggggr \n",
"\n",
"[406 rows x 10 columns]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 4-2. histids\n",
"# 이전의 histid는 주교차로에 대한 테이블이었습니다.\n",
"# match6를 사용하여 부교차로(유턴, 연동)에 대한 행을 만듭니다.\n",
"\n",
"# sg.match6\n",
"sg.histids"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'c30': ['r', 'r', 'r', 'r', 'r', 'r'],\n",
" 'i0': ['g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r'],\n",
" 'i1': ['g', 'r', 'r', 'r', 'r', 'r', 'r', 'g', 'r', 'r'],\n",
" 'i2': ['r', 'r', 'g', 'r', 'r', 'r', 'r'],\n",
" 'i3': ['g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r'],\n",
" 'i6': ['g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r',\n",
" 'r'],\n",
" 'i7': ['r', 'r', 'r', 'g', 'g', 'r', 'r'],\n",
" 'i8': ['g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r',\n",
" 'r',\n",
" 'g',\n",
" 'r',\n",
" 'r',\n",
" 'r'],\n",
" 'i9': ['r', 'r', 'r', 'r'],\n",
" 'u00': ['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g', 'g'],\n",
" 'u20': ['g', 'g', 'r', 'g', 'g', 'g'],\n",
" 'u30': ['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g'],\n",
" 'u31': ['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g'],\n",
" 'u32': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'r'],\n",
" 'u60': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'r']}"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"### 5. 신호 생성\n",
"\n",
"# 5-1. 신호초기화\n",
"# 각 노드id에 대하여 비보호우회전신호(g)를 부여합니다.\n",
"sg.node2init"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>node_id</th>\n",
" <th>start_unix</th>\n",
" <th>phas_A</th>\n",
" <th>phas_B</th>\n",
" <th>move_A</th>\n",
" <th>move_B</th>\n",
" <th>duration</th>\n",
" <th>state_A</th>\n",
" <th>state_B</th>\n",
" <th>phase_sumo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704416010</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>38</td>\n",
" <td>rrrrrr</td>\n",
" <td>rrrrrr</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704416010</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>39</td>\n",
" <td>GGGrrr</td>\n",
" <td>rrrGGG</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704416010</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>43</td>\n",
" <td>GGGrrr</td>\n",
" <td>rrrGGG</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704416010</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>22</td>\n",
" <td>GGGrrr</td>\n",
" <td>rrrGGG</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704416180</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>38</td>\n",
" <td>rrrrrr</td>\n",
" <td>rrrrrr</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>233</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704416600</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>6</td>\n",
" <td>18</td>\n",
" <td>28</td>\n",
" <td>ggggggggr</td>\n",
" <td>ggggggggr</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>234</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704416600</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>15</td>\n",
" <td>ggggggggr</td>\n",
" <td>ggggggggr</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>235</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704416600</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>43</td>\n",
" <td>ggggggggG</td>\n",
" <td>ggggggggr</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>236</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704416600</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>70</td>\n",
" <td>ggggggggr</td>\n",
" <td>ggggggggr</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>237</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704416600</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>8</td>\n",
" <td>3</td>\n",
" <td>24</td>\n",
" <td>ggggggggr</td>\n",
" <td>ggggggggr</td>\n",
" <td>4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>238 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n",
"0 178 c30 1704416010 1 1 8 4 38 \n",
"1 178 c30 1704416010 2 2 7 3 39 \n",
"2 178 c30 1704416010 3 3 5 2 43 \n",
"3 178 c30 1704416010 4 4 6 1 22 \n",
"4 178 c30 1704416180 1 1 8 4 38 \n",
".. ... ... ... ... ... ... ... ... \n",
"233 210 u60 1704416600 1 1 6 18 28 \n",
"234 210 u60 1704416600 1 2 6 2 15 \n",
"235 210 u60 1704416600 2 2 5 2 43 \n",
"236 210 u60 1704416600 3 3 7 4 70 \n",
"237 210 u60 1704416600 4 4 8 3 24 \n",
"\n",
" state_A state_B phase_sumo \n",
"0 rrrrrr rrrrrr 0 \n",
"1 GGGrrr rrrGGG 1 \n",
"2 GGGrrr rrrGGG 2 \n",
"3 GGGrrr rrrGGG 3 \n",
"4 rrrrrr rrrrrr 0 \n",
".. ... ... ... \n",
"233 ggggggggr ggggggggr 0 \n",
"234 ggggggggr ggggggggr 1 \n",
"235 ggggggggG ggggggggr 2 \n",
"236 ggggggggr ggggggggr 3 \n",
"237 ggggggggr ggggggggr 4 \n",
"\n",
"[238 rows x 11 columns]"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 5-2. 녹색신호 부여\n",
"# 녹색신호(G)를 부여합니다.\n",
"# 각 (노드id, 시작시각, 현시번호)에 대하여 신호(state)를 부여합니다.\n",
"sg.sigtable"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'SignalGenerator' object has no attribute 'Sigtable'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[21], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# 5-3. 신호 파일의 시작 및 종료시각 설정\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m \u001b[43msg\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mSigtable\u001b[49m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'SignalGenerator' object has no attribute 'Sigtable'"
]
}
],
"source": [
"# 5-3. 신호 파일의 시작 및 종료시각 설정\n",
"sg.Sigtable"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>node_id</th>\n",
" <th>start_unix</th>\n",
" <th>phase_sumo</th>\n",
" <th>duration</th>\n",
" <th>state</th>\n",
" <th>start_dt</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>c30</td>\n",
" <td>1704418050</td>\n",
" <td>0_g</td>\n",
" <td>33</td>\n",
" <td>gGGGrgrrrrgGGGrgrrrr</td>\n",
" <td>2024-01-05 10:27:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>c30</td>\n",
" <td>1704418050</td>\n",
" <td>0_y</td>\n",
" <td>4</td>\n",
" <td>gyyyrgrrrrgyyyrgrrrr</td>\n",
" <td>2024-01-05 10:27:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>c30</td>\n",
" <td>1704418050</td>\n",
" <td>1__r</td>\n",
" <td>1</td>\n",
" <td>grrrrgrrrrgrrrrgrrrr</td>\n",
" <td>2024-01-05 10:27:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>c30</td>\n",
" <td>1704418050</td>\n",
" <td>1_g</td>\n",
" <td>34</td>\n",
" <td>grrrGgrrrrgrrrGgrrrr</td>\n",
" <td>2024-01-05 10:27:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>c30</td>\n",
" <td>1704418050</td>\n",
" <td>1_y</td>\n",
" <td>4</td>\n",
" <td>grrrygrrrrgrrrygrrrr</td>\n",
" <td>2024-01-05 10:27:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>u60</td>\n",
" <td>1704418760</td>\n",
" <td>3__r</td>\n",
" <td>1</td>\n",
" <td>grrrgrrrrgrrgrrr</td>\n",
" <td>2024-01-05 10:39:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>u60</td>\n",
" <td>1704418760</td>\n",
" <td>3_g</td>\n",
" <td>65</td>\n",
" <td>gGGGgrrrrgrrgrrr</td>\n",
" <td>2024-01-05 10:39:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>u60</td>\n",
" <td>1704418760</td>\n",
" <td>3_y</td>\n",
" <td>4</td>\n",
" <td>gyyygrrrrgrrgrrr</td>\n",
" <td>2024-01-05 10:39:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>u60</td>\n",
" <td>1704418760</td>\n",
" <td>4__r</td>\n",
" <td>1</td>\n",
" <td>grrrgrrrrgrrgrrr</td>\n",
" <td>2024-01-05 10:39:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>315</th>\n",
" <td>u60</td>\n",
" <td>1704418760</td>\n",
" <td>4_g</td>\n",
" <td>19</td>\n",
" <td>grrrgrrrrgGGgrrr</td>\n",
" <td>2024-01-05 10:39:20</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>684 rows × 6 columns</p>\n",
"</div>"
],
"text/plain": [
" node_id start_unix phase_sumo duration state \\\n",
"0 c30 1704418050 0_g 33 gGGGrgrrrrgGGGrgrrrr \n",
"1 c30 1704418050 0_y 4 gyyyrgrrrrgyyyrgrrrr \n",
"2 c30 1704418050 1__r 1 grrrrgrrrrgrrrrgrrrr \n",
"0 c30 1704418050 1_g 34 grrrGgrrrrgrrrGgrrrr \n",
"1 c30 1704418050 1_y 4 grrrygrrrrgrrrygrrrr \n",
".. ... ... ... ... ... \n",
"2 u60 1704418760 3__r 1 grrrgrrrrgrrgrrr \n",
"0 u60 1704418760 3_g 65 gGGGgrrrrgrrgrrr \n",
"1 u60 1704418760 3_y 4 gyyygrrrrgrrgrrr \n",
"2 u60 1704418760 4__r 1 grrrgrrrrgrrgrrr \n",
"315 u60 1704418760 4_g 19 grrrgrrrrgGGgrrr \n",
"\n",
" start_dt \n",
"0 2024-01-05 10:27:30 \n",
"1 2024-01-05 10:27:30 \n",
"2 2024-01-05 10:27:30 \n",
"0 2024-01-05 10:27:30 \n",
"1 2024-01-05 10:27:30 \n",
".. ... \n",
"2 2024-01-05 10:39:20 \n",
"0 2024-01-05 10:39:20 \n",
"1 2024-01-05 10:39:20 \n",
"2 2024-01-05 10:39:20 \n",
"315 2024-01-05 10:39:20 \n",
"\n",
"[684 rows x 6 columns]"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 5-4. 적색 및 황색신호 부여\n",
"sg.SIGTABLE"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 5-5. 신호파일 생성\n",
"# 신호파일(sn_[timestamp].add.xml)를 생성합니다."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "sts",
"language": "python",
"name": "sts"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}