關於初步處理,請參考地鐵大數據挖掘之客流數據預處理——從原始一卡通數據提取城市地鐵客流(一)。
上一篇博客對數據進行了初步處理,得到結果如下圖:
”_10min“字段代表所處的時間片(比如1代表0:00-0:10),inputnums代表進站客流,outputnums代表出站客流。
然而,這一結果在使用時存在兩個問題:
- 我們在計算地鐵站時,大部分是隻看站點不看線路的。即使是換乘站點,也是幾條線路都在一個站點。因此,在"linename"這裏存在問題。
- 這樣的結果看起來不是很方便。如果我們可以分別用兩張二維表格表示進站和出站,兩個維度分別是站點和時間片,那最後的結果將會好看很多。
因此,這一篇,我們對上一篇的結果進行進一步優化。
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)
最後看一下結果: