【小旭学长-使用python进行城市数据分析】笔记篇(下)【完结】
2021.11.13
【小旭学长-使用python进行城市数据分析】笔记篇(上):https://blog.csdn.net/wistonty11/article/details/121089882
【小旭学长-使用python进行城市数据分析】笔记篇(中):https://blog.csdn.net/wistonty11/article/details/121210664
文章目录
- 五. IC刷卡数据的基本处理
-
- 六. 可视化
- 七. 练习
- 7.1 每一条地铁线路的客流量
- 7.2 统计每小时搭乘地铁的客流量
- 7.3 统计出十个流量最大的地铁站
- 7.4 统计出十个流量最大的OD
五. IC刷卡数据的基本处理
5.1基于IC刷卡数据的
地铁OD提取
① 读取数据,添加列名
import pandas as pd
data = pd.read_csv("SPTCC-20150401-sample.csv",header = None)
data
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|
0 | 1004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠
---|
1 | 1004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠
---|
2 | 1004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠
---|
3 | 1004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠
---|
4 | 1004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠
---|
... | .....................
---|
442855 | 23011082662015-04-0123:48:212号线中山公园地铁4.0非优惠
---|
442856 | 23011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠
---|
442857 | 21041621232015-04-0123:48:072号线中山公园地铁4.0非优惠
---|
442858 | 21041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠
---|
442859 | 31038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠
442860 rows × 7 columns
data.columns = ['ID', 'date', 'Time', 'stop', 'mode', 'price', 'type']
data
| ID | date | Time | stop | mode | price | type |
---|
0 | 1004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠
---|
1 | 1004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠
---|
2 | 1004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠
---|
3 | 1004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠
---|
4 | 1004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠
---|
... | .....................
---|
442855 | 23011082662015-04-0123:48:212号线中山公园地铁4.0非优惠
---|
442856 | 23011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠
---|
442857 | 21041621232015-04-0123:48:072号线中山公园地铁4.0非优惠
---|
442858 | 21041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠
---|
442859 | 31038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠
442860 rows × 7 columns
② 帅选出地铁方式的出行,并将站点信息拆成,线路和站名
data = data[data['mode'] == '地铁']
data
| ID | date | Time | stop | mode | price | type |
---|
0 | 1004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠
---|
1 | 1004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠
---|
2 | 1004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠
---|
3 | 1004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠
---|
4 | 1004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠
---|
... | .....................
---|
442855 | 23011082662015-04-0123:48:212号线中山公园地铁4.0非优惠
---|
442856 | 23011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠
---|
442857 | 21041621232015-04-0123:48:072号线中山公园地铁4.0非优惠
---|
442858 | 21041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠
---|
442859 | 31038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠
360873 rows × 7 columns
r = data['stop'].iloc[0]
r
'11号线祁连山路'
r.find('线')
3
r[:r.find('线')+1]
'11号线'
r[r.find('线')+1:]
'祁连山路'
data['line'] = data['stop'].apply(lambda r:r[:r.find('线')+1])
data
C:ProgramDataAnaconda3envstensorflowlibsite-packagesipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a Dataframe.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
"""Entry point for launching an IPython kernel.
| ID | date | Time | stop | mode | price | type | line |
---|
0 | 1004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠11号线
---|
1 | 1004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠11号线
---|
2 | 1004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠2号线
---|
3 | 1004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠2号线
---|
4 | 1004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠11号线
---|
... | ........................
---|
442855 | 23011082662015-04-0123:48:212号线中山公园地铁4.0非优惠2号线
---|
442856 | 23011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠2号线
---|
442857 | 21041621232015-04-0123:48:072号线中山公园地铁4.0非优惠2号线
---|
442858 | 21041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠2号线
---|
442859 | 31038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠2号线
360873 rows × 8 columns
data['stop'] = data['stop'].apply(lambda r:r[r.find('线')+1:])
data
C:ProgramDataAnaconda3envstensorflowlibsite-packagesipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a Dataframe.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
"""Entry point for launching an IPython kernel.
| ID | date | Time | stop | mode | price | type | line |
---|
0 | 1004058442015-04-0112:43:24祁连山路地铁4.0非优惠11号线
---|
1 | 1004058442015-04-0118:22:04枫桥路地铁3.0非优惠11号线
---|
2 | 1004058442015-04-0108:21:18娄山关路地铁3.0非优惠2号线
---|
3 | 1004058442015-04-0112:07:31娄山关路地铁0.0非优惠2号线
---|
4 | 1004058442015-04-0118:08:42祁连山路地铁0.0非优惠11号线
---|
... | ........................
---|
442855 | 23011082662015-04-0123:48:21中山公园地铁4.0非优惠2号线
---|
442856 | 23011082662015-04-0123:06:45虹桥火车站地铁0.0非优惠2号线
---|
442857 | 21041621232015-04-0123:48:07中山公园地铁4.0非优惠2号线
---|
442858 | 21041621232015-04-0123:18:16虹桥火车站地铁0.0非优惠2号线
---|
442859 | 31038851412015-04-0123:16:19虹桥火车站地铁0.0非优惠2号线
360873 rows × 8 columns
③ 我们想用点对,所以用ID进行排序 然后用.shift让数据表错一行,让两表连接,去掉不是一个人的
data = data.sort_values(by = ['ID', 'date', 'Time'])
data['ID1'] = data["ID"].shift(-1)
data
| ID | date | Time | stop | mode | price | type | line | ID1 |
---|
334427 | 820242015-04-0108:48:25西藏北路地铁0.0非优惠8号线8.202400e+04
---|
334426 | 820242015-04-0109:07:29江湾体育场地铁4.0非优惠10号线8.895700e+04
---|
381022 | 889572015-04-0115:46:58宜山路地铁0.0非优惠3号线8.895700e+04
---|
381021 | 889572015-04-0116:20:58东宝兴路地铁4.0非优惠3号线9.931300e+04
---|
376286 | 993132015-04-0108:26:26延吉中路地铁0.0非优惠8号线9.931300e+04
---|
... | ...........................
---|
218391 | 40000390672015-04-0107:32:48颛桥地铁1.0优惠5号线4.000040e+09
---|
373585 | 40000397432015-04-0118:11:15南京西路地铁0.0非优惠2号线4.000040e+09
---|
373584 | 40000397432015-04-0118:28:44交通大学地铁3.0非优惠10号线4.000041e+09
---|
171701 | 40000406652015-04-0108:48:34上海体育场地铁0.0非优惠4号线4.000041e+09
---|
171702 | 40000406652015-04-0109:16:55南京东路地铁4.0非优惠10号线NaN
360873 rows × 9 columns
# 确实有上移 那么我们把测试的这列去掉
data = data.drop('ID1' ,axis = 1)
data
| ID | date | Time | stop | mode | price | type | line |
---|
334427 | 820242015-04-0108:48:25西藏北路地铁0.0非优惠8号线
---|
334426 | 820242015-04-0109:07:29江湾体育场地铁4.0非优惠10号线
---|
381022 | 889572015-04-0115:46:58宜山路地铁0.0非优惠3号线
---|
381021 | 889572015-04-0116:20:58东宝兴路地铁4.0非优惠3号线
---|
376286 | 993132015-04-0108:26:26延吉中路地铁0.0非优惠8号线
---|
... | ........................
---|
218391 | 40000390672015-04-0107:32:48颛桥地铁1.0优惠5号线
---|
373585 | 40000397432015-04-0118:11:15南京西路地铁0.0非优惠2号线
---|
373584 | 40000397432015-04-0118:28:44交通大学地铁3.0非优惠10号线
---|
171701 | 40000406652015-04-0108:48:34上海体育场地铁0.0非优惠4号线
---|
171702 | 40000406652015-04-0109:16:55南京东路地铁4.0非优惠10号线
360873 rows × 8 columns
# 对整行进行 *** 作,然后列名就是col
for col in data.columns:
data[col+'1'] = data[col].shift(-1)
print(col)
ID
date
Time
stop
mode
price
type
line
data
| ID | date | Time | stop | mode | price | type | line | ID1 | date1 | Time1 | stop1 | mode1 | price1 | type1 | line1 |
---|
334427 | 820242015-04-0108:48:25西藏北路地铁0.0非优惠8号线8.202400e+042015-04-0109:07:29江湾体育场地铁4.0非优惠10号线
---|
334426 | 820242015-04-0109:07:29江湾体育场地铁4.0非优惠10号线8.895700e+042015-04-0115:46:58宜山路地铁0.0非优惠3号线
---|
381022 | 889572015-04-0115:46:58宜山路地铁0.0非优惠3号线8.895700e+042015-04-0116:20:58东宝兴路地铁4.0非优惠3号线
---|
381021 | 889572015-04-0116:20:58东宝兴路地铁4.0非优惠3号线9.931300e+042015-04-0108:26:26延吉中路地铁0.0非优惠8号线
---|
376286 | 993132015-04-0108:26:26延吉中路地铁0.0非优惠8号线9.931300e+042015-04-0109:07:27打浦桥地铁4.0非优惠9号线
---|
... | ................................................
---|
218391 | 40000390672015-04-0107:32:48颛桥地铁1.0优惠5号线4.000040e+092015-04-0118:11:15南京西路地铁0.0非优惠2号线
---|
373585 | 40000397432015-04-0118:11:15南京西路地铁0.0非优惠2号线4.000040e+092015-04-0118:28:44交通大学地铁3.0非优惠10号线
---|
373584 | 40000397432015-04-0118:28:44交通大学地铁3.0非优惠10号线4.000041e+092015-04-0108:48:34上海体育场地铁0.0非优惠4号线
---|
171701 | 40000406652015-04-0108:48:34上海体育场地铁0.0非优惠4号线4.000041e+092015-04-0109:16:55南京东路地铁4.0非优惠10号线
---|
171702 | 40000406652015-04-0109:16:55南京东路地铁4.0非优惠10号线NaNNaNNaNNaNNaNNaNNaNNaN
360873 rows × 16 columns
data = data[data['ID'] == data['ID1']]
data
| ID | date | Time | stop | mode | price | type | line | ID1 | date1 | Time1 | stop1 | mode1 | price1 | type1 | line1 |
---|
334427 | 820242015-04-0108:48:25西藏北路地铁0.0非优惠8号线8.202400e+042015-04-0109:07:29江湾体育场地铁4.0非优惠10号线
---|
381022 | 889572015-04-0115:46:58宜山路地铁0.0非优惠3号线8.895700e+042015-04-0116:20:58东宝兴路地铁4.0非优惠3号线
---|
376286 | 993132015-04-0108:26:26延吉中路地铁0.0非优惠8号线9.931300e+042015-04-0109:07:27打浦桥地铁4.0非优惠9号线
---|
376283 | 993132015-04-0109:07:27打浦桥地铁4.0非优惠9号线9.931300e+042015-04-0118:09:51打浦桥地铁0.0非优惠9号线
---|
376285 | 993132015-04-0118:09:51打浦桥地铁0.0非优惠9号线9.931300e+042015-04-0118:46:06延吉中路地铁4.0非优惠8号线
---|
... | ................................................
---|
234887 | 40000381212015-04-0109:05:42人民广场地铁3.0优惠1号线4.000038e+092015-04-0121:32:28人民广场地铁0.0非优惠1号线
---|
234889 | 40000381212015-04-0121:32:28人民广场地铁0.0非优惠1号线4.000038e+092015-04-0122:12:52金运路地铁4.0非优惠13号线
---|
218392 | 40000390672015-04-0107:22:58剑川路地铁0.0非优惠5号线4.000039e+092015-04-0107:32:48颛桥地铁1.0优惠5号线
---|
373585 | 40000397432015-04-0118:11:15南京西路地铁0.0非优惠2号线4.000040e+092015-04-0118:28:44交通大学地铁3.0非优惠10号线
---|
171701 | 40000406652015-04-0108:48:34上海体育场地铁0.0非优惠4号线4.000041e+092015-04-0109:16:55南京东路地铁4.0非优惠10号线
263583 rows × 16 columns
③ 选出同一天 而且 前一笔刷卡金额是0(进站),第二笔刷卡有费用(出站)
# 去掉 ID1
#data = data.drop('ID1', axis=1)
# 选出同一天的
#data = data[data['date'] == data['date1']]
#data = data.drop('date1', axis=1)
#第一笔没扣费,第二笔扣费的
data = data[(data['price'] == 0) & (data['price1'] != 0)]
data
| ID | date | Time | stop | mode | price | type | line | Time1 | stop1 | mode1 | price1 | type1 | line1 |
---|
334427 | 820242015-04-0108:48:25西藏北路地铁0.0非优惠8号线09:07:29江湾体育场地铁4.0非优惠10号线
---|
381022 | 889572015-04-0115:46:58宜山路地铁0.0非优惠3号线16:20:58东宝兴路地铁4.0非优惠3号线
---|
376286 | 993132015-04-0108:26:26延吉中路地铁0.0非优惠8号线09:07:27打浦桥地铁4.0非优惠9号线
---|
376285 | 993132015-04-0118:09:51打浦桥地铁0.0非优惠9号线18:46:06延吉中路地铁4.0非优惠8号线
---|
6062 | 1164352015-04-0112:24:49大连路地铁0.0非优惠4号线12:56:16中山公园地铁3.0优惠3号线
---|
... | ..........................................
---|
234888 | 40000381212015-04-0108:19:28金运路地铁0.0非优惠13号线09:05:42人民广场地铁3.0优惠1号线
---|
234889 | 40000381212015-04-0121:32:28人民广场地铁0.0非优惠1号线22:12:52金运路地铁4.0非优惠13号线
---|
218392 | 40000390672015-04-0107:22:58剑川路地铁0.0非优惠5号线07:32:48颛桥地铁1.0优惠5号线
---|
373585 | 40000397432015-04-0118:11:15南京西路地铁0.0非优惠2号线18:28:44交通大学地铁3.0非优惠10号线
---|
171701 | 40000406652015-04-0108:48:34上海体育场地铁0.0非优惠4号线09:16:55南京东路地铁4.0非优惠10号线
178943 rows × 14 columns
④ 清除多余的列
metrood = data[["ID", 'date', 'Time', 'line', 'stop','Time1', 'line1', 'stop1', 'price1']]
metrood.columns = ["ID", 'date', 'stime', 'sline', 'sstation','etime', 'eline', 'estation', 'price']
metrood
| ID | date | stime | sline | sstation | etime | eline | estation | price |
---|
334427 | 820242015-04-0108:48:258号线西藏北路09:07:2910号线江湾体育场4.0
---|
381022 | 889572015-04-0115:46:583号线宜山路16:20:583号线东宝兴路4.0
---|
376286 | 993132015-04-0108:26:268号线延吉中路09:07:279号线打浦桥4.0
---|
376285 | 993132015-04-0118:09:519号线打浦桥18:46:068号线延吉中路4.0
---|
6062 | 1164352015-04-0112:24:494号线大连路12:56:163号线中山公园3.0
---|
... | ...........................
---|
234888 | 40000381212015-04-0108:19:2813号线金运路09:05:421号线人民广场3.0
---|
234889 | 40000381212015-04-0121:32:281号线人民广场22:12:5213号线金运路4.0
---|
218392 | 40000390672015-04-0107:22:585号线剑川路07:32:485号线颛桥1.0
---|
373585 | 40000397432015-04-0118:11:152号线南京西路18:28:4410号线交通大学3.0
---|
171701 | 40000406652015-04-0108:48:344号线上海体育场09:16:5510号线南京东路4.0
178943 rows × 9 columns
metrood.to_csv(r'od.csv', index = None)
⑤ 地铁OD的集计
为了方便可视化,左乘比较小的记录,我们以出发小时为单位的集计
import pandas as pd
metrood = pd.read_csv(r"od.csv")
metrood['hour'] = metrood['stime'].apply(lambda r:r[:2])
metrood
| ID | date | stime | sline | sstation | etime | eline | estation | price | hour |
---|
0 | 820242015-04-0108:48:258号线西藏北路09:07:2910号线江湾体育场4.008
---|
1 | 889572015-04-0115:46:583号线宜山路16:20:583号线东宝兴路4.015
---|
2 | 993132015-04-0108:26:268号线延吉中路09:07:279号线打浦桥4.008
---|
3 | 993132015-04-0118:09:519号线打浦桥18:46:068号线延吉中路4.018
---|
4 | 1164352015-04-0112:24:494号线大连路12:56:163号线中山公园3.012
---|
... | ..............................
---|
178938 | 40000381212015-04-0108:19:2813号线金运路09:05:421号线人民广场3.008
---|
178939 | 40000381212015-04-0121:32:281号线人民广场22:12:5213号线金运路4.021
---|
178940 | 40000390672015-04-0107:22:585号线剑川路07:32:485号线颛桥1.007
---|
178941 | 40000397432015-04-0118:11:152号线南京西路18:28:4410号线交通大学3.018
---|
178942 | 40000406652015-04-0108:48:344号线上海体育场09:16:5510号线南京东路4.008
178943 rows × 10 columns
od = metrood.groupby(['hour', 'sstation','estation'])['ID'].count().rename("count").reset_index()
od
| hour | sstation | estation | count |
---|
0 | 04上海南站翔殷路2
---|
1 | 04常熟路新闸路1
---|
2 | 04漕宝路汶水路1
---|
3 | 05七宝打浦桥1
---|
4 | 05七宝新村路1
---|
... | ............
---|
117939 | 23静安寺中山公园1
---|
117940 | 23静安寺娄山关路1
---|
117941 | 23马陆马陆1
---|
117942 | 23黄陂南路外环路1
---|
117943 | 23龙华中路耀华路1
117944 rows × 4 columns
⑥ 读取站点信息坐标
stop = pd.read_csv(r"stop.csv")
stop
| stationnames | linename | lon | lat |
---|
0 | 富锦路地铁1号线(富锦路-莘庄)121.42001231.394078
---|
1 | 友谊西路地铁1号线(富锦路-莘庄)121.42335131.382958
---|
2 | 宝安公路地铁1号线(富锦路-莘庄)121.42629031.371680
---|
3 | 共富新村地铁1号线(富锦路-莘庄)121.42946231.356866
---|
4 | 呼兰路地铁1号线(富锦路-莘庄)121.43310731.341553
---|
... | ............
---|
1033 | 三鲁公路轨道交通浦江线(沈杜公路-汇臻路)121.52321131.058207
---|
1034 | 闵瑞路轨道交通浦江线(沈杜公路-汇臻路)121.52611231.050321
---|
1035 | 浦航路轨道交通浦江线(沈杜公路-汇臻路)121.52639231.043280
---|
1036 | 东城一路轨道交通浦江线(沈杜公路-汇臻路)121.52792531.032497
---|
1037 | 汇臻路轨道交通浦江线(沈杜公路-汇臻路)121.52033831.027464
1038 rows × 4 columns
stop = stop.drop_duplicates( subset = ["stationnames"])
stop = stop[['stationnames', 'lon', 'lat']]
stop
| stationnames | lon | lat |
---|
0 | 富锦路121.42001231.394078
---|
1 | 友谊西路121.42335131.382958
---|
2 | 宝安公路121.42629031.371680
---|
3 | 共富新村121.42946231.356866
---|
4 | 呼兰路121.43310731.341553
---|
... | .........
---|
1026 | 汇臻路121.52033831.027464
---|
1027 | 东城一路121.52792531.032497
---|
1028 | 浦航路121.52639231.043280
---|
1029 | 闵瑞路121.52611231.050321
---|
1030 | 三鲁公路121.52321131.058207
387 rows × 3 columns
- 把站点坐标分辨给进站信息和出站信息,这是名字要一致
#sstation对齐
stop.columns = ['sstation', 'slon', 'slat']
od = pd.merge(od,stop)
#eesstation对齐
stop.columns =['estation', 'elon', 'elat']
od = pd.merge(od,stop)
od
| hour | sstation | estation | count | slon | slat | elon | elat |
---|
0 | 04上海南站翔殷路2121.42521931.156776121.52766931.307069
---|
1 | 06上海南站翔殷路1121.42521931.156776121.52766931.307069
---|
2 | 09上海南站翔殷路2121.42521931.156776121.52766931.307069
---|
3 | 06常熟路翔殷路1121.44670631.215520121.52766931.307069
---|
4 | 17常熟路翔殷路1121.44670631.215520121.52766931.307069
---|
... | ........................
---|
114036 | 14龙阳路华夏中路1121.55315431.205246121.57727931.176771
---|
114037 | 18龙阳路华夏中路1121.55315431.205246121.57727931.176771
---|
114038 | 08书院华夏中路1121.84647730.961623121.57727931.176771
---|
114039 | 08松江新城华夏中路1121.22635131.032349121.57727931.176771
---|
114040 | 12罗山路华夏中路1121.58887731.155643121.57727931.176771
114041 rows × 8 columns
od.to_csv(r'od_fi.csv', index = None)
六. 可视化
sanddance,kepler,mobmap
https://sanddance.js.org/app/
https://kepler.gl/
七. 练习
-
每一条地铁线路的客流量
-
统计每小时搭乘地铁的客流量
-
统计出客流量最大的是个地铁站
-
统计出客流量最大的10个OD
#运行这个代码可以让Python不显示warnings
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
icdata = pd.read_csv(r'SPTCC-20150401-sample.csv',header = None)
icdata
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|
0 | 1004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠
---|
1 | 1004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠
---|
2 | 1004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠
---|
3 | 1004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠
---|
4 | 1004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠
---|
... | .....................
---|
442855 | 23011082662015-04-0123:48:212号线中山公园地铁4.0非优惠
---|
442856 | 23011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠
---|
442857 | 21041621232015-04-0123:48:072号线中山公园地铁4.0非优惠
---|
442858 | 21041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠
---|
442859 | 31038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠
442860 rows × 7 columns
7.1 每一条地铁线路的客流量
① 对数据进行初步处理
od = metrood.groupby(['hour', 'sstation','estation'])['ID'].count().rename("count").reset_index()
od
# 对数据进行处理
icdata.columns = ['ID', 'date', 'Time', 'stop', 'mode', 'price', 'type']
icdata = icdata[icdata['mode'] == '地铁']
icdata
| ID | date | Time | stop | mode | price | type |
---|
0 | 1004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠
---|
1 | 1004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠
---|
2 | 1004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠
---|
3 | 1004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠
---|
4 | 1004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠
---|
... | .....................
---|
442855 | 23011082662015-04-0123:48:212号线中山公园地铁4.0非优惠
---|
442856 | 23011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠
---|
442857 | 21041621232015-04-0123:48:072号线中山公园地铁4.0非优惠
---|
442858 | 21041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠
---|
442859 | 31038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠
360873 rows × 7 columns
# 将stop内容进行分解
icdata['line'] = icdata['stop'].apply(lambda r:r[:r.find('线')+1])
icdata['station'] = icdata['stop'].apply(lambda r:r[r.find('线')+1:])
icdata
| ID | date | Time | stop | mode | price | type | line | station |
---|
0 | 1004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠11号线祁连山路
---|
1 | 1004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠11号线枫桥路
---|
2 | 1004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠2号线娄山关路
---|
3 | 1004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠2号线娄山关路
---|
4 | 1004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠11号线祁连山路
---|
... | ...........................
---|
442855 | 23011082662015-04-0123:48:212号线中山公园地铁4.0非优惠2号线中山公园
---|
442856 | 23011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠2号线虹桥火车站
---|
442857 | 21041621232015-04-0123:48:072号线中山公园地铁4.0非优惠2号线中山公园
---|
442858 | 21041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠2号线虹桥火车站
---|
442859 | 31038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠2号线虹桥火车站
360873 rows × 9 columns
od_flow = icdata.groupby(['line'])['line'].count().rename("count").reset_index()
od_flow
| line | count |
---|
0 | 10号线25596
---|
1 | 11号线22259
---|
2 | 12号线6409
---|
3 | 13号线6261
---|
4 | 16号线3470
---|
5 | 1号线54415
---|
6 | 2号线59026
---|
7 | 3号线32993
---|
8 | 4号线24162
---|
9 | 5号线5758
---|
10 | 6号线15677
---|
11 | 7号线31465
---|
12 | 8号线38366
---|
13 | 9号线35016
# 保存重要图标
od_flow.to_csv(r'od_flow.csv', index = None)
7.2 统计每小时搭乘地铁的客流量
② 吧小时单独拿出来进行统计
icdata['hour'] = icdata['Time'].apply(lambda r:r[:2])
icdata
| ID | date | Time | stop | mode | price | type | line | station | hour |
---|
0 | 1004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠11号线祁连山路12
---|
1 | 1004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠11号线枫桥路18
---|
2 | 1004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠2号线娄山关路08
---|
3 | 1004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠2号线娄山关路12
---|
4 | 1004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠11号线祁连山路18
---|
... | ..............................
---|
442855 | 23011082662015-04-0123:48:212号线中山公园地铁4.0非优惠2号线中山公园23
---|
442856 | 23011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠2号线虹桥火车站23
---|
442857 | 21041621232015-04-0123:48:072号线中山公园地铁4.0非优惠2号线中山公园23
---|
442858 | 21041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠2号线虹桥火车站23
---|
442859 | 31038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠2号线虹桥火车站23
360873 rows × 10 columns
icdata_flowByHour = icdata.groupby(['hour'])['hour'].count().rename("count").reset_index()
icdata_flowByHour
| hour | count |
---|
0 | 046
---|
1 | 05919
---|
2 | 069536
---|
3 | 0734341
---|
4 | 0855952
---|
5 | 0927947
---|
6 | 1013758
---|
7 | 1111871
---|
8 | 1212751
---|
9 | 1313355
---|
10 | 1413067
---|
11 | 1514629
---|
12 | 1618928
---|
13 | 1736720
---|
14 | 1841739
---|
15 | 1922236
---|
16 | 2013583
---|
17 | 2111850
---|
18 | 227042
---|
19 | 23643
# 保存重要图标
icdata_flowByHour.to_csv(r'icdata_flowByHour.csv', index = None)
7.3 统计出十个流量最大的地铁站
icdata_flowStation = icdata.groupby(['station'])['station'].count().rename("count").reset_index()
icdata_flowStation
| station | count |
---|
0 | 七宝2703
---|
1 | 三林989
---|
2 | 三林东653
---|
3 | 三门路313
---|
4 | 上南路485
---|
... | ......
---|
283 | 龙柏新村957
---|
284 | 龙溪路553
---|
285 | 龙漕路1109
---|
286 | 龙耀路248
---|
287 | 龙阳路2951
288 rows × 2 columns
# 默认升序,用ascending =False 倒排
# drop = True重新算行号
icdata_flowStation.sort_values(by='count' , ascending =False).reset_index(drop = True)
| station | count |
---|
0 | 人民广场8615
---|
1 | 上海火车站7383
---|
2 | 徐家汇6339
---|
3 | 静安寺6203
---|
4 | 陆家嘴5744
---|
... | ......
---|
283 | 惠南东94
---|
284 | 远东大道84
---|
285 | 复兴岛76
---|
286 | 殷高东路65
---|
287 | 华夏中路21
288 rows × 2 columns
# 做个且切片
icdata_flowStation = icdata_flowStation.sort_values(by='count' , ascending =False).reset_index(drop = True)[:10]
icdata_flowStation
| station | count |
---|
0 | 人民广场8615
---|
1 | 上海火车站7383
---|
2 | 徐家汇6339
---|
3 | 静安寺6203
---|
4 | 陆家嘴5744
---|
5 | 南京东路5266
---|
6 | 中山公园5264
---|
7 | 莘庄5137
---|
8 | 陕西南路5083
---|
9 | 南京西路4165
③ 加入位置坐标
stop = pd.read_csv(r"stop.csv")
stop
| stationnames | linename | lon | lat |
---|
0 | 富锦路地铁1号线(富锦路-莘庄)121.42001231.394078
---|
1 | 友谊西路地铁1号线(富锦路-莘庄)121.42335131.382958
---|
2 | 宝安公路地铁1号线(富锦路-莘庄)121.42629031.371680
---|
3 | 共富新村地铁1号线(富锦路-莘庄)121.42946231.356866
---|
4 | 呼兰路地铁1号线(富锦路-莘庄)121.43310731.341553
---|
... | ............
---|
1033 | 三鲁公路轨道交通浦江线(沈杜公路-汇臻路)121.52321131.058207
---|
1034 | 闵瑞路轨道交通浦江线(沈杜公路-汇臻路)121.52611231.050321
---|
1035 | 浦航路轨道交通浦江线(沈杜公路-汇臻路)121.52639231.043280
---|
1036 | 东城一路轨道交通浦江线(沈杜公路-汇臻路)121.52792531.032497
---|
1037 | 汇臻路轨道交通浦江线(沈杜公路-汇臻路)121.52033831.027464
1038 rows × 4 columns
# 去重 只留坐标
stop = stop.drop_duplicates( subset = ["stationnames"])
stop = stop[['stationnames', 'lon', 'lat']]
stop
| stationnames | lon | lat |
---|
0 | 富锦路121.42001231.394078
---|
1 | 友谊西路121.42335131.382958
---|
2 | 宝安公路121.42629031.371680
---|
3 | 共富新村121.42946231.356866
---|
4 | 呼兰路121.43310731.341553
---|
... | .........
---|
1026 | 汇臻路121.52033831.027464
---|
1027 | 东城一路121.52792531.032497
---|
1028 | 浦航路121.52639231.043280
---|
1029 | 闵瑞路121.52611231.050321
---|
1030 | 三鲁公路121.52321131.058207
387 rows × 3 columns
# 为了merge重命名
stop.columns = ['station', 'lon', 'lat']
stop
| station | lon | lat |
---|
0 | 富锦路121.42001231.394078
---|
1 | 友谊西路121.42335131.382958
---|
2 | 宝安公路121.42629031.371680
---|
3 | 共富新村121.42946231.356866
---|
4 | 呼兰路121.43310731.341553
---|
... | .........
---|
1026 | 汇臻路121.52033831.027464
---|
1027 | 东城一路121.52792531.032497
---|
1028 | 浦航路121.52639231.043280
---|
1029 | 闵瑞路121.52611231.050321
---|
1030 | 三鲁公路121.52321131.058207
387 rows × 3 columns
icdata_flowStation = pd.merge(icdata_flowStation,stop,on='station', how ='left')
icdata_flowStation
| station | count | lon | lat |
---|
0 | 人民广场8615121.47063531.234938
---|
1 | 上海火车站7383121.45134731.249252
---|
2 | 徐家汇6339121.43373031.194666
---|
3 | 静安寺6203121.44167931.225084
---|
4 | 陆家嘴5744121.49795031.240191
---|
5 | 南京东路5266121.47924431.239115
---|
6 | 中山公园5264121.41373631.220411
---|
7 | 莘庄5137121.38111631.112982
---|
8 | 陕西南路5083121.45564031.219225
---|
9 | 南京西路4165121.45550731.231766
# 保存重要图标
icdata_flowStation.to_csv(r'icdata_flowStation.csv', index = None)
7.4 统计出十个流量最大的OD
④ 找到OD对
# 对数据进行排序
icdata = icdata.sort_values(by = ['ID', 'date', 'Time'])
# 对整行进行 *** 作,然后列名就是col+'1'
for col in icdata.columns:
icdata[col+'1'] = icdata[col].shift(-1)
# 选出同一人的
icdata = icdata[icdata['ID'] == icdata['ID1']]
# 选出同一天的
icdata = icdata[icdata['date'] == icdata['date1']]
#第一笔没扣费,第二笔扣费的
icdata = icdata[(icdata['price'] == 0) & (icdata['price1'] != 0)]
icdata
| ID | date | Time | stop | mode | price | type | line | station | hour | ID1 | date1 | Time1 | stop1 | mode1 | price1 | type1 | line1 | station1 | hour1 |
---|
334427 | 820242015-04-0108:48:258号线西藏北路地铁0.0非优惠8号线西藏北路088.202400e+042015-04-0109:07:2910号线江湾体育场地铁4.0非优惠10号线江湾体育场09
---|
381022 | 889572015-04-0115:46:583号线宜山路地铁0.0非优惠3号线宜山路158.895700e+042015-04-0116:20:583号线东宝兴路地铁4.0非优惠3号线东宝兴路16
---|
376286 | 993132015-04-0108:26:268号线延吉中路地铁0.0非优惠8号线延吉中路089.931300e+042015-04-0109:07:279号线打浦桥地铁4.0非优惠9号线打浦桥09
---|
376285 | 993132015-04-0118:09:519号线打浦桥地铁0.0非优惠9号线打浦桥189.931300e+042015-04-0118:46:068号线延吉中路地铁4.0非优惠8号线延吉中路18
---|
6062 | 1164352015-04-0112:24:494号线大连路地铁0.0非优惠4号线大连路121.164350e+052015-04-0112:56:163号线中山公园地铁3.0优惠3号线中山公园12
---|
... | ............................................................
---|
234888 | 40000381212015-04-0108:19:2813号线金运路地铁0.0非优惠13号线金运路084.000038e+092015-04-0109:05:421号线人民广场地铁3.0优惠1号线人民广场09
---|
234889 | 40000381212015-04-0121:32:281号线人民广场地铁0.0非优惠1号线人民广场214.000038e+092015-04-0122:12:5213号线金运路地铁4.0非优惠13号线金运路22
---|
218392 | 40000390672015-04-0107:22:585号线剑川路地铁0.0非优惠5号线剑川路074.000039e+092015-04-0107:32:485号线颛桥地铁1.0优惠5号线颛桥07
---|
373585 | 40000397432015-04-0118:11:152号线南京西路地铁0.0非优惠2号线南京西路184.000040e+092015-04-0118:28:4410号线交通大学地铁3.0非优惠10号线交通大学18
---|
171701 | 40000406652015-04-0108:48:344号线上海体育场地铁0.0非优惠4号线上海体育场084.000041e+092015-04-0109:16:5510号线南京东路地铁4.0非优惠10号线南京东路09
178943 rows × 20 columns
# 去掉没用的信息
od = icdata[['ID', 'date', 'Time', 'line', 'station', 'Time1', 'price1', 'line1', 'station1']]
od
| ID | date | Time | line | station | Time1 | price1 | line1 | station1 |
---|
334427 | 820242015-04-0108:48:258号线西藏北路09:07:294.010号线江湾体育场
---|
381022 | 889572015-04-0115:46:583号线宜山路16:20:584.03号线东宝兴路
---|
376286 | 993132015-04-0108:26:268号线延吉中路09:07:274.09号线打浦桥
---|
376285 | 993132015-04-0118:09:519号线打浦桥18:46:064.08号线延吉中路
---|
6062 | 1164352015-04-0112:24:494号线大连路12:56:163.03号线中山公园
---|
... | ...........................
---|
234888 | 40000381212015-04-0108:19:2813号线金运路09:05:423.01号线人民广场
---|
234889 | 40000381212015-04-0121:32:281号线人民广场22:12:524.013号线金运路
---|
218392 | 40000390672015-04-0107:22:585号线剑川路07:32:481.05号线颛桥
---|
373585 | 40000397432015-04-0118:11:152号线南京西路18:28:443.010号线交通大学
---|
171701 | 40000406652015-04-0108:48:344号线上海体育场09:16:554.010号线南京东路
178943 rows × 9 columns
# 重命名
od.columns = ["ID", 'date', 'stime', 'sline', 'sstation', 'etime', 'price', 'eline', 'estation']
od
| ID | date | stime | sline | sstation | etime | price | eline | estation |
---|
334427 | 820242015-04-0108:48:258号线西藏北路09:07:294.010号线江湾体育场
---|
381022 | 889572015-04-0115:46:583号线宜山路16:20:584.03号线东宝兴路
---|
376286 | 993132015-04-0108:26:268号线延吉中路09:07:274.09号线打浦桥
---|
376285 | 993132015-04-0118:09:519号线打浦桥18:46:064.08号线延吉中路
---|
6062 | 1164352015-04-0112:24:494号线大连路12:56:163.03号线中山公园
---|
... | ...........................
---|
234888 | 40000381212015-04-0108:19:2813号线金运路09:05:423.01号线人民广场
---|
234889 | 40000381212015-04-0121:32:281号线人民广场22:12:524.013号线金运路
---|
218392 | 40000390672015-04-0107:22:585号线剑川路07:32:481.05号线颛桥
---|
373585 | 40000397432015-04-0118:11:152号线南京西路18:28:443.010号线交通大学
---|
171701 | 40000406652015-04-0108:48:344号线上海体育场09:16:554.010号线南京东路
178943 rows × 9 columns
⑤ 对相同OD进行统计
od1 = od.groupby(['sstation','estation'])['ID'].count().rename("count").reset_index()
od1
| sstation | estation | count |
---|
0 | 七宝七宝3
---|
1 | 七宝三林6
---|
2 | 七宝上南路1
---|
3 | 七宝上大路1
---|
4 | 七宝上海体育场5
---|
... | .........
---|
41541 | 龙阳路黄陂南路7
---|
41542 | 龙阳路龙华1
---|
41543 | 龙阳路龙华中路4
---|
41544 | 龙阳路龙柏新村2
---|
41545 | 龙阳路龙阳路5
41546 rows × 3 columns
⑥ 对OD数量进行排序
# 做个且切片
od1 = od1.sort_values(by='count' , ascending =False).reset_index(drop = True)[:10]
od1
| sstation | estation | count |
---|
0 | 九亭漕河泾开发区162
---|
1 | 通河新村上海火车站162
---|
2 | 莘庄徐家汇150
---|
3 | 徐家汇莘庄137
---|
4 | 陆家嘴南京东路132
---|
5 | 漕河泾开发区九亭129
---|
6 | 彭浦新村上海火车站124
---|
7 | 莘庄人民广场121
---|
8 | 人民广场莘庄117
---|
9 | 陕西南路莘庄116
- 没有按小时 按得是一天 所以没有对hour进行集计
- 排序 取前十
⑦ 将车站坐标引进
stop
| estation | elon | elat |
---|
0 | 富锦路121.42001231.394078
---|
1 | 友谊西路121.42335131.382958
---|
2 | 宝安公路121.42629031.371680
---|
3 | 共富新村121.42946231.356866
---|
4 | 呼兰路121.43310731.341553
---|
... | .........
---|
1026 | 汇臻路121.52033831.027464
---|
1027 | 东城一路121.52792531.032497
---|
1028 | 浦航路121.52639231.043280
---|
1029 | 闵瑞路121.52611231.050321
---|
1030 | 三鲁公路121.52321131.058207
387 rows × 3 columns
#坐标导入对齐
stop.columns = ['sstation', 'slon', 'slat']
od1 = pd.merge(od1,stop)
#eesstation对齐
stop.columns =['estation', 'elon', 'elat']
od1 = pd.merge(od1,stop)
od1
| sstation | estation | count | slon | slat | elon | elat |
---|
0 | 九亭漕河泾开发区162121.31500531.139231121.39298131.172309
---|
1 | 通河新村上海火车站162121.43692831.332913121.45134731.249252
---|
2 | 彭浦新村上海火车站124121.44409231.308468121.45134731.249252
---|
3 | 莘庄徐家汇150121.38111631.112982121.43373031.194666
---|
4 | 莘庄人民广场121121.38111631.112982121.47063531.234938
---|
5 | 徐家汇莘庄137121.43373031.194666121.38111631.112982
---|
6 | 人民广场莘庄117121.47063531.234938121.38111631.112982
---|
7 | 陕西南路莘庄116121.45564031.219225121.38111631.112982
---|
8 | 陆家嘴南京东路132121.49795031.240191121.47924431.239115
---|
9 | 漕河泾开发区九亭129121.39298131.172309121.31500531.139231
# 保存重要图标
od1.to_csv(r'ODsort10.csv', index = None)
评论列表(0条)