''' 基于单一状态(一次行车、一次静置、一次充电)的指标统计库 ''' __author__ = 'wlm' 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: return None, None