地铁大数据挖掘之数据预处理——从原始一卡通数据提取城市地铁客流(二)

    关于初步处理,请参考地铁大数据挖掘之客流数据预处理——从原始一卡通数据提取城市地铁客流(一)。


 

    上一篇博客对数据进行了初步处理,得到结果如下图:

地铁大数据挖掘之数据预处理——从原始一卡通数据提取城市地铁客流(二)_第1张图片

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

    然而,这一结果在使用时存在两个问题:

  1. 我们在计算地铁站时,大部分是只看站点不看线路的。即使是换乘站点,也是几条线路都在一个站点。因此,在"linename"这里存在问题。
  2. 这样的结果看起来不是很方便。如果我们可以分别用两张二维表格表示进站和出站,两个维度分别是站点和时间片,那最后的结果将会好看很多。

    因此,这一篇,我们对上一篇的结果进行进一步优化。

1 提取线路

地铁大数据挖掘之数据预处理——从原始一卡通数据提取城市地铁客流(二)_第2张图片

    这里下载了上海市地铁线路图。这里看到,基本上所有的交叉站点都是换乘站,只有”六号线浦电路“和”四号线浦电路“并不在同一站点,所以这里分开处理。

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)

    最后看一下结果:

地铁大数据挖掘之数据预处理——从原始一卡通数据提取城市地铁客流(二)_第3张图片

你可能感兴趣的:(pandas,python,pandas,python,地铁客流,数据预处理)