Skip to content

Instantly share code, notes, and snippets.

@hanbyul-here
Created July 4, 2019 18:13
Show Gist options
  • Save hanbyul-here/2f0964979642c879a035011e58b49a49 to your computer and use it in GitHub Desktop.
Save hanbyul-here/2f0964979642c879a035011e58b49a49 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import csv\n",
"import numpy as np\n",
"import pandas as pd\n",
"import geopandas as pg\n",
"import math\n",
"import os \n",
"import json\n",
"from shapely.geometry import Polygon\n",
"\n",
"import png\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"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>사용월</th>\n",
" <th>호선명</th>\n",
" <th>지하철역</th>\n",
" <th>04시-05시 승차인원</th>\n",
" <th>04시-05시 하차인원</th>\n",
" <th>05시-06시 승차인원</th>\n",
" <th>05시-06시 하차인원</th>\n",
" <th>06시-07시 승차인원</th>\n",
" <th>06시-07시 하차인원</th>\n",
" <th>07시-08시 승차인원</th>\n",
" <th>...</th>\n",
" <th>23시-24시 하차인원</th>\n",
" <th>00시-01시 승차인원</th>\n",
" <th>00시-01시 하차인원</th>\n",
" <th>01시-02시 승차인원</th>\n",
" <th>01시-02시 하차인원</th>\n",
" <th>02시-03시 승차인원</th>\n",
" <th>02시-03시 하차인원</th>\n",
" <th>03시-04시 승차인원</th>\n",
" <th>03시-04시 하차인원</th>\n",
" <th>작업일자</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>201905</td>\n",
" <td>중앙선</td>\n",
" <td>운길산</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>281</td>\n",
" <td>144</td>\n",
" <td>945</td>\n",
" <td>726</td>\n",
" <td>2040</td>\n",
" <td>...</td>\n",
" <td>561</td>\n",
" <td>3</td>\n",
" <td>241</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>20190603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>201905</td>\n",
" <td>3호선</td>\n",
" <td>구파발</td>\n",
" <td>115</td>\n",
" <td>6</td>\n",
" <td>11443</td>\n",
" <td>1897</td>\n",
" <td>34534</td>\n",
" <td>11878</td>\n",
" <td>100440</td>\n",
" <td>...</td>\n",
" <td>26462</td>\n",
" <td>871</td>\n",
" <td>8951</td>\n",
" <td>2</td>\n",
" <td>824</td>\n",
" <td>87</td>\n",
" <td>122</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>201905</td>\n",
" <td>2호선</td>\n",
" <td>잠실새내</td>\n",
" <td>28</td>\n",
" <td>0</td>\n",
" <td>6689</td>\n",
" <td>1178</td>\n",
" <td>20507</td>\n",
" <td>8721</td>\n",
" <td>70659</td>\n",
" <td>...</td>\n",
" <td>24442</td>\n",
" <td>4505</td>\n",
" <td>9271</td>\n",
" <td>1</td>\n",
" <td>28</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>201905</td>\n",
" <td>4호선</td>\n",
" <td>성신여대입구(돈암)</td>\n",
" <td>70</td>\n",
" <td>9</td>\n",
" <td>6951</td>\n",
" <td>2007</td>\n",
" <td>22260</td>\n",
" <td>8244</td>\n",
" <td>58018</td>\n",
" <td>...</td>\n",
" <td>30480</td>\n",
" <td>3464</td>\n",
" <td>7990</td>\n",
" <td>2</td>\n",
" <td>11</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>201905</td>\n",
" <td>1호선</td>\n",
" <td>서울역</td>\n",
" <td>1148</td>\n",
" <td>21</td>\n",
" <td>11958</td>\n",
" <td>10579</td>\n",
" <td>15684</td>\n",
" <td>61286</td>\n",
" <td>44585</td>\n",
" <td>...</td>\n",
" <td>22083</td>\n",
" <td>4127</td>\n",
" <td>7762</td>\n",
" <td>3</td>\n",
" <td>548</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 52 columns</p>\n",
"</div>"
],
"text/plain": [
" 사용월 호선명 지하철역 04시-05시 승차인원 04시-05시 하차인원 05시-06시 승차인원 \\\n",
"0 201905 중앙선 운길산 1 0 281 \n",
"1 201905 3호선 구파발 115 6 11443 \n",
"2 201905 2호선 잠실새내 28 0 6689 \n",
"3 201905 4호선 성신여대입구(돈암) 70 9 6951 \n",
"4 201905 1호선 서울역 1148 21 11958 \n",
"\n",
" 05시-06시 하차인원 06시-07시 승차인원 06시-07시 하차인원 07시-08시 승차인원 ... 23시-24시 하차인원 \\\n",
"0 144 945 726 2040 ... 561 \n",
"1 1897 34534 11878 100440 ... 26462 \n",
"2 1178 20507 8721 70659 ... 24442 \n",
"3 2007 22260 8244 58018 ... 30480 \n",
"4 10579 15684 61286 44585 ... 22083 \n",
"\n",
" 00시-01시 승차인원 00시-01시 하차인원 01시-02시 승차인원 01시-02시 하차인원 02시-03시 승차인원 \\\n",
"0 3 241 0 0 0 \n",
"1 871 8951 2 824 87 \n",
"2 4505 9271 1 28 0 \n",
"3 3464 7990 2 11 1 \n",
"4 4127 7762 3 548 0 \n",
"\n",
" 02시-03시 하차인원 03시-04시 승차인원 03시-04시 하차인원 작업일자 \n",
"0 0 0 0 20190603 \n",
"1 122 0 0 20190603 \n",
"2 0 0 0 20190603 \n",
"3 5 0 0 20190603 \n",
"4 0 0 0 20190603 \n",
"\n",
"[5 rows x 52 columns]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csvpath = './example/riders.csv'\n",
"riders = pd.read_csv(csvpath)\n",
"riders.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['사용월', '호선명', '지하철역', '04시-05시 승차인원', '04시-05시 하차인원', '05시-06시 승차인원',\n",
" '05시-06시 하차인원', '06시-07시 승차인원', '06시-07시 하차인원', '07시-08시 승차인원',\n",
" '07시-08시 하차인원', '08시-09시 승차인원', '08시-09시 하차인원', '09시-10시 승차인원',\n",
" '09시-10시 하차인원', '10시-11시 승차인원', '10시-11시 하차인원', '11시-12시 승차인원',\n",
" '11시-12시 하차인원', '12시-13시 승차인원', '12시-13시 하차인원', '13시-14시 승차인원',\n",
" '13시-14시 하차인원', '14시-15시 승차인원', '14시-15시 하차인원', '15시-16시 승차인원',\n",
" '15시-16시 하차인원', '16시-17시 승차인원', '16시-17시 하차인원', '17시-18시 승차인원',\n",
" '17시-18시 하차인원', '18시-19시 승차인원', '18시-19시 하차인원', '19시-20시 승차인원',\n",
" '19시-20시 하차인원', '20시-21시 승차인원', '20시-21시 하차인원', '21시-22시 승차인원',\n",
" '21시-22시 하차인원', '22시-23시 승차인원', '22시-23시 하차인원', '23시-24시 승차인원',\n",
" '23시-24시 하차인원', '00시-01시 승차인원', '00시-01시 하차인원', '01시-02시 승차인원',\n",
" '01시-02시 하차인원', '02시-03시 승차인원', '02시-03시 하차인원', '03시-04시 승차인원',\n",
" '03시-04시 하차인원', '작업일자'],\n",
" dtype='object')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(riders.columns)\n",
"riders.columns\n",
"\n",
"#r_riders = riders.loc[:,~riders.columns.duplicated()]\n",
"#r_riders.head(4)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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>index</th>\n",
" <th>사용월</th>\n",
" <th>호선명</th>\n",
" <th>지하철역</th>\n",
" <th>04시-05시 승차인원</th>\n",
" <th>04시-05시 하차인원</th>\n",
" <th>05시-06시 승차인원</th>\n",
" <th>05시-06시 하차인원</th>\n",
" <th>06시-07시 승차인원</th>\n",
" <th>06시-07시 하차인원</th>\n",
" <th>...</th>\n",
" <th>00시-01시 승차인원</th>\n",
" <th>00시-01시 하차인원</th>\n",
" <th>01시-02시 승차인원</th>\n",
" <th>01시-02시 하차인원</th>\n",
" <th>02시-03시 승차인원</th>\n",
" <th>02시-03시 하차인원</th>\n",
" <th>03시-04시 승차인원</th>\n",
" <th>03시-04시 하차인원</th>\n",
" <th>작업일자</th>\n",
" <th>station_name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>201905</td>\n",
" <td>2호선</td>\n",
" <td>잠실새내</td>\n",
" <td>28</td>\n",
" <td>0</td>\n",
" <td>6689</td>\n",
" <td>1178</td>\n",
" <td>20507</td>\n",
" <td>8721</td>\n",
" <td>...</td>\n",
" <td>4505</td>\n",
" <td>9271</td>\n",
" <td>1</td>\n",
" <td>28</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" <td>잠실새내</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>201905</td>\n",
" <td>2호선</td>\n",
" <td>을지로4가</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>1114</td>\n",
" <td>1021</td>\n",
" <td>1786</td>\n",
" <td>11771</td>\n",
" <td>...</td>\n",
" <td>1104</td>\n",
" <td>1222</td>\n",
" <td>0</td>\n",
" <td>14</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" <td>을지로4가</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>201905</td>\n",
" <td>2호선</td>\n",
" <td>당산</td>\n",
" <td>43</td>\n",
" <td>1</td>\n",
" <td>7788</td>\n",
" <td>5387</td>\n",
" <td>23046</td>\n",
" <td>18387</td>\n",
" <td>...</td>\n",
" <td>2148</td>\n",
" <td>8331</td>\n",
" <td>3</td>\n",
" <td>197</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" <td>당산</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>201905</td>\n",
" <td>2호선</td>\n",
" <td>용두(동대문구청)</td>\n",
" <td>29</td>\n",
" <td>1</td>\n",
" <td>1155</td>\n",
" <td>183</td>\n",
" <td>1582</td>\n",
" <td>1078</td>\n",
" <td>...</td>\n",
" <td>61</td>\n",
" <td>582</td>\n",
" <td>0</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" <td>용두</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>4 rows × 54 columns</p>\n",
"</div>"
],
"text/plain": [
" index 사용월 호선명 지하철역 04시-05시 승차인원 04시-05시 하차인원 05시-06시 승차인원 \\\n",
"0 0 201905 2호선 잠실새내 28 0 6689 \n",
"1 1 201905 2호선 을지로4가 18 0 1114 \n",
"2 2 201905 2호선 당산 43 1 7788 \n",
"3 3 201905 2호선 용두(동대문구청) 29 1 1155 \n",
"\n",
" 05시-06시 하차인원 06시-07시 승차인원 06시-07시 하차인원 ... 00시-01시 승차인원 00시-01시 하차인원 \\\n",
"0 1178 20507 8721 ... 4505 9271 \n",
"1 1021 1786 11771 ... 1104 1222 \n",
"2 5387 23046 18387 ... 2148 8331 \n",
"3 183 1582 1078 ... 61 582 \n",
"\n",
" 01시-02시 승차인원 01시-02시 하차인원 02시-03시 승차인원 02시-03시 하차인원 03시-04시 승차인원 \\\n",
"0 1 28 0 0 0 \n",
"1 0 14 0 0 0 \n",
"2 3 197 0 0 0 \n",
"3 0 9 0 0 0 \n",
"\n",
" 03시-04시 하차인원 작업일자 station_name \n",
"0 0 20190603 잠실새내 \n",
"1 0 20190603 을지로4가 \n",
"2 0 20190603 당산 \n",
"3 0 20190603 용두 \n",
"\n",
"[4 rows x 54 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"riders = riders.loc[riders['호선명'] == '2호선']\n",
"riders = riders.loc[riders['사용월'] == 201905]\n",
"#잠실새내 => 신천\n",
"riders['station_name'] = riders['지하철역'].apply(lambda x: x.split('(')[0])\n",
"riders = riders.reset_index(drop=True)\n",
"riders = riders.reset_index( col_fill=\"index\")\n",
"riders.head(4)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"url = 'example/2line.geojson'\n",
"gdf = pg.read_file(url)\n",
"\n",
"gdf['station_name'] = gdf['station_name'].apply(lambda x: '잠실새내' if x =='신천' else x) # 신천 => 잠실새내\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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>station_cd</th>\n",
" <th>station_name</th>\n",
" <th>station_fr_code</th>\n",
" <th>geometry</th>\n",
" <th>index</th>\n",
" <th>사용월</th>\n",
" <th>호선명</th>\n",
" <th>지하철역</th>\n",
" <th>04시-05시 승차인원</th>\n",
" <th>04시-05시 하차인원</th>\n",
" <th>...</th>\n",
" <th>23시-24시 하차인원</th>\n",
" <th>00시-01시 승차인원</th>\n",
" <th>00시-01시 하차인원</th>\n",
" <th>01시-02시 승차인원</th>\n",
" <th>01시-02시 하차인원</th>\n",
" <th>02시-03시 승차인원</th>\n",
" <th>02시-03시 하차인원</th>\n",
" <th>03시-04시 승차인원</th>\n",
" <th>03시-04시 하차인원</th>\n",
" <th>작업일자</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0201</td>\n",
" <td>시청</td>\n",
" <td>201</td>\n",
" <td>POINT (126.977108 37.564718)</td>\n",
" <td>19</td>\n",
" <td>201905</td>\n",
" <td>2호선</td>\n",
" <td>시청</td>\n",
" <td>109</td>\n",
" <td>2</td>\n",
" <td>...</td>\n",
" <td>6257</td>\n",
" <td>1795</td>\n",
" <td>1960</td>\n",
" <td>1</td>\n",
" <td>85</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0202</td>\n",
" <td>을지로입구</td>\n",
" <td>202</td>\n",
" <td>POINT (126.982618 37.566014)</td>\n",
" <td>45</td>\n",
" <td>201905</td>\n",
" <td>2호선</td>\n",
" <td>을지로입구</td>\n",
" <td>131</td>\n",
" <td>3</td>\n",
" <td>...</td>\n",
" <td>13655</td>\n",
" <td>4724</td>\n",
" <td>4329</td>\n",
" <td>3</td>\n",
" <td>1247</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0203</td>\n",
" <td>을지로3가</td>\n",
" <td>203</td>\n",
" <td>POINT (126.99191 37.566295)</td>\n",
" <td>13</td>\n",
" <td>201905</td>\n",
" <td>2호선</td>\n",
" <td>을지로3가</td>\n",
" <td>23</td>\n",
" <td>1</td>\n",
" <td>...</td>\n",
" <td>7055</td>\n",
" <td>4275</td>\n",
" <td>2017</td>\n",
" <td>0</td>\n",
" <td>65</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0204</td>\n",
" <td>을지로4가</td>\n",
" <td>204</td>\n",
" <td>POINT (126.998079 37.566941)</td>\n",
" <td>1</td>\n",
" <td>201905</td>\n",
" <td>2호선</td>\n",
" <td>을지로4가</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>4010</td>\n",
" <td>1104</td>\n",
" <td>1222</td>\n",
" <td>0</td>\n",
" <td>14</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0205</td>\n",
" <td>동대문역사문화공원</td>\n",
" <td>205</td>\n",
" <td>POINT (127.007896 37.565138)</td>\n",
" <td>38</td>\n",
" <td>201905</td>\n",
" <td>2호선</td>\n",
" <td>동대문역사문화공원</td>\n",
" <td>448</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>15578</td>\n",
" <td>3787</td>\n",
" <td>5733</td>\n",
" <td>1</td>\n",
" <td>58</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>20190603</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 57 columns</p>\n",
"</div>"
],
"text/plain": [
" station_cd station_name station_fr_code geometry \\\n",
"0 0201 시청 201 POINT (126.977108 37.564718) \n",
"1 0202 을지로입구 202 POINT (126.982618 37.566014) \n",
"2 0203 을지로3가 203 POINT (126.99191 37.566295) \n",
"3 0204 을지로4가 204 POINT (126.998079 37.566941) \n",
"4 0205 동대문역사문화공원 205 POINT (127.007896 37.565138) \n",
"\n",
" index 사용월 호선명 지하철역 04시-05시 승차인원 04시-05시 하차인원 ... \\\n",
"0 19 201905 2호선 시청 109 2 ... \n",
"1 45 201905 2호선 을지로입구 131 3 ... \n",
"2 13 201905 2호선 을지로3가 23 1 ... \n",
"3 1 201905 2호선 을지로4가 18 0 ... \n",
"4 38 201905 2호선 동대문역사문화공원 448 0 ... \n",
"\n",
" 23시-24시 하차인원 00시-01시 승차인원 00시-01시 하차인원 01시-02시 승차인원 01시-02시 하차인원 \\\n",
"0 6257 1795 1960 1 85 \n",
"1 13655 4724 4329 3 1247 \n",
"2 7055 4275 2017 0 65 \n",
"3 4010 1104 1222 0 14 \n",
"4 15578 3787 5733 1 58 \n",
"\n",
" 02시-03시 승차인원 02시-03시 하차인원 03시-04시 승차인원 03시-04시 하차인원 작업일자 \n",
"0 1 1 0 0 20190603 \n",
"1 0 0 0 0 20190603 \n",
"2 0 0 0 0 20190603 \n",
"3 0 0 0 0 20190603 \n",
"4 0 1 0 0 20190603 \n",
"\n",
"[5 rows x 57 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"whole = gdf.merge(riders)\n",
"#dongData['id'] = dongData['행자부행정동코드'].apply(lambda row: index_list.index(row))\n",
"\n",
"whole.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"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>station_name</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>시청</td>\n",
" <td>POINT (126.977108 37.564718)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>을지로입구</td>\n",
" <td>POINT (126.982618 37.566014)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" station_name geometry\n",
"0 시청 POINT (126.977108 37.564718)\n",
"1 을지로입구 POINT (126.982618 37.566014)"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": []
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"bitdepth = 16\n",
"max_channel_val = 2**16\n",
"val_to_assign = max_channel_val -1\n",
"max_val = val_to_assign*3\n",
"\n",
"# value is too big, need interpoltaion\n",
"def interploate(num, table_max):\n",
" return int(round(max_val * (num/table_max)))\n",
" \n",
"def get_pix_value(i_num, table_max):\n",
" num = interploate(i_num, table_max)\n",
" pix_arr = [0,0,0,val_to_assign]\n",
" quot = int(math.floor(num/max_channel_val))\n",
" rem = int(round(num%max_channel_val))\n",
" if quot == 0:\n",
" pix_arr[0] = rem\n",
" elif quot == 1:\n",
" pix_arr[0] = val_to_assign\n",
" pix_arr[1] = rem\n",
" elif quot == 2:\n",
" pix_arr[0] = val_to_assign\n",
" pix_arr[1] = val_to_assign\n",
" pix_arr[2] = rem\n",
" else:\n",
" print('*')\n",
" pix_arr = [val_to_assign, val_to_assign, val_to_assign, val_to_assign]\n",
" return pix_arr"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"on_riders = riders.filter(regex='승차')\n",
"off_riders = riders.filter(regex='하차')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"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>04시-05시 승차인원</th>\n",
" <th>05시-06시 승차인원</th>\n",
" <th>06시-07시 승차인원</th>\n",
" <th>07시-08시 승차인원</th>\n",
" <th>08시-09시 승차인원</th>\n",
" <th>09시-10시 승차인원</th>\n",
" <th>10시-11시 승차인원</th>\n",
" <th>11시-12시 승차인원</th>\n",
" <th>12시-13시 승차인원</th>\n",
" <th>13시-14시 승차인원</th>\n",
" <th>...</th>\n",
" <th>18시-19시 승차인원</th>\n",
" <th>19시-20시 승차인원</th>\n",
" <th>20시-21시 승차인원</th>\n",
" <th>21시-22시 승차인원</th>\n",
" <th>22시-23시 승차인원</th>\n",
" <th>23시-24시 승차인원</th>\n",
" <th>00시-01시 승차인원</th>\n",
" <th>01시-02시 승차인원</th>\n",
" <th>02시-03시 승차인원</th>\n",
" <th>03시-04시 승차인원</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>28</td>\n",
" <td>6689</td>\n",
" <td>20507</td>\n",
" <td>70659</td>\n",
" <td>96339</td>\n",
" <td>59855</td>\n",
" <td>40452</td>\n",
" <td>38354</td>\n",
" <td>39959</td>\n",
" <td>39746</td>\n",
" <td>...</td>\n",
" <td>51953</td>\n",
" <td>40215</td>\n",
" <td>36917</td>\n",
" <td>44789</td>\n",
" <td>40100</td>\n",
" <td>25070</td>\n",
" <td>4505</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>18</td>\n",
" <td>1114</td>\n",
" <td>1786</td>\n",
" <td>3741</td>\n",
" <td>6958</td>\n",
" <td>11328</td>\n",
" <td>14013</td>\n",
" <td>16552</td>\n",
" <td>20223</td>\n",
" <td>22510</td>\n",
" <td>...</td>\n",
" <td>67751</td>\n",
" <td>38538</td>\n",
" <td>19563</td>\n",
" <td>15243</td>\n",
" <td>10862</td>\n",
" <td>5377</td>\n",
" <td>1104</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>43</td>\n",
" <td>7788</td>\n",
" <td>23046</td>\n",
" <td>61904</td>\n",
" <td>81516</td>\n",
" <td>54681</td>\n",
" <td>38358</td>\n",
" <td>34021</td>\n",
" <td>34337</td>\n",
" <td>32997</td>\n",
" <td>...</td>\n",
" <td>77462</td>\n",
" <td>41056</td>\n",
" <td>30211</td>\n",
" <td>28224</td>\n",
" <td>24944</td>\n",
" <td>13260</td>\n",
" <td>2148</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>29</td>\n",
" <td>1155</td>\n",
" <td>1582</td>\n",
" <td>5482</td>\n",
" <td>8400</td>\n",
" <td>4048</td>\n",
" <td>3760</td>\n",
" <td>3928</td>\n",
" <td>4420</td>\n",
" <td>4659</td>\n",
" <td>...</td>\n",
" <td>7001</td>\n",
" <td>3441</td>\n",
" <td>2447</td>\n",
" <td>1975</td>\n",
" <td>1524</td>\n",
" <td>538</td>\n",
" <td>61</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>4 rows × 24 columns</p>\n",
"</div>"
],
"text/plain": [
" 04시-05시 승차인원 05시-06시 승차인원 06시-07시 승차인원 07시-08시 승차인원 08시-09시 승차인원 \\\n",
"0 28 6689 20507 70659 96339 \n",
"1 18 1114 1786 3741 6958 \n",
"2 43 7788 23046 61904 81516 \n",
"3 29 1155 1582 5482 8400 \n",
"\n",
" 09시-10시 승차인원 10시-11시 승차인원 11시-12시 승차인원 12시-13시 승차인원 13시-14시 승차인원 ... \\\n",
"0 59855 40452 38354 39959 39746 ... \n",
"1 11328 14013 16552 20223 22510 ... \n",
"2 54681 38358 34021 34337 32997 ... \n",
"3 4048 3760 3928 4420 4659 ... \n",
"\n",
" 18시-19시 승차인원 19시-20시 승차인원 20시-21시 승차인원 21시-22시 승차인원 22시-23시 승차인원 \\\n",
"0 51953 40215 36917 44789 40100 \n",
"1 67751 38538 19563 15243 10862 \n",
"2 77462 41056 30211 28224 24944 \n",
"3 7001 3441 2447 1975 1524 \n",
"\n",
" 23시-24시 승차인원 00시-01시 승차인원 01시-02시 승차인원 02시-03시 승차인원 03시-04시 승차인원 \n",
"0 25070 4505 1 0 0 \n",
"1 5377 1104 0 0 0 \n",
"2 13260 2148 3 0 0 \n",
"3 538 61 0 0 0 \n",
"\n",
"[4 rows x 24 columns]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"on_riders.head(4)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"24\n",
"50\n",
"24\n",
"50\n"
]
}
],
"source": [
"image_data_path_to_write=\"./example/subway/\"\n",
"pivot_tables = {'on':on_riders, 'off':off_riders}\n",
"for x in pivot_tables:\n",
" p_table = pivot_tables[x]\n",
" t_arr = p_table.to_numpy()\n",
"\n",
" t_val_arr = [0 for i in t_arr]\n",
"\n",
" for (i, arr) in enumerate(t_arr):\n",
" t_val_arr[i] = [0]* (len(arr)*4)\n",
" for (j, val) in enumerate(arr):\n",
" pix_val = get_pix_value(val, p_table.max().max())\n",
" t_val_arr[i][j*4] = pix_val[0]\n",
" t_val_arr[i][j*4+1] = pix_val[1]\n",
" t_val_arr[i][j*4+2] = pix_val[2]\n",
" t_val_arr[i][j*4+3] = val_to_assign\n",
" if(os.path.isdir(image_data_path_to_write) == False): \n",
" os.mkdir(image_data_path_to_write)\n",
" f = open(image_data_path_to_write+'/'+x+'.png','wb') # binary mode is important\n",
" png_h = on_riders.count().values[0]\n",
" png_w = on_riders.count(axis=1).values[0]\n",
" print(png_w)\n",
" print(png_h)\n",
" w = png.Writer(width= png_w, height=png_h, bitdepth=16, alpha = True)\n",
" w.write(f, t_val_arr)\n",
" f.close()"
]
},
{
"cell_type": "code",
"execution_count": 48,
"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>station_name</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>시청</td>\n",
" <td>POINT (126.977108 37.564718)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>을지로입구</td>\n",
" <td>POINT (126.982618 37.566014)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" station_name geometry\n",
"0 시청 POINT (126.977108 37.564718)\n",
"1 을지로입구 POINT (126.982618 37.566014)"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"distance = 0.001\n",
"def half_hex(centroid, num):\n",
" lat = centroid.x\n",
" lon = centroid.y\n",
" two_pi = math.pi*2\n",
" base = (math.pi/3.)\n",
" poly_list = [0]*4\n",
" if num ==1:\n",
" poly_list[0] = (lat + distance, lon)\n",
" poly_list[1] = (lat + distance, lon + distance)\n",
" poly_list[2] = (lat, lon + distance)\n",
" poly_list[3] = (lat, lon)\n",
" else:\n",
" poly_list[0] = (lat - distance, lon)\n",
" poly_list[1] = (lat - distance, lon + distance)\n",
" poly_list[2] = (lat, lon + distance)\n",
" poly_list[3] = (lat, lon)\n",
" return Polygon(poly_list)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/hjo/miniconda2/envs/py36/lib/python3.6/site-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" This is separate from the ipykernel package so we can avoid doing imports until\n",
"/Users/hjo/miniconda2/envs/py36/lib/python3.6/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" after removing the cwd from sys.path.\n"
]
}
],
"source": [
"to_json = whole[['station_name', 'geometry','index']]\n",
"to_json.head(2)\n",
"to_json['half_hex_1'] = to_json['geometry'].apply(half_hex, args=(0,))\n",
"to_json['half_hex_2'] = to_json['geometry'].apply(half_hex, args=(1,))"
]
},
{
"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>station_name</th>\n",
" <th>geometry</th>\n",
" <th>level_0</th>\n",
" <th>half_hex_1</th>\n",
" <th>half_hex_2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>시청</td>\n",
" <td>POINT (126.977108 37.564718)</td>\n",
" <td>19</td>\n",
" <td>POLYGON ((126.976108 37.564718, 126.976108 37....</td>\n",
" <td>POLYGON ((126.978108 37.564718, 126.978108 37....</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>을지로입구</td>\n",
" <td>POINT (126.982618 37.566014)</td>\n",
" <td>45</td>\n",
" <td>POLYGON ((126.981618 37.566014, 126.981618 37....</td>\n",
" <td>POLYGON ((126.983618 37.566014, 126.983618 37....</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>을지로3가</td>\n",
" <td>POINT (126.99191 37.566295)</td>\n",
" <td>13</td>\n",
" <td>POLYGON ((126.99091 37.566295, 126.99091 37.56...</td>\n",
" <td>POLYGON ((126.99291 37.566295, 126.99291 37.56...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>을지로4가</td>\n",
" <td>POINT (126.998079 37.566941)</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((126.997079 37.566941, 126.997079 37....</td>\n",
" <td>POLYGON ((126.999079 37.566941, 126.999079 37....</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" station_name geometry level_0 \\\n",
"0 시청 POINT (126.977108 37.564718) 19 \n",
"1 을지로입구 POINT (126.982618 37.566014) 45 \n",
"2 을지로3가 POINT (126.99191 37.566295) 13 \n",
"3 을지로4가 POINT (126.998079 37.566941) 1 \n",
"\n",
" half_hex_1 \\\n",
"0 POLYGON ((126.976108 37.564718, 126.976108 37.... \n",
"1 POLYGON ((126.981618 37.566014, 126.981618 37.... \n",
"2 POLYGON ((126.99091 37.566295, 126.99091 37.56... \n",
"3 POLYGON ((126.997079 37.566941, 126.997079 37.... \n",
"\n",
" half_hex_2 \n",
"0 POLYGON ((126.978108 37.564718, 126.978108 37.... \n",
"1 POLYGON ((126.983618 37.566014, 126.983618 37.... \n",
"2 POLYGON ((126.99291 37.566295, 126.99291 37.56... \n",
"3 POLYGON ((126.999079 37.566941, 126.999079 37.... "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"to_json.head(4)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"half_hex_1 = to_json[['station_name','index','half_hex_1']]\n",
"half_hex_2 = to_json[['station_name','index','half_hex_2']]\n",
"\n",
"half_hex_1 = half_hex_1.set_geometry('half_hex_1')\n",
"half_hex_2 = half_hex_2.set_geometry('half_hex_2')\n",
"\n",
"\n",
"half_hex_1.to_file(image_data_path_to_write+\"half_hex_1.json\", driver=\"GeoJSON\")\n",
"half_hex_2.to_file(image_data_path_to_write+\"half_hex_2.json\", driver=\"GeoJSON\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment