美文网首页
PYTHON 交通流 车辆到达分布 速度流量密度 高峰小时

PYTHON 交通流 车辆到达分布 速度流量密度 高峰小时

作者: 五长生 | 来源:发表于2017-11-03 00:01 被阅读332次
    image.png image.png image.png

    交通流实验如上

    车辆到达分布

    1027 17 2.33207715978 符合负二项分布 .png

    散点图

    1031 10 11[6, 42, 1297.8333333333333, 367.0, 0.88408265213442316].png

    解析出的数据

    image.png
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    sns.set_style('darkgrid')
    #计算高峰小时
    global end,start,vds
    A=[]
    B=[]
    C=[]
    D=[]
    M=[]
    S=[]
    def init(start,end,vds):#初始化 数据录入部分
        df = {}
        didi = []
        for i in range(0, end - start):
            df[i] = pd.read_excel(
                'C:\\Users\Administrator\Desktop\Whitemud Drive地感线圈数据(2015年8月)\\' + str(vds) + '-08-' + str(
                    start + i) + '.xls', sheetname='Sheet3')
            didi.append(len(df[i]))
        length = int(min(didi) / 100) * 100
        for i in range(0, end - start):
            df[i] = df[i][0:length]
            df[i] = df[i].fillna(0)
        global K,Q,V
        K = np.zeros((length, end - start))
        Q = np.zeros((length, end - start))
        V = np.zeros((length, end - start))
        for i in range(0, end - start):
            for j in range(0, length):
                if df[i]['K 2'][j] != 0 and df[i]['K 3'][j] != 0 and df[i]['K 1'][j] != 0:
                    K[j, i] = (df[i]['K 1'][j] + df[i]['K 2'][j] + df[i]['K 3'][j]) / 3
                    Q[j, i] = (df[i]['V 1'][j] + df[i]['V 2'][j] + df[i]['V 3'][j]) / 3
                    V[j, i] = (df[i]['S 1'][j] + df[i]['S 2'][j] + df[i]['S 3'][j]) / 3
                if (df[i]['K 2'][j] != 0 and df[i]['K 3'][j] == 0 and df[i]['K 1'][j] == 0) or (
                            df[i]['K 2'][j] == 0 and df[i]['K 3'][j] != 0 and df[i]['K 1'][j] == 0) or (
                            df[i]['K 2'][j] == 0 and df[i]['K 3'][j] == 0 and df[i]['K 1'][j] != 0):
                    K[j, i] = ((df[i]['K 1'][j] + df[i]['K 2'][j] + df[i]['K 3'][j]))
                    Q[j, i] = ((df[i]['V 1'][j] + df[i]['V 2'][j] + df[i]['V 3'][j]))
                    V[j, i] = ((df[i]['S 1'][j] + df[i]['S 2'][j] + df[i]['S 3'][j]))
                if (df[i]['K 2'][j] != 0 and df[i]['K 3'][j] != 0 and df[i]['K 1'][j] == 0) or (
                            df[i]['K 2'][j] == 0 and df[i]['K 3'][j] != 0 and df[i]['K 1'][j] != 0) or (
                            df[i]['K 2'][j] != 0 and df[i]['K 3'][j] == 0 and df[i]['K 1'][j] != 0):
                    K[j, i] = (df[i]['K 1'][j] + df[i]['K 2'][j] + df[i]['K 3'][j]) / 2
                    Q[j, i] = (df[i]['V 1'][j] + df[i]['V 2'][j] + df[i]['V 3'][j]) / 2
                    V[j, i] = (df[i]['S 1'][j] + df[i]['S 2'][j] + df[i]['S 3'][j]) / 2
        K[K > 80] = 80
    
    
    
    def PHT():#计算高峰小时
        Q1=Q[:,0]/180
        for i in range(len(Q1),0,-1):
            if i%3==0 and i%6==0 and i%15==0:
                break
        Q1=Q1[0:i]
        Z=np.array(Q1).reshape((int(i/3),3))
        sum=Z.sum(axis=1)
    
        if sum.sum()<=10:
            return 0
        maxhour=0
        max15=0
        for i in range(0,len(Z)-60):
            emm=Z[i:i + 60].sum()
            if emm>maxhour:
                maxhour=emm
                starttime=i
        for i in range(0,len(Z)-15):
            emm=Z[i:i + 15].sum()
            if emm>max15:
                max15=emm
    
        # print(starttime,maxhour,max15)
        # print(maxhour/(4*max15))
        # print(int(starttime/60),(starttime%60))
    
        # temp=[int(starttime/60),starttime%60,maxhour,max15,maxhour/(max15*4)]
        # time=str(int(starttime/60))+':'+str(starttime%60)
        # C.append(time)
        # A.append(vds)
        # B.append(start)
        # return temp
    
        return starttime
    
    
    
    
    def modal(min):#检验分布函数
        various=min.var()/min.mean()
        if various>1.2:
            print('符合负二项分布')
            return 1,various
        if various<1.2 and various>1 :
            print('符合泊松分布')
            return 2,various
        if  various < 1:
            print('二项分布')
            return 3,various
    
    
    
    
    def arrival():#车辆到达分布
        #计算最大公约数
    
        Q1 = Q[:, 0] / 180
        for i in range(len(Q1),0,-1):
            if i%3==0 and i%6==0 and i%15==0:
                break
        Q1=Q1[0:i]
        #计算频次
        min1=np.array(Q1[:,0]).reshape((int(i/3),3))
        min2 = np.array(Q1[:,0]).reshape((int(i/6), 6))
        min5 = np.array(Q1[:,0]).reshape((int(i/15) , 15))
        min1=min1.sum(axis=1)
        min2 = min2.sum(axis=1)
        min5 = min5.sum(axis=1)
    
    
    
        if min5.sum()<10:
            return 0
    
        M.append(min1.mean())
        S.append(min1.var())
        min1=min1[min1>5]
        min2 = min2[min2 >5]
        min5 = min5[min5 >5]
        #验证分布
        temp,various=modal(min1)
        modal(min2)
        modal(min5)
        #画图并保存
        plt.subplot(311)
        sns.distplot(min1, color='#ff8000')
        plt.subplot(312)
        sns.distplot(min2, color='#ff8000')
        plt.subplot(313)
        sns.distplot(min5, color='#ff8000')
    
        #
        # if temp==1:
        #     plt.savefig('E:\\arrival\负二项分布\\'+str(vds)+' '+str(start)+'  '+str(various)+' 符合负二项分布'+'  '+'.png')
        # if temp==2:
        #     plt.savefig('E:\\arrival\泊松分布\\'+str(vds)+' '+str(start)+'  '+str(various)+' 符合泊松分布'+'  '+'.png')
        # if temp==3:
        #     plt.savefig('E:\\arrival\二项分布\\'+str(vds)+' '+str(start)+'  '+str(various)+' 二项分布'+'  '+'.png')
        #plt.close()
    
        D.append(temp)
    
    
    
    
    def hourarrival():#高峰小时车辆到达分布
        starttime=PHT()
        #print(starttime*3)
        endtime=starttime*3+180
        Q1=Q[starttime*3:endtime]/180
        #print(Q1[:,0])
        min1 = np.array(Q1[:, 0]).reshape((int(len(Q1)/ 3), 3))
        min2 = np.array(Q1[:, 0]).reshape((int(len(Q1)/ 6), 6))
        min5 = np.array(Q1[:, 0]).reshape((int(len(Q1)/ 15), 15))
        min1 = min1.sum(axis=1)
        min2 = min2.sum(axis=1)
        min5 = min5.sum(axis=1)
    
        if min5.sum() < 10:
            return 0
    
        M.append(min1.mean())
        S.append(min1.var())
        min1 = min1[min1 > 1]
        min2 = min2[min2 > 1]
        min5 = min5[min5 > 1]
        # 验证分布
        #temp, various = modal(min1)
        #modal(min2)
        temp,various=modal(min5)
        # 画图并保存
        # plt.subplot(311)
        # sns.distplot(min1, color='#ff8000')
        # plt.subplot(312)
        # sns.distplot(min2, color='#ff8000')
        # plt.subplot(313)
        # sns.distplot(min5, color='#ff8000')
        # #plt.show()
        # if temp==1:
        #     plt.savefig('E:\\arrival\hour负二项分布\\'+str(vds)+' '+str(start)+'  '+' 符合负二项分布'+'  '+'.png')
        # if temp==2:
        #     plt.savefig('E:\\arrival\hour泊松分布\\'+str(vds)+' '+str(start)+'  '+' 符合泊松分布'+'  '+'.png')
        # if temp==3:
        #     plt.savefig('E:\\arrival\hour二项分布\\'+str(vds)+' '+str(start)+'  '+' 二项分布'+'  '+'.png')
        C.append(temp)
        A.append(vds)
        B.append(start)
        plt.close()
    
    
    
    
    def huatu():#画散点图函数
    
        temp=PHT()
        plt.subplot(311)
        plt.scatter(K,V)
        plt.title(str(vds)+' K-V '+str(start))
        plt.subplot(312)
        plt.scatter(K,Q)
        plt.title(str(vds)+' K-Q '+str(start))
        plt.subplot(313)
        plt.title(str(vds)+' Q-V '+str(start))
        plt.scatter(Q,V)
    
        if temp == 0:
            plt.savefig('E:\\traffic\\'+str(vds)+' '+str(start)+' '+str(end)+'.png')
        else:
            plt.savefig('E:\\traffic\\' + str(vds) + '  ' + str(start) + ' ' + str(end) + str(temp) + '.png')
        plt.close()
    
    vdss1=[1018,1026,1028,1030,1032,1035,1036,1016,1007]#向西方向
    vdss2=[1019,1027,1029,1031,1033,1034,1037,1017,1008]#向东方向
    
    # vdss1=[1008]
    # for vds in vdss1:
    #     for start in range(10,22):
    #         init(start,start+1,vds)
    #         hourarrival()
    #
    
    
    for vds in vdss1:
        for start in range(10,22):
            init(start,start+1,vds)
            hourarrival()
            #PHT()
    
    for vds in vdss2:
        for start in range(10,22):
            init(start,start+1,vds)
            hourarrival()
            #PHT()
    
    
    # arr=pd.DataFrame({"vds":A,'day':B,'M':M,'D':S,'kind':D,'time':C})
    arr=pd.DataFrame({"vds":A,'day':B,'符合分布':C})
    arr.to_excel('output1.xls')
    # print(C)
    

    相关文章

      网友评论

          本文标题:PYTHON 交通流 车辆到达分布 速度流量密度 高峰小时

          本文链接:https://www.haomeiwen.com/subject/lzkzpxtx.html