In [1]:
ls


join20140303.csv                 station20140303free.csv
line20140303free.csv             stations_in_specific_line.ipynb

In [2]:
import pandas as pd

In [3]:
pd.read_csv?

pandasを利用したい。インストールする必要がある。


In [4]:
join_df = pd.read_csv('join20140303.csv')

In [5]:
join_df.head()


Out[5]:
line_cd station_cd1 station_cd2
0 1002 100201 100202
1 1002 100202 100203
2 1002 100203 100204
3 1002 100204 100205
4 1002 100205 100206

5 rows × 3 columns

pandas.read_csv()だけで、csvはいい感じに読める。


In [6]:
line_df = pd.read_csv('line20140303free.csv')

In [7]:
line_df.head()


Out[7]:
line_cd company_cd line_name line_name_k line_name_h line_color_c line_color_t line_type lon lat zoom e_status e_sort
0 1001 3 中央新幹線 チュウオウシンカンセン 中央新幹線 NaN NaN NaN 137.493896 35.411438 8 1 1001
1 1002 3 東海道新幹線 トウカイドウシンカンセン 東海道新幹線 NaN NaN NaN 137.721489 35.144122 7 0 1002
2 1003 4 山陽新幹線 サンヨウシンカンセン 山陽新幹線 NaN NaN NaN 133.147896 34.419338 7 0 1003
3 1004 2 東北新幹線 トウホクシンカンセン 東北新幹線 NaN NaN NaN 140.763192 38.274267 7 0 1004
4 1005 2 上越新幹線 ジョウエツシンカンセン 上越新幹線 NaN NaN NaN 139.121488 36.798565 8 0 1005

5 rows × 13 columns


In [8]:
station_df = pd.read_csv('station20140303free.csv')

In [9]:
station_df.head()


Out[9]:
station_cd station_g_cd station_name station_name_k station_name_r line_cd pref_cd post add lon lat open_ymd close_ymd e_status e_sort
0 1110101 1110101 函館 NaN NaN 11101 1 040-0063 北海道函館市若松町12-13 140.726413 41.773709 1902-12-10 NaN 0 1110101
1 1110102 1110102 五稜郭 NaN NaN 11101 1 041-0813 函館市亀田本町 140.733539 41.803557 NaN NaN 0 1110102
2 1110103 1110103 桔梗 NaN NaN 11101 1 041-1210 北海道函館市桔梗3丁目41-36 140.722952 41.846457 1902-12-10 NaN 0 1110103
3 1110104 1110104 大中山 NaN NaN 11101 1 041-1121 亀田郡七飯町大字大中山 140.713580 41.864641 NaN NaN 0 1110104
4 1110105 1110105 七飯 NaN NaN 11101 1 041-1111 亀田郡七飯町字本町 140.688556 41.886971 NaN NaN 0 1110105

5 rows × 15 columns


In [10]:
station_df.columns


Out[10]:
Index([u'station_cd', u'station_g_cd', u'station_name', u'station_name_k', u'station_name_r', u'line_cd', u'pref_cd', u'post', u'add', u'lon', u'lat', u'open_ymd', u'close_ymd', u'e_status', u'e_sort'], dtype='object')

In [11]:
import networkx as nx

In [12]:
nx.__version__


Out[12]:
'1.8.1'

networkxも使おう。


In [13]:
line_df['line_cd']


Out[13]:
0      1001
1      1002
2      1003
3      1004
4      1005
5      1006
6      1007
7      1008
8      1009
9      1010
10    11101
11    11102
12    11103
13    11104
14    11105
...
592    99912
593    99913
594    99914
595    99915
596    99916
597    99917
598    99918
599    99919
600    99920
601    99921
602    99922
603    99923
604    99925
605    99926
606    99927
Name: line_cd, Length: 607, dtype: int64

In [14]:
station_df[station_df['station_name'] == '東京']


Out[14]:
station_cd station_g_cd station_name station_name_k station_name_r line_cd pref_cd post add lon lat open_ymd close_ymd e_status e_sort
1259 1130101 1130101 東京 NaN NaN 11301 13 100-0005 東京都千代田区丸の内一丁目 139.766103 35.681391 NaN NaN 0 1130101
1303 1130224 1130101 東京 NaN NaN 11302 13 100-0005 東京都千代田区丸の内一丁目9-1 139.766103 35.681391 1914-12-20 NaN 0 1130224
1409 1130801 1130101 東京 NaN NaN 11308 13 100-0005 東京都千代田区丸の内一丁目 139.766103 35.681391 NaN NaN 0 1130801
1446 1131101 1130101 東京 NaN NaN 11311 13 100-0005 東京都千代田区丸の内一丁目 139.766103 35.681391 NaN NaN 0 1131101
1499 1131201 1130101 東京 NaN NaN 11312 13 100-0005 東京都千代田区丸の内一丁目 139.766103 35.681391 NaN NaN 0 1131201
1570 1131401 1130101 東京 NaN NaN 11314 13 100-0005 東京都千代田区丸の内一丁目 139.766103 35.681391 NaN NaN 0 1131401
1896 1132601 1130101 東京 NaN NaN 11326 13 - 東京都千代田区丸の内一丁目 139.766103 35.681391 NaN NaN 0 1132601
1957 1132809 1130101 東京 NaN NaN 11328 13 NaN 東京都千代田区丸の内一丁目 139.766103 35.681391 NaN NaN 0 1132809
2010 1133222 1130101 東京 NaN NaN 11332 13 NaN 東京都千代田区丸の内一丁目 139.766103 35.681391 NaN NaN 0 1133222
5884 2800209 1130101 東京 NaN NaN 28002 13 NaN 東京都千代田区丸の内一丁目 139.764708 35.681753 NaN NaN 0 2800209

10 rows × 15 columns

東京駅は路線の違いで10個有るらしい。東京駅に乗り入れている路線が10路線ある?


In [15]:
line_in_tokyo = station_df[station_df['station_name'] == '東京']['line_cd']
print line_in_tokyo


1259    11301
1303    11302
1409    11308
1446    11311
1499    11312
1570    11314
1896    11326
1957    11328
2010    11332
5884    28002
Name: line_cd, dtype: int64

In [16]:
[line_df[line_df['line_cd']==x]['line_name'] for x in line_in_tokyo]


Out[16]:
[60    JR東海道本線(東京~熱海)
 Name: line_name, dtype: object, 61    JR山手線
 Name: line_name, dtype: object, 67    JR横須賀線
 Name: line_name, dtype: object, 69    JR中央本線(東京~塩尻)
 Name: line_name, dtype: object, 70    JR中央線(快速)
 Name: line_name, dtype: object, 72    JR総武本線
 Name: line_name, dtype: object, 84    JR京葉線
 Name: line_name, dtype: object, 86    JR成田エクスプレス
 Name: line_name, dtype: object, 90    JR京浜東北線
 Name: line_name, dtype: object, 281    東京メトロ丸ノ内線
 Name: line_name, dtype: object]

In [17]:
line_df[line_df['line_name'] == '東海道新幹線'].head()


Out[17]:
line_cd company_cd line_name line_name_k line_name_h line_color_c line_color_t line_type lon lat zoom e_status e_sort
1 1002 3 東海道新幹線 トウカイドウシンカンセン 東海道新幹線 NaN NaN NaN 137.721489 35.144122 7 0 1002

1 rows × 13 columns


In [18]:
import re
re.match('hoge.*', 'hogehoge')


Out[18]:
<_sre.SRE_Match at 0x10b2c5988>

In [19]:
re.match('.*東海道.*', '東海道本線  ')


Out[19]:
<_sre.SRE_Match at 0x10b2bf308>

In [20]:
for line_name in line_df['line_name']:
    if re.match('.*東海道.*', line_name):
        print line_name


東海道新幹線
JR東海道本線(東京~熱海)
JR東海道本線(熱海~浜松)
JR東海道本線(浜松~岐阜)
JR東海道本線(岐阜~美濃赤坂・米原)

In [21]:
line_df[line_df['line_name'] == 'JR東海道本線(東京~熱海)'].head()


Out[21]:
line_cd company_cd line_name line_name_k line_name_h line_color_c line_color_t line_type lon lat zoom e_status e_sort
60 11301 2 JR東海道本線(東京~熱海) トウカイドウホンセン JR東海道本線(東京~熱海) NaN NaN NaN 139.430244 35.39508 10 0 11301

1 rows × 13 columns


In [22]:
def line_name_cd(line_name):
    matched_lines = line_df[line_df['line_name'] == line_name]['line_cd']
    if len(matched_lines) != 1:
        raise ValueError('There is no lines such as {}'.format(line_name))
    return int(matched_lines)

路線名を入力すると、その路線のIDを返す関数


In [23]:
line_name_cd('東海道新幹線')


Out[23]:
1002

In [24]:
int(line_name_cd('JR東海道本線(東京~熱海)'))


Out[24]:
11301

In [25]:
station_df[station_df['line_cd'] == line_name_cd('JR東海道本線(東京~熱海)')]


Out[25]:
station_cd station_g_cd station_name station_name_k station_name_r line_cd pref_cd post add lon lat open_ymd close_ymd e_status e_sort
1259 1130101 1130101 東京 NaN NaN 11301 13 100-0005 東京都千代田区丸の内一丁目 139.766103 35.681391 NaN NaN 0 1130101
1260 1130102 1130102 新橋 NaN NaN 11301 13 105-0004 東京都港区新橋二丁目17 139.758587 35.666195 NaN NaN 0 1130102
1261 1130103 1130103 品川 NaN NaN 11301 13 108-0074 東京都港区高輪三丁目26-27 139.738999 35.628760 NaN NaN 0 1130103
1262 1130104 1130104 川崎 NaN NaN 11301 14 210-0007 川崎市川崎区駅前本町 139.697485 35.531311 NaN NaN 0 1130104
1263 1130105 1130105 横浜 NaN NaN 11301 14 220-0011 横浜市西区高島2丁目 139.622704 35.466195 NaN NaN 0 1130105
1264 1130106 1130106 戸塚 NaN NaN 11301 14 244-0003 横浜市戸塚区戸塚町 139.534282 35.400432 NaN NaN 0 1130106
1265 1130107 1130107 大船 NaN NaN 11301 14 247-0056 鎌倉市大船1丁目 139.531127 35.353466 NaN NaN 0 1130107
1266 1130108 1130108 藤沢 NaN NaN 11301 14 251-0052 藤沢市藤沢 139.487293 35.338882 NaN NaN 0 1130108
1267 1130109 1130109 辻堂 NaN NaN 11301 14 251-0047 藤沢市辻堂 139.447106 35.336847 NaN NaN 0 1130109
1268 1130110 1130110 茅ケ崎 NaN NaN 11301 14 253-0043 神奈川県茅ヶ崎市元町1-1 139.407197 35.330741 NaN NaN 0 1130110
1269 1130111 1130111 平塚 NaN NaN 11301 14 254-0034 平塚市宝町 139.349063 35.327647 NaN NaN 0 1130111
1270 1130112 1130112 大磯 NaN NaN 11301 14 255-0004 中郡大磯町東小磯 139.313388 35.311299 NaN NaN 0 1130112
1271 1130113 1130113 二宮 NaN NaN 11301 14 259-0123 中郡二宮町二宮 139.256925 35.298644 NaN NaN 0 1130113
1272 1130114 1130114 国府津 NaN NaN 11301 14 256-0812 小田原市国府津4丁目 139.212932 35.280832 NaN NaN 0 1130114
1273 1130115 1130115 鴨宮 NaN NaN 11301 14 250-0874 小田原市鴨宮 139.180147 35.275744 NaN NaN 0 1130115
1274 1130116 1130116 小田原 NaN NaN 11301 14 250-0011 小田原市栄町1丁目 139.155772 35.256225 NaN NaN 0 1130116
1275 1130117 1130117 早川 NaN NaN 11301 14 250-0021 小田原市早川1丁目 139.145014 35.238875 NaN NaN 0 1130117
1276 1130118 1130118 根府川 NaN NaN 11301 14 250-0024 小田原市根府川 139.138504 35.202455 NaN NaN 0 1130118
1277 1130119 1130119 真鶴 NaN NaN 11301 14 259-0201 足柄下郡真鶴町真鶴 139.132148 35.156837 NaN NaN 0 1130119
1278 1130120 1130120 湯河原 NaN NaN 11301 14 259-0304 足柄下郡湯河原町宮下 139.102142 35.146178 NaN NaN 0 1130120
1279 1130121 1130121 熱海 NaN NaN 11301 22 413-0011 熱海市田原本町 139.077679 35.103573 NaN NaN 0 1130121

21 rows × 15 columns


In [26]:
def stations_in_line(line_name):
    return station_df[station_df['line_cd'] == line_name_cd('JR東海道本線(東京~熱海)')]

路線名を入力すると、その路線の駅のDataFrameを返す関数。(入力は路線IDの方がよいか?)


In [27]:
stations_in_line('JR東海道本線(東京〜熱海)')['station_name']


Out[27]:
1259     東京
1260     新橋
1261     品川
1262     川崎
1263     横浜
1264     戸塚
1265     大船
1266     藤沢
1267     辻堂
1268    茅ケ崎
1269     平塚
1270     大磯
1271     二宮
1272    国府津
1273     鴨宮
1274    小田原
1275     早川
1276    根府川
1277     真鶴
1278    湯河原
1279     熱海
Name: station_name, dtype: object

隣接している駅はstations_in_lineで隣り合っているものであろう。networkxのエッジの作り方としては、

  1. すべての路線について、駅一覧を出す
  2. 隣り合っている駅のつながりをエッジリストに加える。←駅のグローバルIDで作る。
  3. 重複が起こらないようにする。(とりあえず路線による違いは無視する)

In [ ]: