文章目录2021.11.13
【小旭学长-使用python进行城市数据分析】笔记篇(上):https://blog.csdn.net/wistonty11/article/details/121089882
【小旭学长-使用python进行城市数据分析】笔记篇(中):https://blog.csdn.net/wistonty11/article/details/121210664
- 五. IC刷卡数据的基本处理
- 5.1基于IC刷卡数据的地铁OD提取
- 六. 可视化
- 七. 练习
- 7.1 每一条地铁线路的客流量
- 7.2 统计每小时搭乘地铁的客流量
- 7.3 统计出十个流量最大的地铁站
- 7.4 统计出十个流量最大的OD
① 读取数据,添加列名
import pandas as pd
data = pd.read_csv("SPTCC-20150401-sample.csv",header = None)
data
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|---|
| 0 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 |
| 1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 |
| 2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 |
| 3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 |
| 4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
| 442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
| 442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
| 442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
| 442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
442860 rows × 7 columns
data.columns = ['ID', 'date', 'Time', 'stop', 'mode', 'price', 'type'] data
| ID | date | Time | stop | mode | price | type | |
|---|---|---|---|---|---|---|---|
| 0 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 |
| 1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 |
| 2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 |
| 3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 |
| 4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
| 442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
| 442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
| 442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
| 442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
442860 rows × 7 columns
② 帅选出地铁方式的出行,并将站点信息拆成,线路和站名
data = data[data['mode'] == '地铁'] data
| ID | date | Time | stop | mode | price | type | |
|---|---|---|---|---|---|---|---|
| 0 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 |
| 1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 |
| 2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 |
| 3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 |
| 4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
| 442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
| 442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
| 442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
| 442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 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 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 | 11号线 |
| 1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 | 11号线 |
| 2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 | 2号线 |
| 3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 | 2号线 |
| 4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 | 11号线 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 |
| 442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
| 442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 |
| 442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
| 442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 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 | 100405844 | 2015-04-01 | 12:43:24 | 祁连山路 | 地铁 | 4.0 | 非优惠 | 11号线 |
| 1 | 100405844 | 2015-04-01 | 18:22:04 | 枫桥路 | 地铁 | 3.0 | 非优惠 | 11号线 |
| 2 | 100405844 | 2015-04-01 | 08:21:18 | 娄山关路 | 地铁 | 3.0 | 非优惠 | 2号线 |
| 3 | 100405844 | 2015-04-01 | 12:07:31 | 娄山关路 | 地铁 | 0.0 | 非优惠 | 2号线 |
| 4 | 100405844 | 2015-04-01 | 18:08:42 | 祁连山路 | 地铁 | 0.0 | 非优惠 | 11号线 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 442855 | 2301108266 | 2015-04-01 | 23:48:21 | 中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 |
| 442856 | 2301108266 | 2015-04-01 | 23:06:45 | 虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
| 442857 | 2104162123 | 2015-04-01 | 23:48:07 | 中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 |
| 442858 | 2104162123 | 2015-04-01 | 23:18:16 | 虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
| 442859 | 3103885141 | 2015-04-01 | 23:16:19 | 虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
360873 rows × 8 columns
③ 我们想用点对,所以用ID进行排序 然后用.shift让数据表错一行,让两表连接,去掉不是一个人的
- 用.sort_values()进行排序
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 | 82024 | 2015-04-01 | 08:48:25 | 西藏北路 | 地铁 | 0.0 | 非优惠 | 8号线 | 8.202400e+04 |
| 334426 | 82024 | 2015-04-01 | 09:07:29 | 江湾体育场 | 地铁 | 4.0 | 非优惠 | 10号线 | 8.895700e+04 |
| 381022 | 88957 | 2015-04-01 | 15:46:58 | 宜山路 | 地铁 | 0.0 | 非优惠 | 3号线 | 8.895700e+04 |
| 381021 | 88957 | 2015-04-01 | 16:20:58 | 东宝兴路 | 地铁 | 4.0 | 非优惠 | 3号线 | 9.931300e+04 |
| 376286 | 99313 | 2015-04-01 | 08:26:26 | 延吉中路 | 地铁 | 0.0 | 非优惠 | 8号线 | 9.931300e+04 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 218391 | 4000039067 | 2015-04-01 | 07:32:48 | 颛桥 | 地铁 | 1.0 | 优惠 | 5号线 | 4.000040e+09 |
| 373585 | 4000039743 | 2015-04-01 | 18:11:15 | 南京西路 | 地铁 | 0.0 | 非优惠 | 2号线 | 4.000040e+09 |
| 373584 | 4000039743 | 2015-04-01 | 18:28:44 | 交通大学 | 地铁 | 3.0 | 非优惠 | 10号线 | 4.000041e+09 |
| 171701 | 4000040665 | 2015-04-01 | 08:48:34 | 上海体育场 | 地铁 | 0.0 | 非优惠 | 4号线 | 4.000041e+09 |
| 171702 | 4000040665 | 2015-04-01 | 09: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 | 82024 | 2015-04-01 | 08:48:25 | 西藏北路 | 地铁 | 0.0 | 非优惠 | 8号线 |
| 334426 | 82024 | 2015-04-01 | 09:07:29 | 江湾体育场 | 地铁 | 4.0 | 非优惠 | 10号线 |
| 381022 | 88957 | 2015-04-01 | 15:46:58 | 宜山路 | 地铁 | 0.0 | 非优惠 | 3号线 |
| 381021 | 88957 | 2015-04-01 | 16:20:58 | 东宝兴路 | 地铁 | 4.0 | 非优惠 | 3号线 |
| 376286 | 99313 | 2015-04-01 | 08:26:26 | 延吉中路 | 地铁 | 0.0 | 非优惠 | 8号线 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 218391 | 4000039067 | 2015-04-01 | 07:32:48 | 颛桥 | 地铁 | 1.0 | 优惠 | 5号线 |
| 373585 | 4000039743 | 2015-04-01 | 18:11:15 | 南京西路 | 地铁 | 0.0 | 非优惠 | 2号线 |
| 373584 | 4000039743 | 2015-04-01 | 18:28:44 | 交通大学 | 地铁 | 3.0 | 非优惠 | 10号线 |
| 171701 | 4000040665 | 2015-04-01 | 08:48:34 | 上海体育场 | 地铁 | 0.0 | 非优惠 | 4号线 |
| 171702 | 4000040665 | 2015-04-01 | 09: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 | 82024 | 2015-04-01 | 08:48:25 | 西藏北路 | 地铁 | 0.0 | 非优惠 | 8号线 | 8.202400e+04 | 2015-04-01 | 09:07:29 | 江湾体育场 | 地铁 | 4.0 | 非优惠 | 10号线 |
| 334426 | 82024 | 2015-04-01 | 09:07:29 | 江湾体育场 | 地铁 | 4.0 | 非优惠 | 10号线 | 8.895700e+04 | 2015-04-01 | 15:46:58 | 宜山路 | 地铁 | 0.0 | 非优惠 | 3号线 |
| 381022 | 88957 | 2015-04-01 | 15:46:58 | 宜山路 | 地铁 | 0.0 | 非优惠 | 3号线 | 8.895700e+04 | 2015-04-01 | 16:20:58 | 东宝兴路 | 地铁 | 4.0 | 非优惠 | 3号线 |
| 381021 | 88957 | 2015-04-01 | 16:20:58 | 东宝兴路 | 地铁 | 4.0 | 非优惠 | 3号线 | 9.931300e+04 | 2015-04-01 | 08:26:26 | 延吉中路 | 地铁 | 0.0 | 非优惠 | 8号线 |
| 376286 | 99313 | 2015-04-01 | 08:26:26 | 延吉中路 | 地铁 | 0.0 | 非优惠 | 8号线 | 9.931300e+04 | 2015-04-01 | 09:07:27 | 打浦桥 | 地铁 | 4.0 | 非优惠 | 9号线 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 218391 | 4000039067 | 2015-04-01 | 07:32:48 | 颛桥 | 地铁 | 1.0 | 优惠 | 5号线 | 4.000040e+09 | 2015-04-01 | 18:11:15 | 南京西路 | 地铁 | 0.0 | 非优惠 | 2号线 |
| 373585 | 4000039743 | 2015-04-01 | 18:11:15 | 南京西路 | 地铁 | 0.0 | 非优惠 | 2号线 | 4.000040e+09 | 2015-04-01 | 18:28:44 | 交通大学 | 地铁 | 3.0 | 非优惠 | 10号线 |
| 373584 | 4000039743 | 2015-04-01 | 18:28:44 | 交通大学 | 地铁 | 3.0 | 非优惠 | 10号线 | 4.000041e+09 | 2015-04-01 | 08:48:34 | 上海体育场 | 地铁 | 0.0 | 非优惠 | 4号线 |
| 171701 | 4000040665 | 2015-04-01 | 08:48:34 | 上海体育场 | 地铁 | 0.0 | 非优惠 | 4号线 | 4.000041e+09 | 2015-04-01 | 09:16:55 | 南京东路 | 地铁 | 4.0 | 非优惠 | 10号线 |
| 171702 | 4000040665 | 2015-04-01 | 09:16:55 | 南京东路 | 地铁 | 4.0 | 非优惠 | 10号线 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
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 | 82024 | 2015-04-01 | 08:48:25 | 西藏北路 | 地铁 | 0.0 | 非优惠 | 8号线 | 8.202400e+04 | 2015-04-01 | 09:07:29 | 江湾体育场 | 地铁 | 4.0 | 非优惠 | 10号线 |
| 381022 | 88957 | 2015-04-01 | 15:46:58 | 宜山路 | 地铁 | 0.0 | 非优惠 | 3号线 | 8.895700e+04 | 2015-04-01 | 16:20:58 | 东宝兴路 | 地铁 | 4.0 | 非优惠 | 3号线 |
| 376286 | 99313 | 2015-04-01 | 08:26:26 | 延吉中路 | 地铁 | 0.0 | 非优惠 | 8号线 | 9.931300e+04 | 2015-04-01 | 09:07:27 | 打浦桥 | 地铁 | 4.0 | 非优惠 | 9号线 |
| 376283 | 99313 | 2015-04-01 | 09:07:27 | 打浦桥 | 地铁 | 4.0 | 非优惠 | 9号线 | 9.931300e+04 | 2015-04-01 | 18:09:51 | 打浦桥 | 地铁 | 0.0 | 非优惠 | 9号线 |
| 376285 | 99313 | 2015-04-01 | 18:09:51 | 打浦桥 | 地铁 | 0.0 | 非优惠 | 9号线 | 9.931300e+04 | 2015-04-01 | 18:46:06 | 延吉中路 | 地铁 | 4.0 | 非优惠 | 8号线 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 234887 | 4000038121 | 2015-04-01 | 09:05:42 | 人民广场 | 地铁 | 3.0 | 优惠 | 1号线 | 4.000038e+09 | 2015-04-01 | 21:32:28 | 人民广场 | 地铁 | 0.0 | 非优惠 | 1号线 |
| 234889 | 4000038121 | 2015-04-01 | 21:32:28 | 人民广场 | 地铁 | 0.0 | 非优惠 | 1号线 | 4.000038e+09 | 2015-04-01 | 22:12:52 | 金运路 | 地铁 | 4.0 | 非优惠 | 13号线 |
| 218392 | 4000039067 | 2015-04-01 | 07:22:58 | 剑川路 | 地铁 | 0.0 | 非优惠 | 5号线 | 4.000039e+09 | 2015-04-01 | 07:32:48 | 颛桥 | 地铁 | 1.0 | 优惠 | 5号线 |
| 373585 | 4000039743 | 2015-04-01 | 18:11:15 | 南京西路 | 地铁 | 0.0 | 非优惠 | 2号线 | 4.000040e+09 | 2015-04-01 | 18:28:44 | 交通大学 | 地铁 | 3.0 | 非优惠 | 10号线 |
| 171701 | 4000040665 | 2015-04-01 | 08:48:34 | 上海体育场 | 地铁 | 0.0 | 非优惠 | 4号线 | 4.000041e+09 | 2015-04-01 | 09: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 | 82024 | 2015-04-01 | 08:48:25 | 西藏北路 | 地铁 | 0.0 | 非优惠 | 8号线 | 09:07:29 | 江湾体育场 | 地铁 | 4.0 | 非优惠 | 10号线 |
| 381022 | 88957 | 2015-04-01 | 15:46:58 | 宜山路 | 地铁 | 0.0 | 非优惠 | 3号线 | 16:20:58 | 东宝兴路 | 地铁 | 4.0 | 非优惠 | 3号线 |
| 376286 | 99313 | 2015-04-01 | 08:26:26 | 延吉中路 | 地铁 | 0.0 | 非优惠 | 8号线 | 09:07:27 | 打浦桥 | 地铁 | 4.0 | 非优惠 | 9号线 |
| 376285 | 99313 | 2015-04-01 | 18:09:51 | 打浦桥 | 地铁 | 0.0 | 非优惠 | 9号线 | 18:46:06 | 延吉中路 | 地铁 | 4.0 | 非优惠 | 8号线 |
| 6062 | 116435 | 2015-04-01 | 12:24:49 | 大连路 | 地铁 | 0.0 | 非优惠 | 4号线 | 12:56:16 | 中山公园 | 地铁 | 3.0 | 优惠 | 3号线 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 234888 | 4000038121 | 2015-04-01 | 08:19:28 | 金运路 | 地铁 | 0.0 | 非优惠 | 13号线 | 09:05:42 | 人民广场 | 地铁 | 3.0 | 优惠 | 1号线 |
| 234889 | 4000038121 | 2015-04-01 | 21:32:28 | 人民广场 | 地铁 | 0.0 | 非优惠 | 1号线 | 22:12:52 | 金运路 | 地铁 | 4.0 | 非优惠 | 13号线 |
| 218392 | 4000039067 | 2015-04-01 | 07:22:58 | 剑川路 | 地铁 | 0.0 | 非优惠 | 5号线 | 07:32:48 | 颛桥 | 地铁 | 1.0 | 优惠 | 5号线 |
| 373585 | 4000039743 | 2015-04-01 | 18:11:15 | 南京西路 | 地铁 | 0.0 | 非优惠 | 2号线 | 18:28:44 | 交通大学 | 地铁 | 3.0 | 非优惠 | 10号线 |
| 171701 | 4000040665 | 2015-04-01 | 08: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 | 82024 | 2015-04-01 | 08:48:25 | 8号线 | 西藏北路 | 09:07:29 | 10号线 | 江湾体育场 | 4.0 |
| 381022 | 88957 | 2015-04-01 | 15:46:58 | 3号线 | 宜山路 | 16:20:58 | 3号线 | 东宝兴路 | 4.0 |
| 376286 | 99313 | 2015-04-01 | 08:26:26 | 8号线 | 延吉中路 | 09:07:27 | 9号线 | 打浦桥 | 4.0 |
| 376285 | 99313 | 2015-04-01 | 18:09:51 | 9号线 | 打浦桥 | 18:46:06 | 8号线 | 延吉中路 | 4.0 |
| 6062 | 116435 | 2015-04-01 | 12:24:49 | 4号线 | 大连路 | 12:56:16 | 3号线 | 中山公园 | 3.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 234888 | 4000038121 | 2015-04-01 | 08:19:28 | 13号线 | 金运路 | 09:05:42 | 1号线 | 人民广场 | 3.0 |
| 234889 | 4000038121 | 2015-04-01 | 21:32:28 | 1号线 | 人民广场 | 22:12:52 | 13号线 | 金运路 | 4.0 |
| 218392 | 4000039067 | 2015-04-01 | 07:22:58 | 5号线 | 剑川路 | 07:32:48 | 5号线 | 颛桥 | 1.0 |
| 373585 | 4000039743 | 2015-04-01 | 18:11:15 | 2号线 | 南京西路 | 18:28:44 | 10号线 | 交通大学 | 3.0 |
| 171701 | 4000040665 | 2015-04-01 | 08:48:34 | 4号线 | 上海体育场 | 09:16:55 | 10号线 | 南京东路 | 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 | 82024 | 2015-04-01 | 08:48:25 | 8号线 | 西藏北路 | 09:07:29 | 10号线 | 江湾体育场 | 4.0 | 08 |
| 1 | 88957 | 2015-04-01 | 15:46:58 | 3号线 | 宜山路 | 16:20:58 | 3号线 | 东宝兴路 | 4.0 | 15 |
| 2 | 99313 | 2015-04-01 | 08:26:26 | 8号线 | 延吉中路 | 09:07:27 | 9号线 | 打浦桥 | 4.0 | 08 |
| 3 | 99313 | 2015-04-01 | 18:09:51 | 9号线 | 打浦桥 | 18:46:06 | 8号线 | 延吉中路 | 4.0 | 18 |
| 4 | 116435 | 2015-04-01 | 12:24:49 | 4号线 | 大连路 | 12:56:16 | 3号线 | 中山公园 | 3.0 | 12 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 178938 | 4000038121 | 2015-04-01 | 08:19:28 | 13号线 | 金运路 | 09:05:42 | 1号线 | 人民广场 | 3.0 | 08 |
| 178939 | 4000038121 | 2015-04-01 | 21:32:28 | 1号线 | 人民广场 | 22:12:52 | 13号线 | 金运路 | 4.0 | 21 |
| 178940 | 4000039067 | 2015-04-01 | 07:22:58 | 5号线 | 剑川路 | 07:32:48 | 5号线 | 颛桥 | 1.0 | 07 |
| 178941 | 4000039743 | 2015-04-01 | 18:11:15 | 2号线 | 南京西路 | 18:28:44 | 10号线 | 交通大学 | 3.0 | 18 |
| 178942 | 4000040665 | 2015-04-01 | 08:48:34 | 4号线 | 上海体育场 | 09:16:55 | 10号线 | 南京东路 | 4.0 | 08 |
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.420012 | 31.394078 |
| 1 | 友谊西路 | 地铁1号线(富锦路-莘庄) | 121.423351 | 31.382958 |
| 2 | 宝安公路 | 地铁1号线(富锦路-莘庄) | 121.426290 | 31.371680 |
| 3 | 共富新村 | 地铁1号线(富锦路-莘庄) | 121.429462 | 31.356866 |
| 4 | 呼兰路 | 地铁1号线(富锦路-莘庄) | 121.433107 | 31.341553 |
| ... | ... | ... | ... | ... |
| 1033 | 三鲁公路 | 轨道交通浦江线(沈杜公路-汇臻路) | 121.523211 | 31.058207 |
| 1034 | 闵瑞路 | 轨道交通浦江线(沈杜公路-汇臻路) | 121.526112 | 31.050321 |
| 1035 | 浦航路 | 轨道交通浦江线(沈杜公路-汇臻路) | 121.526392 | 31.043280 |
| 1036 | 东城一路 | 轨道交通浦江线(沈杜公路-汇臻路) | 121.527925 | 31.032497 |
| 1037 | 汇臻路 | 轨道交通浦江线(沈杜公路-汇臻路) | 121.520338 | 31.027464 |
1038 rows × 4 columns
- 去重
stop = stop.drop_duplicates( subset = ["stationnames"]) stop = stop[['stationnames', 'lon', 'lat']] stop
| stationnames | lon | lat | |
|---|---|---|---|
| 0 | 富锦路 | 121.420012 | 31.394078 |
| 1 | 友谊西路 | 121.423351 | 31.382958 |
| 2 | 宝安公路 | 121.426290 | 31.371680 |
| 3 | 共富新村 | 121.429462 | 31.356866 |
| 4 | 呼兰路 | 121.433107 | 31.341553 |
| ... | ... | ... | ... |
| 1026 | 汇臻路 | 121.520338 | 31.027464 |
| 1027 | 东城一路 | 121.527925 | 31.032497 |
| 1028 | 浦航路 | 121.526392 | 31.043280 |
| 1029 | 闵瑞路 | 121.526112 | 31.050321 |
| 1030 | 三鲁公路 | 121.523211 | 31.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 | 上海南站 | 翔殷路 | 2 | 121.425219 | 31.156776 | 121.527669 | 31.307069 |
| 1 | 06 | 上海南站 | 翔殷路 | 1 | 121.425219 | 31.156776 | 121.527669 | 31.307069 |
| 2 | 09 | 上海南站 | 翔殷路 | 2 | 121.425219 | 31.156776 | 121.527669 | 31.307069 |
| 3 | 06 | 常熟路 | 翔殷路 | 1 | 121.446706 | 31.215520 | 121.527669 | 31.307069 |
| 4 | 17 | 常熟路 | 翔殷路 | 1 | 121.446706 | 31.215520 | 121.527669 | 31.307069 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 114036 | 14 | 龙阳路 | 华夏中路 | 1 | 121.553154 | 31.205246 | 121.577279 | 31.176771 |
| 114037 | 18 | 龙阳路 | 华夏中路 | 1 | 121.553154 | 31.205246 | 121.577279 | 31.176771 |
| 114038 | 08 | 书院 | 华夏中路 | 1 | 121.846477 | 30.961623 | 121.577279 | 31.176771 |
| 114039 | 08 | 松江新城 | 华夏中路 | 1 | 121.226351 | 31.032349 | 121.577279 | 31.176771 |
| 114040 | 12 | 罗山路 | 华夏中路 | 1 | 121.588877 | 31.155643 | 121.577279 | 31.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 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 |
| 1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 |
| 2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 |
| 3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 |
| 4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
| 442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
| 442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
| 442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
| 442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 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 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 |
| 1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 |
| 2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 |
| 3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 |
| 4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
| 442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
| 442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
| 442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
| 442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 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 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 | 11号线 | 祁连山路 |
| 1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 | 11号线 | 枫桥路 |
| 2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 | 2号线 | 娄山关路 |
| 3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 | 2号线 | 娄山关路 |
| 4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 | 11号线 | 祁连山路 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 | 中山公园 |
| 442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 | 虹桥火车站 |
| 442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 | 中山公园 |
| 442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 | 虹桥火车站 |
| 442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 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 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 | 11号线 | 祁连山路 | 12 |
| 1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 | 11号线 | 枫桥路 | 18 |
| 2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 | 2号线 | 娄山关路 | 08 |
| 3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 | 2号线 | 娄山关路 | 12 |
| 4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 | 11号线 | 祁连山路 | 18 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 | 中山公园 | 23 |
| 442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 | 虹桥火车站 | 23 |
| 442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 | 中山公园 | 23 |
| 442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 | 虹桥火车站 | 23 |
| 442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 | 虹桥火车站 | 23 |
360873 rows × 10 columns
icdata_flowByHour = icdata.groupby(['hour'])['hour'].count().rename("count").reset_index()
icdata_flowByHour
| hour | count | |
|---|---|---|
| 0 | 04 | 6 |
| 1 | 05 | 919 |
| 2 | 06 | 9536 |
| 3 | 07 | 34341 |
| 4 | 08 | 55952 |
| 5 | 09 | 27947 |
| 6 | 10 | 13758 |
| 7 | 11 | 11871 |
| 8 | 12 | 12751 |
| 9 | 13 | 13355 |
| 10 | 14 | 13067 |
| 11 | 15 | 14629 |
| 12 | 16 | 18928 |
| 13 | 17 | 36720 |
| 14 | 18 | 41739 |
| 15 | 19 | 22236 |
| 16 | 20 | 13583 |
| 17 | 21 | 11850 |
| 18 | 22 | 7042 |
| 19 | 23 | 643 |
# 保存重要图标 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.420012 | 31.394078 |
| 1 | 友谊西路 | 地铁1号线(富锦路-莘庄) | 121.423351 | 31.382958 |
| 2 | 宝安公路 | 地铁1号线(富锦路-莘庄) | 121.426290 | 31.371680 |
| 3 | 共富新村 | 地铁1号线(富锦路-莘庄) | 121.429462 | 31.356866 |
| 4 | 呼兰路 | 地铁1号线(富锦路-莘庄) | 121.433107 | 31.341553 |
| ... | ... | ... | ... | ... |
| 1033 | 三鲁公路 | 轨道交通浦江线(沈杜公路-汇臻路) | 121.523211 | 31.058207 |
| 1034 | 闵瑞路 | 轨道交通浦江线(沈杜公路-汇臻路) | 121.526112 | 31.050321 |
| 1035 | 浦航路 | 轨道交通浦江线(沈杜公路-汇臻路) | 121.526392 | 31.043280 |
| 1036 | 东城一路 | 轨道交通浦江线(沈杜公路-汇臻路) | 121.527925 | 31.032497 |
| 1037 | 汇臻路 | 轨道交通浦江线(沈杜公路-汇臻路) | 121.520338 | 31.027464 |
1038 rows × 4 columns
# 去重 只留坐标 stop = stop.drop_duplicates( subset = ["stationnames"]) stop = stop[['stationnames', 'lon', 'lat']] stop
| stationnames | lon | lat | |
|---|---|---|---|
| 0 | 富锦路 | 121.420012 | 31.394078 |
| 1 | 友谊西路 | 121.423351 | 31.382958 |
| 2 | 宝安公路 | 121.426290 | 31.371680 |
| 3 | 共富新村 | 121.429462 | 31.356866 |
| 4 | 呼兰路 | 121.433107 | 31.341553 |
| ... | ... | ... | ... |
| 1026 | 汇臻路 | 121.520338 | 31.027464 |
| 1027 | 东城一路 | 121.527925 | 31.032497 |
| 1028 | 浦航路 | 121.526392 | 31.043280 |
| 1029 | 闵瑞路 | 121.526112 | 31.050321 |
| 1030 | 三鲁公路 | 121.523211 | 31.058207 |
387 rows × 3 columns
# 为了merge重命名 stop.columns = ['station', 'lon', 'lat'] stop
| station | lon | lat | |
|---|---|---|---|
| 0 | 富锦路 | 121.420012 | 31.394078 |
| 1 | 友谊西路 | 121.423351 | 31.382958 |
| 2 | 宝安公路 | 121.426290 | 31.371680 |
| 3 | 共富新村 | 121.429462 | 31.356866 |
| 4 | 呼兰路 | 121.433107 | 31.341553 |
| ... | ... | ... | ... |
| 1026 | 汇臻路 | 121.520338 | 31.027464 |
| 1027 | 东城一路 | 121.527925 | 31.032497 |
| 1028 | 浦航路 | 121.526392 | 31.043280 |
| 1029 | 闵瑞路 | 121.526112 | 31.050321 |
| 1030 | 三鲁公路 | 121.523211 | 31.058207 |
387 rows × 3 columns
icdata_flowStation = pd.merge(icdata_flowStation,stop,on='station', how ='left') icdata_flowStation
| station | count | lon | lat | |
|---|---|---|---|---|
| 0 | 人民广场 | 8615 | 121.470635 | 31.234938 |
| 1 | 上海火车站 | 7383 | 121.451347 | 31.249252 |
| 2 | 徐家汇 | 6339 | 121.433730 | 31.194666 |
| 3 | 静安寺 | 6203 | 121.441679 | 31.225084 |
| 4 | 陆家嘴 | 5744 | 121.497950 | 31.240191 |
| 5 | 南京东路 | 5266 | 121.479244 | 31.239115 |
| 6 | 中山公园 | 5264 | 121.413736 | 31.220411 |
| 7 | 莘庄 | 5137 | 121.381116 | 31.112982 |
| 8 | 陕西南路 | 5083 | 121.455640 | 31.219225 |
| 9 | 南京西路 | 4165 | 121.455507 | 31.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 | 82024 | 2015-04-01 | 08:48:25 | 8号线西藏北路 | 地铁 | 0.0 | 非优惠 | 8号线 | 西藏北路 | 08 | 8.202400e+04 | 2015-04-01 | 09:07:29 | 10号线江湾体育场 | 地铁 | 4.0 | 非优惠 | 10号线 | 江湾体育场 | 09 |
| 381022 | 88957 | 2015-04-01 | 15:46:58 | 3号线宜山路 | 地铁 | 0.0 | 非优惠 | 3号线 | 宜山路 | 15 | 8.895700e+04 | 2015-04-01 | 16:20:58 | 3号线东宝兴路 | 地铁 | 4.0 | 非优惠 | 3号线 | 东宝兴路 | 16 |
| 376286 | 99313 | 2015-04-01 | 08:26:26 | 8号线延吉中路 | 地铁 | 0.0 | 非优惠 | 8号线 | 延吉中路 | 08 | 9.931300e+04 | 2015-04-01 | 09:07:27 | 9号线打浦桥 | 地铁 | 4.0 | 非优惠 | 9号线 | 打浦桥 | 09 |
| 376285 | 99313 | 2015-04-01 | 18:09:51 | 9号线打浦桥 | 地铁 | 0.0 | 非优惠 | 9号线 | 打浦桥 | 18 | 9.931300e+04 | 2015-04-01 | 18:46:06 | 8号线延吉中路 | 地铁 | 4.0 | 非优惠 | 8号线 | 延吉中路 | 18 |
| 6062 | 116435 | 2015-04-01 | 12:24:49 | 4号线大连路 | 地铁 | 0.0 | 非优惠 | 4号线 | 大连路 | 12 | 1.164350e+05 | 2015-04-01 | 12:56:16 | 3号线中山公园 | 地铁 | 3.0 | 优惠 | 3号线 | 中山公园 | 12 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 234888 | 4000038121 | 2015-04-01 | 08:19:28 | 13号线金运路 | 地铁 | 0.0 | 非优惠 | 13号线 | 金运路 | 08 | 4.000038e+09 | 2015-04-01 | 09:05:42 | 1号线人民广场 | 地铁 | 3.0 | 优惠 | 1号线 | 人民广场 | 09 |
| 234889 | 4000038121 | 2015-04-01 | 21:32:28 | 1号线人民广场 | 地铁 | 0.0 | 非优惠 | 1号线 | 人民广场 | 21 | 4.000038e+09 | 2015-04-01 | 22:12:52 | 13号线金运路 | 地铁 | 4.0 | 非优惠 | 13号线 | 金运路 | 22 |
| 218392 | 4000039067 | 2015-04-01 | 07:22:58 | 5号线剑川路 | 地铁 | 0.0 | 非优惠 | 5号线 | 剑川路 | 07 | 4.000039e+09 | 2015-04-01 | 07:32:48 | 5号线颛桥 | 地铁 | 1.0 | 优惠 | 5号线 | 颛桥 | 07 |
| 373585 | 4000039743 | 2015-04-01 | 18:11:15 | 2号线南京西路 | 地铁 | 0.0 | 非优惠 | 2号线 | 南京西路 | 18 | 4.000040e+09 | 2015-04-01 | 18:28:44 | 10号线交通大学 | 地铁 | 3.0 | 非优惠 | 10号线 | 交通大学 | 18 |
| 171701 | 4000040665 | 2015-04-01 | 08:48:34 | 4号线上海体育场 | 地铁 | 0.0 | 非优惠 | 4号线 | 上海体育场 | 08 | 4.000041e+09 | 2015-04-01 | 09:16:55 | 10号线南京东路 | 地铁 | 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 | 82024 | 2015-04-01 | 08:48:25 | 8号线 | 西藏北路 | 09:07:29 | 4.0 | 10号线 | 江湾体育场 |
| 381022 | 88957 | 2015-04-01 | 15:46:58 | 3号线 | 宜山路 | 16:20:58 | 4.0 | 3号线 | 东宝兴路 |
| 376286 | 99313 | 2015-04-01 | 08:26:26 | 8号线 | 延吉中路 | 09:07:27 | 4.0 | 9号线 | 打浦桥 |
| 376285 | 99313 | 2015-04-01 | 18:09:51 | 9号线 | 打浦桥 | 18:46:06 | 4.0 | 8号线 | 延吉中路 |
| 6062 | 116435 | 2015-04-01 | 12:24:49 | 4号线 | 大连路 | 12:56:16 | 3.0 | 3号线 | 中山公园 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 234888 | 4000038121 | 2015-04-01 | 08:19:28 | 13号线 | 金运路 | 09:05:42 | 3.0 | 1号线 | 人民广场 |
| 234889 | 4000038121 | 2015-04-01 | 21:32:28 | 1号线 | 人民广场 | 22:12:52 | 4.0 | 13号线 | 金运路 |
| 218392 | 4000039067 | 2015-04-01 | 07:22:58 | 5号线 | 剑川路 | 07:32:48 | 1.0 | 5号线 | 颛桥 |
| 373585 | 4000039743 | 2015-04-01 | 18:11:15 | 2号线 | 南京西路 | 18:28:44 | 3.0 | 10号线 | 交通大学 |
| 171701 | 4000040665 | 2015-04-01 | 08:48:34 | 4号线 | 上海体育场 | 09:16:55 | 4.0 | 10号线 | 南京东路 |
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 | 82024 | 2015-04-01 | 08:48:25 | 8号线 | 西藏北路 | 09:07:29 | 4.0 | 10号线 | 江湾体育场 |
| 381022 | 88957 | 2015-04-01 | 15:46:58 | 3号线 | 宜山路 | 16:20:58 | 4.0 | 3号线 | 东宝兴路 |
| 376286 | 99313 | 2015-04-01 | 08:26:26 | 8号线 | 延吉中路 | 09:07:27 | 4.0 | 9号线 | 打浦桥 |
| 376285 | 99313 | 2015-04-01 | 18:09:51 | 9号线 | 打浦桥 | 18:46:06 | 4.0 | 8号线 | 延吉中路 |
| 6062 | 116435 | 2015-04-01 | 12:24:49 | 4号线 | 大连路 | 12:56:16 | 3.0 | 3号线 | 中山公园 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 234888 | 4000038121 | 2015-04-01 | 08:19:28 | 13号线 | 金运路 | 09:05:42 | 3.0 | 1号线 | 人民广场 |
| 234889 | 4000038121 | 2015-04-01 | 21:32:28 | 1号线 | 人民广场 | 22:12:52 | 4.0 | 13号线 | 金运路 |
| 218392 | 4000039067 | 2015-04-01 | 07:22:58 | 5号线 | 剑川路 | 07:32:48 | 1.0 | 5号线 | 颛桥 |
| 373585 | 4000039743 | 2015-04-01 | 18:11:15 | 2号线 | 南京西路 | 18:28:44 | 3.0 | 10号线 | 交通大学 |
| 171701 | 4000040665 | 2015-04-01 | 08:48:34 | 4号线 | 上海体育场 | 09:16:55 | 4.0 | 10号线 | 南京东路 |
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.420012 | 31.394078 |
| 1 | 友谊西路 | 121.423351 | 31.382958 |
| 2 | 宝安公路 | 121.426290 | 31.371680 |
| 3 | 共富新村 | 121.429462 | 31.356866 |
| 4 | 呼兰路 | 121.433107 | 31.341553 |
| ... | ... | ... | ... |
| 1026 | 汇臻路 | 121.520338 | 31.027464 |
| 1027 | 东城一路 | 121.527925 | 31.032497 |
| 1028 | 浦航路 | 121.526392 | 31.043280 |
| 1029 | 闵瑞路 | 121.526112 | 31.050321 |
| 1030 | 三鲁公路 | 121.523211 | 31.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 | 九亭 | 漕河泾开发区 | 162 | 121.315005 | 31.139231 | 121.392981 | 31.172309 |
| 1 | 通河新村 | 上海火车站 | 162 | 121.436928 | 31.332913 | 121.451347 | 31.249252 |
| 2 | 彭浦新村 | 上海火车站 | 124 | 121.444092 | 31.308468 | 121.451347 | 31.249252 |
| 3 | 莘庄 | 徐家汇 | 150 | 121.381116 | 31.112982 | 121.433730 | 31.194666 |
| 4 | 莘庄 | 人民广场 | 121 | 121.381116 | 31.112982 | 121.470635 | 31.234938 |
| 5 | 徐家汇 | 莘庄 | 137 | 121.433730 | 31.194666 | 121.381116 | 31.112982 |
| 6 | 人民广场 | 莘庄 | 117 | 121.470635 | 31.234938 | 121.381116 | 31.112982 |
| 7 | 陕西南路 | 莘庄 | 116 | 121.455640 | 31.219225 | 121.381116 | 31.112982 |
| 8 | 陆家嘴 | 南京东路 | 132 | 121.497950 | 31.240191 | 121.479244 | 31.239115 |
| 9 | 漕河泾开发区 | 九亭 | 129 | 121.392981 | 31.172309 | 121.315005 | 31.139231 |
# 保存重要图标 od1.to_csv(r'ODsort10.csv', index = None)



