地铁大数据挖掘之数据预处理

您所在的位置:网站首页 交通数据挖掘与分析 地铁大数据挖掘之数据预处理

地铁大数据挖掘之数据预处理

2023-08-04 12:54| 来源: 网络整理| 查看: 265

    这是很久以前写的一段代码,很简单很基础。最近突然用到,这里把它分享出来,希望可以为有需要的朋友提供帮助。

   以及欢迎阅读这一系列第二篇:地铁大数据挖掘之客流数据预处理——从原始一卡通数据提取城市地铁客流(二)

1 解压文件

    这里以上海城市开放大赛提供的数据为样例(提取码m4og),需要的朋友可以进行下载。把数据进行解压后,看到是一个个压缩文件:

    接下来,可以用下面这段代码对这些数据进行解压:

import gzip import os from datetime import datetime import shutil #解压文件 def un_gz(file_name): """ungz zip file""" f_name = file_name.replace(".gz", "") #获取文件的名称,去掉 g_file = gzip.GzipFile(file_name) #创建gzip对象 open(f_name, "wb+").write(g_file.read()) #gzip对象用read()打开后,写入open()建立的文件中。 g_file.close() #关闭gzip对象 date_l=[datetime.strftime(x,'%Y%m%d') for x in list(pd.date_range('20150401','20150430'))] file_name=[] for x in date_l: filename="SPTCC-"+x+'.csv.gz' file_name.append(filename) for each in file_name: un_gz(each) #创建文件夹 os.mkdir('railway_data') #将解压后的文件移至新文件夹 file_name2=[] for x in date_l: filename="SPTCC-"+x+'.csv' file_name2.append(filename) for each in file_name2: shutil.move(each,"railway_data") 2 提取客流    

    进去新创建的文件夹,可以先看一下数据的样子:

import pandas as pd f=open("SPTCC-20150401.csv") data=pd.read_csv(f,header=0,names=["cardnum","date","time","linename","business","figure","attribute"]) data.head()

    这一步我们想得到的结果是某个站点每十分钟的客流。从“business”字段可以看出,这里的数据不仅有地铁的,还有公交等其他数据。而且根据常识,地铁客流是分进站和出战的。因此,我们也想分别得到某一时间片内某站的地铁进站和出站客流。

 2.1 提取地铁数据

    刚刚讲到,可以通过“business”这一字段判断是否为地铁数据,因此代码如下:

def railway_data(data): RailWay=data[data["business"]=="地铁"] return RailWay 2.2 划分相应时间片

    这里用到的字段是“time”。可能会有很方便的做法,如果有更好的方便也欢迎朋友们批评指正。我这里用到的是一种十分笨的办法,我把时间看作“六十进制”的数字,对时、分和秒分别乘以3600、60和1,最后获得一个类似于“时间戳”一样的数字,再对时间片进行划分。

#计算“时间戳” def timespan(data): data["timespan"]=data["time"].apply(lambda x:x[:2]).astype(int)*3600+data["time"].apply(lambda x:x[3:5]).astype(int)*60+data["time"].apply(lambda x:x[6:]).astype(int) return data #划分时间片 def timebins(data): #计算每个时间片的秒数间隔 seconds=[600*x for x in range(0,145)] #给时间片做标签 label=[x for x in range(1,145)] #这里利用的是pandas的分箱操作 _10min=pd.cut(data["timespan"],bins=seconds,labels=label) _10mins=_10min.get_values() data['_10mins']=_10mins return data 2.3 提取进出站客流

    这里利用的是字段“figure"。很明显,根据日常生活经验,进站时打卡是不花钱的,出站时根据里程数计费。所以,这里根据“figure"值是否为0判断进出站。

def input_data(data): inputdata=data[data["figure"]==0] return inputdata def output_data(data): output=data[data["figure"]>0] return output 2.4 对客流进行统计

    之后,对每一个站点的不同时间片客流进行统计:

def groupby_data(data): grouped_data=data.groupby(["linename","_10mins"]).count() manageG=grouped_data.reset_index(drop=False) del grouped_data gc.collect() manageG.drop(["cardnum","date","time","business","figure","attribute"],axis=1,inplace=True) manageG.rename(columns={"timespan":"passengernums"},inplace=True) return manageG 2.5 融合进出站客流 #mi是进站数据,mo是出站数据 def merge_data(mi,mo): final_data=pd.merge(mi,mo,how="outer",on=["linename","_10mins"]) final_data.rename(columns={"passengernums_x":"inputnums","passengernums_y":"outputnums"},inplace=True) FinalData=final_data.fillna(0) del final_data gc.collect() return FinalData 3 整合代码

    最后,把所有的代码整合在一起,并对一个月30天数据进行处理:

import pandas as pd from datetime import datetime import os #clear memory import gc os.mkdir("_10mins") def open_data(i): f=open(i) data=pd.read_csv(f,header=0,names=["cardnum","date","time","linename","business","figure","attribute"]) return data def railway_data(data): RailWay=data[data["business"]=="地铁"] return RailWay ​ #计算“时间戳” def timespan(data): data["timespan"]=data["time"].apply(lambda x:x[:2]).astype(int)*3600+data["time"].apply(lambda x:x[3:5]).astype(int)*60+data["time"].apply(lambda x:x[6:]).astype(int) return data #划分时间片 def timebins(data): #计算每个时间片的秒数间隔 seconds=[600*x for x in range(0,145)] #给时间片做标签 label=[x for x in range(1,145)] #这里利用的是pandas的分箱操作 _10min=pd.cut(data["timespan"],bins=seconds,labels=label) _10mins=_10min.get_values() data['_10mins']=_10mins return data ​​ def input_data(data): inputdata=data[data["figure"]==0] return inputdata def output_data(data): output=data[data["figure"]>0] return output ​​ def groupby_data(data): grouped_data=data.groupby(["linename","_10mins"]).count() manageG=grouped_data.reset_index(drop=False) del grouped_data gc.collect() manageG.drop(["cardnum","date","time","business","figure","attribute"],axis=1,inplace=True) manageG.rename(columns={"timespan":"passengernums"},inplace=True) return manageG ​​ #mi是进站数据,mo是出站数据 def merge_data(mi,mo): final_data=pd.merge(mi,mo,how="outer",on=["linename","_10mins"]) final_data.rename(columns={"passengernums_x":"inputnums","passengernums_y":"outputnums"},inplace=True) FinalData=final_data.fillna(0) del final_data gc.collect() return FinalData ​ date=[datetime.strftime(x,'%Y%m%d') for x in list(pd.date_range('20150401','20150430'))] for i in date: filename="SPTCC-"+i+".csv" SHData=open_data(filename) RailWay=railway_data(SHData) del SHData gc.collect() TimeSpan_data=timespan(RailWay) del RailWay gc.collect() timebins_data=timebins(TimeSpan_data) del TimeSpan_data gc.collect() inputdata=input_data(timebins_data) output=output_data(timebins_data) del timebins_data gc.collect() manageinput=groupby_data(inputdata) manageoutput=groupby_data(output) del inputdata gc.collect() del output gc.collect() savedata=merge_data(manageinput,manageoutput) del manageinput gc.collect() del manageoutput gc.collect() fn=str(i)+".csv" path=os.path.join("_10mins",fn) savedata.to_csv(path)

    最后看一下得到的结果:

    ”_10min“字段代表所处的时间片(比如1代表0:00-0:10),inputnums代表进站客流,outputnums代表出站客流。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3