栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【小旭学长-使用python进行城市数据分析】笔记篇(下)【完结】

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【小旭学长-使用python进行城市数据分析】笔记篇(下)【完结】

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

五. IC刷卡数据的基本处理 5.1基于IC刷卡数据的地铁OD提取

① 读取数据,添加列名

import pandas as pd

data = pd.read_csv("SPTCC-20150401-sample.csv",header = None)
data

0123456
01004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠
11004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠
21004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠
31004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠
41004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠
........................
44285523011082662015-04-0123:48:212号线中山公园地铁4.0非优惠
44285623011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠
44285721041621232015-04-0123:48:072号线中山公园地铁4.0非优惠
44285821041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠
44285931038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠

442860 rows × 7 columns

data.columns = ['ID', 'date', 'Time', 'stop', 'mode', 'price', 'type']
data
IDdateTimestopmodepricetype
01004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠
11004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠
21004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠
31004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠
41004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠
........................
44285523011082662015-04-0123:48:212号线中山公园地铁4.0非优惠
44285623011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠
44285721041621232015-04-0123:48:072号线中山公园地铁4.0非优惠
44285821041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠
44285931038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠

442860 rows × 7 columns

② 帅选出地铁方式的出行,并将站点信息拆成,线路和站名

data = data[data['mode'] == '地铁']
data
IDdateTimestopmodepricetype
01004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠
11004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠
21004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠
31004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠
41004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠
........................
44285523011082662015-04-0123:48:212号线中山公园地铁4.0非优惠
44285623011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠
44285721041621232015-04-0123:48:072号线中山公园地铁4.0非优惠
44285821041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠
44285931038851412015-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.
IDdateTimestopmodepricetypeline
01004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠11号线
11004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠11号线
21004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠2号线
31004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠2号线
41004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠11号线
...........................
44285523011082662015-04-0123:48:212号线中山公园地铁4.0非优惠2号线
44285623011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠2号线
44285721041621232015-04-0123:48:072号线中山公园地铁4.0非优惠2号线
44285821041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠2号线
44285931038851412015-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.
IDdateTimestopmodepricetypeline
01004058442015-04-0112:43:24祁连山路地铁4.0非优惠11号线
11004058442015-04-0118:22:04枫桥路地铁3.0非优惠11号线
21004058442015-04-0108:21:18娄山关路地铁3.0非优惠2号线
31004058442015-04-0112:07:31娄山关路地铁0.0非优惠2号线
41004058442015-04-0118:08:42祁连山路地铁0.0非优惠11号线
...........................
44285523011082662015-04-0123:48:21中山公园地铁4.0非优惠2号线
44285623011082662015-04-0123:06:45虹桥火车站地铁0.0非优惠2号线
44285721041621232015-04-0123:48:07中山公园地铁4.0非优惠2号线
44285821041621232015-04-0123:18:16虹桥火车站地铁0.0非优惠2号线
44285931038851412015-04-0123: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
IDdateTimestopmodepricetypelineID1
334427820242015-04-0108:48:25西藏北路地铁0.0非优惠8号线8.202400e+04
334426820242015-04-0109:07:29江湾体育场地铁4.0非优惠10号线8.895700e+04
381022889572015-04-0115:46:58宜山路地铁0.0非优惠3号线8.895700e+04
381021889572015-04-0116:20:58东宝兴路地铁4.0非优惠3号线9.931300e+04
376286993132015-04-0108:26:26延吉中路地铁0.0非优惠8号线9.931300e+04
..............................
21839140000390672015-04-0107:32:48颛桥地铁1.0优惠5号线4.000040e+09
37358540000397432015-04-0118:11:15南京西路地铁0.0非优惠2号线4.000040e+09
37358440000397432015-04-0118:28:44交通大学地铁3.0非优惠10号线4.000041e+09
17170140000406652015-04-0108:48:34上海体育场地铁0.0非优惠4号线4.000041e+09
17170240000406652015-04-0109:16:55南京东路地铁4.0非优惠10号线NaN

360873 rows × 9 columns

# 确实有上移 那么我们把测试的这列去掉
data = data.drop('ID1' ,axis = 1)
data
 
 
 
IDdateTimestopmodepricetypeline
334427820242015-04-0108:48:25西藏北路地铁0.0非优惠8号线
334426820242015-04-0109:07:29江湾体育场地铁4.0非优惠10号线
381022889572015-04-0115:46:58宜山路地铁0.0非优惠3号线
381021889572015-04-0116:20:58东宝兴路地铁4.0非优惠3号线
376286993132015-04-0108:26:26延吉中路地铁0.0非优惠8号线
...........................
21839140000390672015-04-0107:32:48颛桥地铁1.0优惠5号线
37358540000397432015-04-0118:11:15南京西路地铁0.0非优惠2号线
37358440000397432015-04-0118:28:44交通大学地铁3.0非优惠10号线
17170140000406652015-04-0108:48:34上海体育场地铁0.0非优惠4号线
17170240000406652015-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
IDdateTimestopmodepricetypelineID1date1Time1stop1mode1price1type1line1
334427820242015-04-0108:48:25西藏北路地铁0.0非优惠8号线8.202400e+042015-04-0109:07:29江湾体育场地铁4.0非优惠10号线
334426820242015-04-0109:07:29江湾体育场地铁4.0非优惠10号线8.895700e+042015-04-0115:46:58宜山路地铁0.0非优惠3号线
381022889572015-04-0115:46:58宜山路地铁0.0非优惠3号线8.895700e+042015-04-0116:20:58东宝兴路地铁4.0非优惠3号线
381021889572015-04-0116:20:58东宝兴路地铁4.0非优惠3号线9.931300e+042015-04-0108:26:26延吉中路地铁0.0非优惠8号线
376286993132015-04-0108:26:26延吉中路地铁0.0非优惠8号线9.931300e+042015-04-0109:07:27打浦桥地铁4.0非优惠9号线
...................................................
21839140000390672015-04-0107:32:48颛桥地铁1.0优惠5号线4.000040e+092015-04-0118:11:15南京西路地铁0.0非优惠2号线
37358540000397432015-04-0118:11:15南京西路地铁0.0非优惠2号线4.000040e+092015-04-0118:28:44交通大学地铁3.0非优惠10号线
37358440000397432015-04-0118:28:44交通大学地铁3.0非优惠10号线4.000041e+092015-04-0108:48:34上海体育场地铁0.0非优惠4号线
17170140000406652015-04-0108:48:34上海体育场地铁0.0非优惠4号线4.000041e+092015-04-0109:16:55南京东路地铁4.0非优惠10号线
17170240000406652015-04-0109:16:55南京东路地铁4.0非优惠10号线NaNNaNNaNNaNNaNNaNNaNNaN

360873 rows × 16 columns

  • 让数据选出同一人的行为
data = data[data['ID'] == data['ID1']]
data
IDdateTimestopmodepricetypelineID1date1Time1stop1mode1price1type1line1
334427820242015-04-0108:48:25西藏北路地铁0.0非优惠8号线8.202400e+042015-04-0109:07:29江湾体育场地铁4.0非优惠10号线
381022889572015-04-0115:46:58宜山路地铁0.0非优惠3号线8.895700e+042015-04-0116:20:58东宝兴路地铁4.0非优惠3号线
376286993132015-04-0108:26:26延吉中路地铁0.0非优惠8号线9.931300e+042015-04-0109:07:27打浦桥地铁4.0非优惠9号线
376283993132015-04-0109:07:27打浦桥地铁4.0非优惠9号线9.931300e+042015-04-0118:09:51打浦桥地铁0.0非优惠9号线
376285993132015-04-0118:09:51打浦桥地铁0.0非优惠9号线9.931300e+042015-04-0118:46:06延吉中路地铁4.0非优惠8号线
...................................................
23488740000381212015-04-0109:05:42人民广场地铁3.0优惠1号线4.000038e+092015-04-0121:32:28人民广场地铁0.0非优惠1号线
23488940000381212015-04-0121:32:28人民广场地铁0.0非优惠1号线4.000038e+092015-04-0122:12:52金运路地铁4.0非优惠13号线
21839240000390672015-04-0107:22:58剑川路地铁0.0非优惠5号线4.000039e+092015-04-0107:32:48颛桥地铁1.0优惠5号线
37358540000397432015-04-0118:11:15南京西路地铁0.0非优惠2号线4.000040e+092015-04-0118:28:44交通大学地铁3.0非优惠10号线
17170140000406652015-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
IDdateTimestopmodepricetypelineTime1stop1mode1price1type1line1
334427820242015-04-0108:48:25西藏北路地铁0.0非优惠8号线09:07:29江湾体育场地铁4.0非优惠10号线
381022889572015-04-0115:46:58宜山路地铁0.0非优惠3号线16:20:58东宝兴路地铁4.0非优惠3号线
376286993132015-04-0108:26:26延吉中路地铁0.0非优惠8号线09:07:27打浦桥地铁4.0非优惠9号线
376285993132015-04-0118:09:51打浦桥地铁0.0非优惠9号线18:46:06延吉中路地铁4.0非优惠8号线
60621164352015-04-0112:24:49大连路地铁0.0非优惠4号线12:56:16中山公园地铁3.0优惠3号线
.............................................
23488840000381212015-04-0108:19:28金运路地铁0.0非优惠13号线09:05:42人民广场地铁3.0优惠1号线
23488940000381212015-04-0121:32:28人民广场地铁0.0非优惠1号线22:12:52金运路地铁4.0非优惠13号线
21839240000390672015-04-0107:22:58剑川路地铁0.0非优惠5号线07:32:48颛桥地铁1.0优惠5号线
37358540000397432015-04-0118:11:15南京西路地铁0.0非优惠2号线18:28:44交通大学地铁3.0非优惠10号线
17170140000406652015-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
IDdatestimeslinesstationetimeelineestationprice
334427820242015-04-0108:48:258号线西藏北路09:07:2910号线江湾体育场4.0
381022889572015-04-0115:46:583号线宜山路16:20:583号线东宝兴路4.0
376286993132015-04-0108:26:268号线延吉中路09:07:279号线打浦桥4.0
376285993132015-04-0118:09:519号线打浦桥18:46:068号线延吉中路4.0
60621164352015-04-0112:24:494号线大连路12:56:163号线中山公园3.0
..............................
23488840000381212015-04-0108:19:2813号线金运路09:05:421号线人民广场3.0
23488940000381212015-04-0121:32:281号线人民广场22:12:5213号线金运路4.0
21839240000390672015-04-0107:22:585号线剑川路07:32:485号线颛桥1.0
37358540000397432015-04-0118:11:152号线南京西路18:28:4410号线交通大学3.0
17170140000406652015-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
IDdatestimeslinesstationetimeelineestationpricehour
0820242015-04-0108:48:258号线西藏北路09:07:2910号线江湾体育场4.008
1889572015-04-0115:46:583号线宜山路16:20:583号线东宝兴路4.015
2993132015-04-0108:26:268号线延吉中路09:07:279号线打浦桥4.008
3993132015-04-0118:09:519号线打浦桥18:46:068号线延吉中路4.018
41164352015-04-0112:24:494号线大连路12:56:163号线中山公园3.012
.................................
17893840000381212015-04-0108:19:2813号线金运路09:05:421号线人民广场3.008
17893940000381212015-04-0121:32:281号线人民广场22:12:5213号线金运路4.021
17894040000390672015-04-0107:22:585号线剑川路07:32:485号线颛桥1.007
17894140000397432015-04-0118:11:152号线南京西路18:28:4410号线交通大学3.018
17894240000406652015-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
hoursstationestationcount
004上海南站翔殷路2
104常熟路新闸路1
204漕宝路汶水路1
305七宝打浦桥1
405七宝新村路1
...............
11793923静安寺中山公园1
11794023静安寺娄山关路1
11794123马陆马陆1
11794223黄陂南路外环路1
11794323龙华中路耀华路1

117944 rows × 4 columns

⑥ 读取站点信息坐标

stop = pd.read_csv(r"stop.csv")
stop
stationnameslinenamelonlat
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
stationnameslonlat
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
hoursstationestationcountslonslatelonelat
004上海南站翔殷路2121.42521931.156776121.52766931.307069
106上海南站翔殷路1121.42521931.156776121.52766931.307069
209上海南站翔殷路2121.42521931.156776121.52766931.307069
306常熟路翔殷路1121.44670631.215520121.52766931.307069
417常熟路翔殷路1121.44670631.215520121.52766931.307069
...........................
11403614龙阳路华夏中路1121.55315431.205246121.57727931.176771
11403718龙阳路华夏中路1121.55315431.205246121.57727931.176771
11403808书院华夏中路1121.84647730.961623121.57727931.176771
11403908松江新城华夏中路1121.22635131.032349121.57727931.176771
11404012罗山路华夏中路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
0123456
01004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠
11004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠
21004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠
31004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠
41004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠
........................
44285523011082662015-04-0123:48:212号线中山公园地铁4.0非优惠
44285623011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠
44285721041621232015-04-0123:48:072号线中山公园地铁4.0非优惠
44285821041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠
44285931038851412015-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
IDdateTimestopmodepricetype
01004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠
11004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠
21004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠
31004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠
41004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠
........................
44285523011082662015-04-0123:48:212号线中山公园地铁4.0非优惠
44285623011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠
44285721041621232015-04-0123:48:072号线中山公园地铁4.0非优惠
44285821041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠
44285931038851412015-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
IDdateTimestopmodepricetypelinestation
01004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠11号线祁连山路
11004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠11号线枫桥路
21004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠2号线娄山关路
31004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠2号线娄山关路
41004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠11号线祁连山路
..............................
44285523011082662015-04-0123:48:212号线中山公园地铁4.0非优惠2号线中山公园
44285623011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠2号线虹桥火车站
44285721041621232015-04-0123:48:072号线中山公园地铁4.0非优惠2号线中山公园
44285821041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠2号线虹桥火车站
44285931038851412015-04-0123:16:192号线虹桥火车站地铁0.0非优惠2号线虹桥火车站

360873 rows × 9 columns

  • 解决第一个问题,每一条地铁线路的客流量
od_flow = icdata.groupby(['line'])['line'].count().rename("count").reset_index()
od_flow
linecount
010号线25596
111号线22259
212号线6409
313号线6261
416号线3470
51号线54415
62号线59026
73号线32993
84号线24162
95号线5758
106号线15677
117号线31465
128号线38366
139号线35016
# 保存重要图标
od_flow.to_csv(r'od_flow.csv', index = None)

7.2 统计每小时搭乘地铁的客流量

② 吧小时单独拿出来进行统计

icdata['hour'] = icdata['Time'].apply(lambda r:r[:2])
icdata
IDdateTimestopmodepricetypelinestationhour
01004058442015-04-0112:43:2411号线祁连山路地铁4.0非优惠11号线祁连山路12
11004058442015-04-0118:22:0411号线枫桥路地铁3.0非优惠11号线枫桥路18
21004058442015-04-0108:21:182号线娄山关路地铁3.0非优惠2号线娄山关路08
31004058442015-04-0112:07:312号线娄山关路地铁0.0非优惠2号线娄山关路12
41004058442015-04-0118:08:4211号线祁连山路地铁0.0非优惠11号线祁连山路18
.................................
44285523011082662015-04-0123:48:212号线中山公园地铁4.0非优惠2号线中山公园23
44285623011082662015-04-0123:06:452号线虹桥火车站地铁0.0非优惠2号线虹桥火车站23
44285721041621232015-04-0123:48:072号线中山公园地铁4.0非优惠2号线中山公园23
44285821041621232015-04-0123:18:162号线虹桥火车站地铁0.0非优惠2号线虹桥火车站23
44285931038851412015-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
hourcount
0046
105919
2069536
30734341
40855952
50927947
61013758
71111871
81212751
91313355
101413067
111514629
121618928
131736720
141841739
151922236
162013583
172111850
18227042
1923643
# 保存重要图标
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
stationcount
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)
stationcount
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
stationcount
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
stationnameslinenamelonlat
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
stationnameslonlat
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
stationlonlat
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
stationcountlonlat
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
IDdateTimestopmodepricetypelinestationhourID1date1Time1stop1mode1price1type1line1station1hour1
334427820242015-04-0108:48:258号线西藏北路地铁0.0非优惠8号线西藏北路088.202400e+042015-04-0109:07:2910号线江湾体育场地铁4.0非优惠10号线江湾体育场09
381022889572015-04-0115:46:583号线宜山路地铁0.0非优惠3号线宜山路158.895700e+042015-04-0116:20:583号线东宝兴路地铁4.0非优惠3号线东宝兴路16
376286993132015-04-0108:26:268号线延吉中路地铁0.0非优惠8号线延吉中路089.931300e+042015-04-0109:07:279号线打浦桥地铁4.0非优惠9号线打浦桥09
376285993132015-04-0118:09:519号线打浦桥地铁0.0非优惠9号线打浦桥189.931300e+042015-04-0118:46:068号线延吉中路地铁4.0非优惠8号线延吉中路18
60621164352015-04-0112:24:494号线大连路地铁0.0非优惠4号线大连路121.164350e+052015-04-0112:56:163号线中山公园地铁3.0优惠3号线中山公园12
...............................................................
23488840000381212015-04-0108:19:2813号线金运路地铁0.0非优惠13号线金运路084.000038e+092015-04-0109:05:421号线人民广场地铁3.0优惠1号线人民广场09
23488940000381212015-04-0121:32:281号线人民广场地铁0.0非优惠1号线人民广场214.000038e+092015-04-0122:12:5213号线金运路地铁4.0非优惠13号线金运路22
21839240000390672015-04-0107:22:585号线剑川路地铁0.0非优惠5号线剑川路074.000039e+092015-04-0107:32:485号线颛桥地铁1.0优惠5号线颛桥07
37358540000397432015-04-0118:11:152号线南京西路地铁0.0非优惠2号线南京西路184.000040e+092015-04-0118:28:4410号线交通大学地铁3.0非优惠10号线交通大学18
17170140000406652015-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
IDdateTimelinestationTime1price1line1station1
334427820242015-04-0108:48:258号线西藏北路09:07:294.010号线江湾体育场
381022889572015-04-0115:46:583号线宜山路16:20:584.03号线东宝兴路
376286993132015-04-0108:26:268号线延吉中路09:07:274.09号线打浦桥
376285993132015-04-0118:09:519号线打浦桥18:46:064.08号线延吉中路
60621164352015-04-0112:24:494号线大连路12:56:163.03号线中山公园
..............................
23488840000381212015-04-0108:19:2813号线金运路09:05:423.01号线人民广场
23488940000381212015-04-0121:32:281号线人民广场22:12:524.013号线金运路
21839240000390672015-04-0107:22:585号线剑川路07:32:481.05号线颛桥
37358540000397432015-04-0118:11:152号线南京西路18:28:443.010号线交通大学
17170140000406652015-04-0108:48:344号线上海体育场09:16:554.010号线南京东路

178943 rows × 9 columns

# 重命名
od.columns = ["ID", 'date', 'stime', 'sline', 'sstation', 'etime', 'price', 'eline', 'estation']
od
IDdatestimeslinesstationetimepriceelineestation
334427820242015-04-0108:48:258号线西藏北路09:07:294.010号线江湾体育场
381022889572015-04-0115:46:583号线宜山路16:20:584.03号线东宝兴路
376286993132015-04-0108:26:268号线延吉中路09:07:274.09号线打浦桥
376285993132015-04-0118:09:519号线打浦桥18:46:064.08号线延吉中路
60621164352015-04-0112:24:494号线大连路12:56:163.03号线中山公园
..............................
23488840000381212015-04-0108:19:2813号线金运路09:05:423.01号线人民广场
23488940000381212015-04-0121:32:281号线人民广场22:12:524.013号线金运路
21839240000390672015-04-0107:22:585号线剑川路07:32:481.05号线颛桥
37358540000397432015-04-0118:11:152号线南京西路18:28:443.010号线交通大学
17170140000406652015-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
sstationestationcount
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
sstationestationcount
0九亭漕河泾开发区162
1通河新村上海火车站162
2莘庄徐家汇150
3徐家汇莘庄137
4陆家嘴南京东路132
5漕河泾开发区九亭129
6彭浦新村上海火车站124
7莘庄人民广场121
8人民广场莘庄117
9陕西南路莘庄116
  • 没有按小时 按得是一天 所以没有对hour进行集计
  • 排序 取前十

⑦ 将车站坐标引进

stop
estationelonelat
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
sstationestationcountslonslatelonelat
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)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/488397.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号