竞赛圈   > 公交车数据牛刀小试

跳踢踏舞的大叔

数据挖掘工程师   |   Python
  • 关注者 1
  • 关注了

跳踢踏舞的大叔

数据挖掘工程师   |   Python

"""
读取1号到24号的数据,去除掉gps为0的数据,生成的文件包含了O_TERMINALNO,predHour,station三个字段,其中predHour 是分为7-22整点的16个时段,station是统计的在一个小时内公交车走了多少个站,这种方式统计走了多少个站比较粗糙,大家可以自行优化。
"""
import pandas as pd
import warnings 


for a in range(1001,1025):
    warnings.filterwarnings("ignore")
    columns = ('O_TERMINALNO',"O_TIME","O_LONGITUDE","O_LATITUDE","O_NEXTSTATION") #鉴于自己要统计的信息,只选取了这5个字段
    f ="XXX\\train2017{}.csv".format(a) #自己的文件路径
    train = pd.read_csv(f, usecols=[1,2,3,4,11])
    train_1 = train[train['O_LONGITUDE']!=0] #去掉gps记录为0的数据


    l = []
    for i in list(train_1['O_TERMINALNO'].unique()): #取出每张表的去重后的车辆id

        c = train_1[train_1['O_TERMINALNO']==i]
        #c.reset_index(drop=True, inplace=True)
        #c.sort_values('O_TIME',inplace=True)
        for j in range(7,23):  #对应每个车辆分别取出从7点到22点的车辆一个小时走了多少个站
            if j+1<10:
                d = c[(c['O_TIME']>'0{}:00:00'.format(j)) & (c['O_TIME']<'0{}:00:00'.format(j+1))]
                b= [i,'{}:00:00'.format(j),len(d['O_NEXTSTATIONNO'].unique())]
                l.append(b)

            elif j+1==10:
                d = c[(c['O_TIME']>'0{}:00:00'.format(j)) & (c['O_TIME']<'{}:00:00'.format(j+1))]
                b= [i,'{}:00:00'.format(j),len(d['O_NEXTSTATIONNO'].unique())]
                l.append(b)
            else:
                d = c[(c['O_TIME']>'{}:00:00'.format(j)) & (c['O_TIME']<'{}:00:00'.format(j+1))]
                b= [i,'{}:00:00'.format(j),len(d['O_NEXTSTATIONNO'].unique())]
                l.append(b)
    df = pd.DataFrame(l,columns=['O_TERMINALNO','predHour','station'])
    df.to_csv('date_{}.csv'.format(a))
    
""""
将上面生成的24个表,以短表变长表的形式连起来。然后去掉字段station小于5的情况,因为station是一个小时走了多少个站,所以3600除以station得到一个站走了多少秒,得到的数据添加新的一列time。接着因为是有24天的表又除以24,接着以O_TERMINALNO,predHour两个字段分组,以time和汇总。得到24天中每一辆车在每个时段路过每个站的平均时间。最后我们计算了所有平均时间的平均时间。"
"""
import pandas as pd
import warnings 

warnings.filterwarnings("ignore")
a = pd.read_csv('date_1001.csv', header=0)
for i in range(1002,1025):
    data = pd.read_csv('date_{}.csv'.format(i), header=0)
    a = pd.concat([a, data])
    
#a.to_csv('fafa.csv')

#a = pd.read_csv('fafa.csv', header=0)
a = pd.DataFrame(a)
a.drop(columns=['Unnamed: 0'], inplace=True)
c = a[a['station']>=5]  #因为待预测的站点都大于4,所以取了一个小时至少走了5个站的数据,此处大家可以优化。
c['time'] = 3600/c['station']  #一个小时有3600秒,除以站点个数得到一个站点走了多少秒
df = pd.DataFrame(c)

df['time'] = df['time']/24  #因为这里总共24天 所以除了24,但实际有些车辆是没有出现24天的,此处大家也可以优化
g = df['time'].groupby([df['O_TERMINALNO'],df['predHour']]).sum() #分类汇总
df = pd.DataFrame(g)

M = df['time'].mean() #根据汇总的结果再求'time'这一列的平均值,也就是我们最好要得到的最后的平均值

"""
在得到每个站行驶的平均时间后,判断是否会出现某个评价时间大于3600的情况。出现后将同步压缩这个时间段的平均时间,直到小于3600,然后得出结果上传。¶
"""

import pandas as pd
import numpy as np

data = pd.read_csv('toBePredicted_forUser.csv')
data['--'] = data['pred_end_stop_ID'] - data['pred_start_stop_ID'] + 1 #构建了一列代表一共要预测多少个站,方便后面做循环

data["demo"] = 0
dd = []
def demo(m, data):  #判断是否大于3600,大于就减小平均值
    for j in range(1, data):
        if (j*m+a) > 3600:      
            m = m - 8
    return m

for i in data.values:
    m = M  #来自上面得到的最后平均值
    a = m/2 #每次预测的第一个时间我们取平均值的一半,大家也可以在此处优化
    while True:
        x=m
        m=demo(m, i[7])
        if(x == m):
            break 
    aa = str(a)
    for j in range(1,i[7]):
        aa = aa+";"+'%d' %(j*m+a)  #讲得到的数据安装要求写入文件
    i[-1] = aa
    dd.append(i)
dfd = pd.DataFrame(dd)


dfd.columns = ['O_DATA', 'O_LINENO', 'O_TERMINALNO', 'predHour', 'pred_start_stop_ID', 'pred_end_stop_ID', 'O_UP', '--','pred_timeStamps']
dfd.drop(columns=['--', 'O_UP'], inplace=True)  #删除无用的两列
dfd.to_csv('baseline.csv', index=False) #这里是最后上传的文件


           


1条评论

分享

1条评论
意见反馈
关注微信公众号 关注微信公众号

扫一扫分享给周围朋友