import pandas as pd
import numpy as np
from datetime import datetime
from datetime import timedelta

def cal_gps_score(df):
    '''在获取信号,优、良、合格、掉线的比例之后,计算gps的总评分'''
    score=0
    for index in range(len(df)):
        time_percent=df.loc[index,'累计时间占比']
        if df.loc[index,'GPS质量']=='优':
            score+=time_percent*0
        elif df.loc[index,'GPS质量']=='良':
            score+=time_percent*0.3
        elif df.loc[index,'GPS质量']=='合格':
            score+=time_percent*0.5
        elif df.loc[index,'GPS质量']=='掉线':
            score+=time_percent*1
    return (1-score)*100

def gps_rank(df_gps_signal_table,df_gps,signal_rank,dist_factor):
    '''gps信号质量分析函数,需要输入表格,df_gps,信号等级,权重'''
    gps_signal_condition=(df_gps['gps_signal']==signal_rank)
    dist=df_gps.loc[gps_signal_condition,'distance'].values.sum()
    deltatime=df_gps.loc[gps_signal_condition,'deltatime'].values.sum()
    df_gps_signal_table_condition=(df_gps_signal_table['gps_signal']==signal_rank)
    df_gps_signal_table.loc[df_gps_signal_table_condition,'accum_distance']=dist/1000
    df_gps_signal_table.loc[df_gps_signal_table_condition,'accum_deltatime']=deltatime
    df_gps_signal_table.loc[df_gps_signal_table_condition,'accum_distance_factor']=dist/1000*dist_factor
    return df_gps_signal_table

def get_df_gps_score(starttime,endtime,df_gps):
    '''对df_gps中的gps质量进行评分,返回一个数值'''
    test_start_time=starttime#'2021-05-29 17:16:39'
    test_end_time=endtime#'2021-05-29 20:08:08'

    test_time_condition=(df_gps['time']>test_start_time)&(df_gps['time']<test_end_time)
    df_gps_test=df_gps.loc[test_time_condition,:].copy()
    df_gps_test=df_gps_test.reset_index(drop=True)#重置index
    #按照deltatime打标签
    gps_deltatime_bins=[0,30,60,120,10000]#优-良-合格-掉线
    name=['优','良','合格','掉线']
    df_gps_test['gps_signal']=pd.cut(df_gps_test['deltatime'], gps_deltatime_bins,labels=name)
    df_gps_test['gps_signal'].value_counts()
    #声明一个gps信号按类别统计table
    df_gps_signal_table=pd.DataFrame()
    df_gps_signal_table['gps_signal']=df_gps_test['gps_signal'].value_counts().index.tolist()
    df_gps_signal_table['num']=df_gps_test['gps_signal'].value_counts().values.tolist()

    #分类进行统计
    df_gps_signal_table=gps_rank(df_gps_signal_table,df_gps_test,'优',1.00)
    df_gps_signal_table=gps_rank(df_gps_signal_table,df_gps_test,'良',1.05)
    df_gps_signal_table=gps_rank(df_gps_signal_table,df_gps_test,'合格',1.2)
    df_gps_signal_table=gps_rank(df_gps_signal_table,df_gps_test,'掉线',1)

    #次数占比,时间占比
    all_num=df_gps_signal_table['num'].sum()
    df_gps_signal_table['num_percent']=df_gps_signal_table['num']/all_num
    all_accum_deltatime=df_gps_signal_table['accum_deltatime'].sum()
    df_gps_signal_table['accum_deltatime_percent']=df_gps_signal_table['accum_deltatime']/all_accum_deltatime

    #选择参数
    df_gps_signal_table=df_gps_signal_table[['gps_signal','num','num_percent','accum_distance',
                                            'accum_distance_factor','accum_deltatime','accum_deltatime_percent']]
    df_gps_signal_table=df_gps_signal_table.rename(columns={'gps_signal':'GPS质量','num':'数量','num_percent':'数量占比',
                                                        'accum_distance':'累计里程','accum_distance_factor':'累计里程修正值',
                                                        'accum_deltatime':'累计时间','accum_deltatime_percent':'累计时间占比'})

    df_gps_signal_table.loc[:,['GPS质量','累计时间','累计时间占比']]
    gps_score=cal_gps_score(df_gps_signal_table)#调用函数计算gps评分
    
    #输出结果,评分
    #print('From '+test_start_time+'  to '+test_end_time)
    #print('GPS信号质量评分:'+str(gps_score))

    return gps_score