之前在网上看到了分析北京地铁客流数据的开源项目,就想试着分析一下南京地铁的客流数据,可是找了很久没有找到可以获得南京地铁客流数据的接口,就去南京地铁微博看了一下,果然跟北京地铁一样,基本上每天都会更新客流数据。所以开始动手~
爬南京地铁微博,获取有用的数据并保存成txt文件
首先,百度搜一下Python爬新浪微博内容的框架,有很多很多,我们选择一个,随便改改,发现可以用啦:
南京地铁微博ID:2638276292
根据下面的条件进行初步的筛选,基本上可以找到对应的微博。
进群:960410445 获取源码!
weibocontentindex=str(text).find("南京地铁")
weibocontentindex2=str(text).find("客运")
if weibocontentindex > -1 and weibocontentindex2 > -1:
fh.write(text[weibocontentindex-1:]+' ')
然后我们就初步保存了南京地铁微博中发布的客流数据。
读取txt文件,整理好数据后存入sqlite3数据库
因为微博是工作人员发布的,存在一些文本格式上的问题,还有表述上的区别,所以首先处理这些异常。这里面有很多坑,慢慢踩~
然后根据日期换算为实际的日期,以日期为唯一索引,将当日的所有客流数据存入sqlite3中。
def getdate(date1):
global year1
if date1.find('月') != -1:
date1=date1.replace('月',';')
date1=date1.replace('日',';')
list2=date1.split(';')
if '1' == list2[0] and '2' == list2[1]:
year1=year1-1
date2=str(year1)+'-'+list2[0]+'-'+list2[1]
else:
date2=str(year1)+'-'+list2[0]+'-'+list2[1]
date3 = datetime.datetime.strptime(date2,'%Y-%m-%d').date()
return date3
create_table_sql = '''CREATE TABLE `NajingMetro` (
`DATE` varchar(20) NOT NULL,
`LineALL` REAL(20) DEFAULT NULL,
`Line1` REAL(20) DEFAULT NULL,
`Line2` REAL(20) DEFAULT NULL,
`Line3` REAL(20) DEFAULT NULL,
`Line4` REAL(20) DEFAULT NULL,
`Line10` REAL(20) DEFAULT NULL,
`LineS1` REAL(20) DEFAULT NULL,
`LineS3` REAL(20) DEFAULT NULL,
`LineS7` REAL(20) DEFAULT NULL,
`LineS8` REAL(20) DEFAULT NULL,
`LineS9` REAL(20) DEFAULT NULL,
PRIMARY KEY (`DATE`)
)'''
然后就得到较为完整的数据了:
读取数据库,绘图
使用SQL语句,从数据库中读入我们的数据,将数据转换成为List,使用pyechart进行绘图,然后取最近30天的数据,绘制饼图。
结果分析
我们可以发现一个有趣的现象:周一到周五的客流要比周六周日多。
此外,2018年十一假期,选择9月30日出行的最多。
一年的极小值出现在过年的时候,整体客流都比较少。
上图为各线路占比(取数据中最近30天客流)。结合上面的数据,其实还发现一点,就是平时二号线人数略微多于三号线人数,但是节假日三号线人数会反超,这时因为三号线上有南京站、南京南站两个车站。
整体的客流趋势是在上升的。