地鐵大數據挖掘之數據預處理——從原始一卡通數據提取城市地鐵客流(二)

    關於初步處理,請參考地鐵大數據挖掘之客流數據預處理——從原始一卡通數據提取城市地鐵客流(一)。


 

    上一篇博客對數據進行了初步處理,得到結果如下圖:

    ”_10min“字段代表所處的時間片(比如1代表0:00-0:10),inputnums代表進站客流,outputnums代表出站客流。

    然而,這一結果在使用時存在兩個問題:

  1. 我們在計算地鐵站時,大部分是隻看站點不看線路的。即使是換乘站點,也是幾條線路都在一個站點。因此,在"linename"這裏存在問題。
  2. 這樣的結果看起來不是很方便。如果我們可以分別用兩張二維表格表示進站和出站,兩個維度分別是站點和時間片,那最後的結果將會好看很多。

    因此,這一篇,我們對上一篇的結果進行進一步優化。

1 提取線路

    這裏下載了上海市地鐵線路圖。這裏看到,基本上所有的交叉站點都是換乘站,只有”六號線浦電路“和”四號線浦電路“並不在同一站點,所以這裏分開處理。

def split_station(data):
    dd6=data[data["linename"]=="6號線浦電路"]
    data1=data.append(dd6)
    data1.drop_duplicates(keep=False,inplace=True)
    dd6["linename"]="6號線6號線浦電路"
    dd4=data[data["linename"]=="4號線浦電路"]
    data2=data1.append(dd4)
    data2.drop_duplicates(keep=False,inplace=True)
    dd4["linename"]="4號線4號線浦電路"
    dd6["stationname"]=dd6["linename"].str.split("線").str.get(1)+"線"+dd6["linename"].str.split("線").str.get(2)
    dd4["stationname"]=dd4["linename"].str.split("線").str.get(1)+"線"+dd4["linename"].str.split("線").str.get(2)
    data2["stationname"]=data2["linename"].str.split("線").str.get(1)
    datan=data2.append(dd6)
    datann=datan.append(dd4)
    datann.drop(["linename"],axis=1,inplace=True)
    return datann

2 提取客流

def groupby_data(data):
    grouped_data=data.groupby(["stationname","_10mins"]).sum()
    manageG=grouped_data.reset_index(drop=False)
    return manageG

3 轉換爲二維表格

    這裏分別對進站和出站數據運用透視操作,把客流轉換爲二維表格。

def pivot_inputdata(data):
    inputdatanums=data.pivot_table(values="inputnums",index="stationname",columns="_10mins")
    idn=inputdatanums.fillna(0)
    return idn

def pivot_outputdata(data):
    outputdatanums=data.pivot_table(values="outputnums",index="stationname",columns="_10mins")
    odn=outputdatanums.fillna(0)
    return odn

4 整合代碼

    最後,對代碼進行整合操作。

import pandas as pd
import os

os.mkdir("inputs")
os.mkdir("outputs")

def open_data(data):
    f=open(data)
    df=pd.read_csv(f)
    df.drop(["Unnamed: 0"],axis=1,inplace=True)
    return df

def split_station(data):
    dd6=data[data["linename"]=="6號線浦電路"]
    data1=data.append(dd6)
    data1.drop_duplicates(keep=False,inplace=True)
    dd6["linename"]="6號線6號線浦電路"
    dd4=data[data["linename"]=="4號線浦電路"]
    data2=data1.append(dd4)
    data2.drop_duplicates(keep=False,inplace=True)
    dd4["linename"]="4號線4號線浦電路"
    dd6["stationname"]=dd6["linename"].str.split("線").str.get(1)+"線"+dd6["linename"].str.split("線").str.get(2)
    dd4["stationname"]=dd4["linename"].str.split("線").str.get(1)+"線"+dd4["linename"].str.split("線").str.get(2)
    data2["stationname"]=data2["linename"].str.split("線").str.get(1)
    datan=data2.append(dd6)
    datann=datan.append(dd4)
    datann.drop(["linename"],axis=1,inplace=True)
    return datann

def groupby_data(data):
    grouped_data=data.groupby(["stationname","_10mins"]).sum()
    manageG=grouped_data.reset_index(drop=False)
    return manageG

def pivot_inputdata(data):
    inputdatanums=data.pivot_table(values="inputnums",index="stationname",columns="_10mins")
    idn=inputdatanums.fillna(0)
    return idn

def pivot_outputdata(data):
    outputdatanums=data.pivot_table(values="outputnums",index="stationname",columns="_10mins")
    odn=outputdatanums.fillna(0)
    return odn

for i in range(1,31):
    if i<11:
        filename="2015040"+str(i)+".csv"
    else:
        filename="201504"+str(i)+".csv"
    dealeddata=open_data(filename)
    split_data=split_station(dealeddata)
    manageddata=groupby_data(split_data)
    _inputs=pivot_inputdata(manageddata)
    _outputs=pivot_outputdata(manageddata)
    pathin=os.path.join("inputs",filename)
    pathout=os.path.join("outputs",filename)
    _inputs.to_csv(pathin)
    _outputs.to_csv(pathout)

    最後看一下結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章