<<<<<<< HEAD
'''
基于单一状态（一次行车、一次静置、一次充电）的指标统计库

'''
__author__ = 'lmstack'

import CONFIGURE.PathSetting as PathSetting
import sys
sys.path.append(PathSetting.backend_path)
import datetime
import Tools
import pandas as pd
import numpy as np

class IndexStaByOneCycle():
    def __init__(self):
        pass

    def odo_sta(self, odo_array):
        '''
        一次行车行驶里程统计
        ---------输入参数------------
        odo_array : 一次行车对应的odo数据
        ---------输出参数------------
        如果gps 可信，则输出本次行车的累积行驶里程；
        否则，输出None
        '''
        odo_array = odo_array[~pd.isnull(odo_array)]
        if len(odo_array) > 0:
            return np.sum(odo_array)
        else:
            return None

    def capacity_sta(self, cap, soc_array, soh_array):
        '''
        一个cycle净累积ah统计
        ---------输入参数------------
        cap : 标称容量
        soc_array : 一个cycle对应的soc数据
        soh_array : 一个cycle对应的soh数据
        ---------输出参数------------
        本次行车的累积ah
        '''
        soc_array = soc_array[~pd.isnull(soc_array)]
        soh_array = soh_array[~pd.isnull(soh_array)]
        if len(soc_array) > 0 and len(soh_array) > 0 :
            return (soc_array[0] - soc_array[-1]) * np.mean(soh_array) * cap / 100.0 / 100.0
        else:
            return None
    def energy_sta(self, cap, soc_array, soh_array, volt_array):
        '''
        一个cycle净累积能量统计
        ---------输入参数------------
        cap : 标称容量
        soc_array : 一个cycle对应的soc数据
        soh_array : 一个cycle对应的soh数据
        volt_array : 一个cycle对应的volt数据
        ---------输出参数------------
        本次行车的累积能量
        '''
        soc_array = soc_array[~pd.isnull(soc_array)]
        soh_array = soh_array[~pd.isnull(soh_array)]
        volt_array = volt_array[~pd.isnull(volt_array)]
        if len(soc_array) > 0 and len(soh_array) > 0 and len(volt_array)>0:
            cap = self.capacity_sta(cap, soc_array, soh_array)
            return cap * np.mean(volt_array) / 1000.0
        else:
            return None



    def acc_time_sta(self, time_array):
        '''
        一个cycle的持续时间
        ---------输入参数------------
        time_array : 一次cycle对应的time数据
        ---------输出参数------------
        本cycle的持续时间，单位 h
        '''
        time_array = time_array[~pd.isnull(time_array)]
        if len(time_array) > 0:
            return float(abs(time_array[0] - time_array[-1]))/1e9/3600.0
        else:
            return None

    def mean_temp_sta(self, temp_array):
        '''
        一个cycle的单体平均温度
        ---------输入参数------------
        temp_array : 一个cycle对应的某个单体的temp数据
        ---------输出参数------------
        本cycle的单体平均温度
        '''
        temp_array = temp_array[~pd.isnull(temp_array)]
        if len(temp_array) > 0:
            return np.mean(temp_array)
        else:
            return None

    def temp_change_rate_sta(self, time_array, temp_array):
        '''
        一个cycle的单体温度变化率
        ---------输入参数------------
        time_array : 一个cycle对应的time数据
        temp_array : 一个cycle对应的temp数据
        ---------输出参数------------
        本cycle的单体温度变化率
        '''
        time_array = time_array[~pd.isnull(time_array)]
        temp_array = temp_array[~pd.isnull(temp_array)]
        if len(temp_array) > 0 and len(time_array) > 0:
            return abs(temp_array[0] - temp_array[-1])/\
                (float(abs(time_array[0] - time_array[-1]))/1e9/3600.0)
        else:
            return None

    def dischrg_max_pwr_sta(self, volt_array, crnt_array):
        '''
        一个cycle的放电功率最大值
        ---------输入参数------------
        volt_array : 一个cycle对应的volt数据
        crnt_array : 一个cycle对应的crnt数据
        ---------输出参数------------
        本cycle的放电功率最大值
        '''
        volt_array = volt_array[~pd.isnull(volt_array)]
        crnt_array = crnt_array[~pd.isnull(crnt_array)]
        if len(volt_array) > 0 and len(crnt_array) > 0:
            pwr = volt_array * crnt_array / 1000.0
            pwr = pwr[pwr > 0]
            return np.max(pwr)
        else:
            return None

    def chrg_max_pwr_sta(self, volt_array, crnt_array):
        '''
        一个cycle的充电功率最大值
        ---------输入参数------------
        volt_array : 一个cycle对应的volt数据
        crnt_array : 一个cycle对应的crnt数据
        ---------输出参数------------
        本cycle的充电功率最大值
        '''
        volt_array = volt_array[~pd.isnull(volt_array)]
        crnt_array = crnt_array[~pd.isnull(crnt_array)]
        if len(volt_array) > 0 and len(crnt_array) > 0:
            pwr = volt_array * crnt_array / 1000.0
            pwr = pwr[pwr < 0]
            return np.max(abs(pwr))
        else:
            return None

    def regen_count_sta(self, crnt_array):
        '''
        一个行车cycle的regen 行数
        ---------输入参数------------
        crnt_array : 一个行车cycle对应的crnt数据
        ---------输出参数------------
        本行车cycle的regen行数， 总行数
        '''
        crnt_array = crnt_array[~pd.isnull(crnt_array)]
        if  len(crnt_array) > 0:
            return len(crnt_array[crnt_array < -1]), len(crnt_array)
        else:
            return None, None

    def speed_sta(self, sum_odo, acc_time, speed_array):
        '''
        一个行车cycle的平均速度和最大瞬时速度
        ---------输入参数------------
        sum_odo : 一个行车cycle对应的累积odo数据
        acc_time : 一个行车cycle对应的累积time数据
        speed_array : 一个行车cycle对应的speed数据
        ---------输出参数------------
        本行车cycle的平均速度和最大速度
        '''
        speed_array = speed_array[~pd.isnull(speed_array)]
        if  ~pd.isnull(sum_odo) and ~pd.isnull(acc_time) and len(speed_array) > 0:
            return sum_odo/acc_time, np.max(speed_array)
        else:
            return None, None

    def speed_sta(self, sum_odo, acc_time, speed_array):
        '''
        一个行车cycle的平均速度和最大瞬时速度
        ---------输入参数------------
        sum_odo : 一个行车cycle对应的累积odo数据
        acc_time : 一个行车cycle对应的累积time数据
        speed_array : 一个行车cycle对应的speed数据
        ---------输出参数------------
        本行车cycle的平均速度和最大速度
        '''
        speed_array = speed_array[~pd.isnull(speed_array)]
        if  ~pd.isnull(sum_odo) and ~pd.isnull(acc_time) and len(speed_array) > 0:
            return sum_odo/acc_time, np.max(speed_array)
        else:
=======
'''
基于单一状态（一次行车、一次静置、一次充电）的指标统计库

'''
__author__ = 'lmstack'

# import CONFIGURE.PathSetting as PathSetting
# import sys
# sys.path.append(PathSetting.backend_path)
# import datetime
# import Tools
import pandas as pd
import numpy as np

class IndexStaByOneCycle():
    def __init__(self):
        pass

    def odo_sta(self, odo_array):
        '''
        一次行车行驶里程统计
        ---------输入参数------------
        odo_array : 一次行车对应的odo数据
        ---------输出参数------------
        如果gps 可信，则输出本次行车的累积行驶里程；
        否则，输出None
        '''
        odo_array = odo_array[~pd.isnull(odo_array)]
        if len(odo_array) > 0:
            return np.sum(odo_array)
        else:
            return None

    def capacity_sta(self, cap, soc_array, soh_array):
        '''
        一个cycle净累积ah统计
        ---------输入参数------------
        cap : 标称容量
        soc_array : 一个cycle对应的soc数据
        soh_array : 一个cycle对应的soh数据
        ---------输出参数------------
        本次行车的累积ah
        '''
        soc_array = soc_array[~pd.isnull(soc_array)]
        soh_array = soh_array[~pd.isnull(soh_array)]
        if len(soc_array) > 0 and len(soh_array) > 0 :
            return (soc_array[0] - soc_array[-1]) * np.mean(soh_array) * cap / 100.0 / 100.0
        else:
            return None
    def energy_sta(self, cap, soc_array, soh_array, volt_array):
        '''
        一个cycle净累积能量统计
        ---------输入参数------------
        cap : 标称容量
        soc_array : 一个cycle对应的soc数据
        soh_array : 一个cycle对应的soh数据
        volt_array : 一个cycle对应的volt数据
        ---------输出参数------------
        本次行车的累积能量
        '''
        soc_array = soc_array[~pd.isnull(soc_array)]
        soh_array = soh_array[~pd.isnull(soh_array)]
        volt_array = volt_array[~pd.isnull(volt_array)]
        if len(soc_array) > 0 and len(soh_array) > 0 and len(volt_array)>0:
            cap = self.capacity_sta(cap, soc_array, soh_array)
            return cap * np.mean(volt_array) / 1000.0
        else:
            return None



    def acc_time_sta(self, time_array):
        '''
        一个cycle的持续时间
        ---------输入参数------------
        time_array : 一次cycle对应的time数据
        ---------输出参数------------
        本cycle的持续时间，单位 h
        '''
        time_array = time_array[~pd.isnull(time_array)]
        if len(time_array) > 0:
            return float(abs(time_array[0] - time_array[-1]))/1e9/3600.0
        else:
            return None

    def mean_temp_sta(self, temp_array):
        '''
        一个cycle的单体平均温度
        ---------输入参数------------
        temp_array : 一个cycle对应的某个单体的temp数据
        ---------输出参数------------
        本cycle的单体平均温度
        '''
        temp_array = temp_array[~pd.isnull(temp_array)]
        if len(temp_array) > 0:
            return np.mean(temp_array)
        else:
            return None

    def temp_change_rate_sta(self, time_array, temp_array):
        '''
        一个cycle的单体温度变化率
        ---------输入参数------------
        time_array : 一个cycle对应的time数据
        temp_array : 一个cycle对应的temp数据
        ---------输出参数------------
        本cycle的单体温度变化率
        '''
        time_array = time_array[~pd.isnull(time_array)]
        temp_array = temp_array[~pd.isnull(temp_array)]
        if len(temp_array) > 0 and len(time_array) > 0:
            return abs(temp_array[0] - temp_array[-1])/\
                (float(abs(time_array[0] - time_array[-1]))/1e9/3600.0)
        else:
            return None

    def dischrg_max_pwr_sta(self, volt_array, crnt_array):
        '''
        一个cycle的放电功率最大值
        ---------输入参数------------
        volt_array : 一个cycle对应的volt数据
        crnt_array : 一个cycle对应的crnt数据
        ---------输出参数------------
        本cycle的放电功率最大值
        '''
        volt_array = volt_array[~pd.isnull(volt_array)]
        crnt_array = crnt_array[~pd.isnull(crnt_array)]
        if len(volt_array) > 0 and len(crnt_array) > 0:
            pwr = volt_array * crnt_array / 1000.0
            pwr = pwr[pwr > 0]
            return np.max(pwr)
        else:
            return None

    def chrg_max_pwr_sta(self, volt_array, crnt_array):
        '''
        一个cycle的充电功率最大值
        ---------输入参数------------
        volt_array : 一个cycle对应的volt数据
        crnt_array : 一个cycle对应的crnt数据
        ---------输出参数------------
        本cycle的充电功率最大值
        '''
        volt_array = volt_array[~pd.isnull(volt_array)]
        crnt_array = crnt_array[~pd.isnull(crnt_array)]
        if len(volt_array) > 0 and len(crnt_array) > 0:
            pwr = volt_array * crnt_array / 1000.0
            pwr = pwr[pwr < 0]
            return np.max(abs(pwr))
        else:
            return None

    def regen_count_sta(self, crnt_array):
        '''
        一个行车cycle的regen 行数
        ---------输入参数------------
        crnt_array : 一个行车cycle对应的crnt数据
        ---------输出参数------------
        本行车cycle的regen行数， 总行数
        '''
        crnt_array = crnt_array[~pd.isnull(crnt_array)]
        if  len(crnt_array) > 0:
            return len(crnt_array[crnt_array < -1]), len(crnt_array)
        else:
            return None, None

    def speed_sta(self, sum_odo, acc_time, speed_array):
        '''
        一个行车cycle的平均速度和最大瞬时速度
        ---------输入参数------------
        sum_odo : 一个行车cycle对应的累积odo数据
        acc_time : 一个行车cycle对应的累积time数据
        speed_array : 一个行车cycle对应的speed数据
        ---------输出参数------------
        本行车cycle的平均速度和最大速度
        '''
        speed_array = speed_array[~pd.isnull(speed_array)]
        if  ~pd.isnull(sum_odo) and ~pd.isnull(acc_time) and len(speed_array) > 0:
            return sum_odo/acc_time, np.max(speed_array)
        else:
            return None, None

    def speed_sta(self, sum_odo, acc_time, speed_array):
        '''
        一个行车cycle的平均速度和最大瞬时速度
        ---------输入参数------------
        sum_odo : 一个行车cycle对应的累积odo数据
        acc_time : 一个行车cycle对应的累积time数据
        speed_array : 一个行车cycle对应的speed数据
        ---------输出参数------------
        本行车cycle的平均速度和最大速度
        '''
        speed_array = speed_array[~pd.isnull(speed_array)]
        if  ~pd.isnull(sum_odo) and ~pd.isnull(acc_time) and len(speed_array) > 0:
            return sum_odo/acc_time, np.max(speed_array)
        else:
>>>>>>> 65a87ae16013552e359df047df19f46fc4e6eb08
            return None, None