# 读取数据
import numpy as np
import pandas as pd
import preprocess.preprocess
import importlib
import ana.parameters
import datetime
import os
import matplotlib
import openpyxl

file_path = r'D:\Work\Interior\Cloud_BMS\data_ana\7250.csv'
sn_list = pd.read_csv(file_path,encoding='gbk')
sn_list = sn_list.values.tolist()
# print(sn_list)
sn_list = [['PK504B10100004301']]
df_res = pd.DataFrame(columns=['sn', 'date', 'odo', 'capacity', 'energy', 'energy_rate', 'acc_time_drive',
                               'acc_time_stand', 'acc_time_charge', 'avr_stand_tem', 'avr_stand_tem_rate',
                               'max_pwr', 'regen_flag', 'regen_rate', 'avr_speed', 'max_speed', 'avr_drive_tem',
                               'avr_drive_tem_rate', 'center_long', 'center_lat', 'rad'])
df_soh_res = pd.DataFrame(columns=['sn', 'time', 'accum_ah', 'soh_cell01', 'soh_cell02', 'soh_cell03',
                                   'soh_cell04', 'soh_cell05', 'soh_cell06', 'soh_cell07',
                                   'soh_cell08', 'soh_cell09', 'soh_cell10', 'soh_cell11',
                                   'soh_cell12', 'soh_cell13', 'soh_cell14', 'soh_cell15',
                                   'soh_cell16', 'soh_cell17', 'soh_cell18', 'soh_cell19',
                                   'soh_cell20'])
df_cell_res = pd.DataFrame(columns=['sn', 'time', 'status', 'volt_cell01', 'volt_cell02', 'volt_cell03',
                                    'volt_cell04', 'volt_cell05', 'volt_cell06', 'volt_cell07',
                                    'volt_cell08', 'volt_cell09', 'volt_cell10', 'volt_cell11',
                                    'volt_cell12', 'volt_cell13', 'volt_cell14', 'volt_cell15',
                                    'volt_cell16', 'volt_cell17', 'volt_cell18', 'volt_cell19',
                                    'volt_cell20', 'volt_max', 'volt_min', 'volt_avr', 'soc_diff',
                                    'soc_diff_div', 'over_discharge'])

for sn in sn_list:
    # 数据读取
    base_path = r'D:\Work\Interior\Cloud_BMS\data_ana\Data_Files'
    time = '_from_2020-04-27_to_2021-04-27.csv'
    bms_file = base_path + r'\\' + sn[0] + '\BMS_' + sn[0] + time
    gps_file = base_path + r'\\' + sn[0] + '\GPS_' + sn[0] + time
    # print(bms_file)
    if not os.path.exists(bms_file):
        print('{} bms file does not exist!!!!!!'.format(sn[0]))
        continue
    if not os.path.exists(gps_file):
        print('{} gps file does not exist!!!!!!'.format(sn[0]))
        continue
    df_bms = pd.read_csv(bms_file, encoding='GB2312')
    df_gps = pd.read_csv(gps_file, encoding='GB2312')
    df_bms = df_bms.drop_duplicates(['时间戳'])
    df_gps = df_gps.drop_duplicates(['时间戳'])
    df_bms = df_bms.reset_index(drop=True)
    df_gps = df_gps.reset_index(drop=True)
    df_bms['时间戳'] = pd.to_datetime(df_bms['时间戳'])
    df_gps['时间戳'] = pd.to_datetime(df_gps['时间戳'])
    print('{} data read Well Done!'.format(sn[0]))
    df_bms.to_csv('result2.csv', index=False, encoding='GB2312')
    # 数据预处理
    # 1、数据分段
    # 2、GPS数据可靠与否的判断(根据GPS计算出的平均车速<2认为可靠)
    importlib.reload(preprocess.preprocess)
    df_bms = preprocess.preprocess.data_split(df_bms)
    df_bms.to_csv('result.csv',encoding='GB2312')
    df_bms, df_gps, prepro_record = preprocess.preprocess.data_gps_judge(df_bms, df_gps, 2)
    print('{} data preprocess Well Done!'.format(sn[0]))
    df_bms.to_csv('result.csv', index=False, encoding='GB2312')
    df_gps.to_csv('result1.csv', index=False, encoding='GB2312')
    importlib.reload(ana.parameters)
    # test = ana.parameters.sta_one_drive_cycle(df_bms, df_gps, prepro_record, time_window=3600*24, step=3600*24, start_time="00:00:00")

    # print(test)
    # 计算Daily数据

    start_time = df_bms.loc[0, '时间戳']
    # print(start_time)
    cur_time = start_time
    index = 0
    while cur_time < df_bms.loc[len(df_bms) - 1, '时间戳']:
        if cur_time.day != start_time.day:
            break
        else:
            index = index + 1
            cur_time = df_bms.loc[index, '时间戳']
    start = '00:00:00'
    start_time = datetime.datetime.strptime(str(df_bms.loc[index, '时间戳'])[0:10] + ' ' + start, '%Y-%m-%d %H:%M:%S')
    # print(index, start_time)
    timeDelta = datetime.timedelta(days=1)
    end_time = start_time + timeDelta
    # print(start_time, end_time)
    while end_time < df_bms.loc[len(df_bms) - 1, '时间戳']:
        # while end_time < df_bms.loc[8500, '时间戳']:
        df_sel_bms = df_bms[(df_bms['时间戳'] >= start_time) & (df_bms['时间戳'] <= end_time)]
        df_sel_bms = df_sel_bms.reset_index(drop=True)
        df_sel_gps = df_gps[(df_gps['时间戳'] >= start_time) & (df_gps['时间戳'] <= end_time)]
        df_sel_gps = df_sel_gps.reset_index(drop=True)
        if len(df_sel_bms) == 0:
            continue
        date = ana.parameters.get_date(df_sel_bms)

        odo_total, odo_sum, odo_plus = ana.parameters.get_daily_odo(df_sel_bms, df_sel_gps)
        print('total={},odo={},plus={}'.format(odo_total, odo_sum, odo_plus))

        # 计算单日里程，单日平均车速，单日最高车速
        # print(start_time)
        odo, avr_speed, max_speed = ana.parameters.get_daily_odo_and_speed(df_sel_bms, df_sel_gps)
        # 计算单日使用容量，单日使用能量
        capacity, energy = ana.parameters.get_daily_capacity_and_energy(df_sel_bms, 55)
        # 计算单日平均电耗：kwh/100km
        if odo > 10:
            energy_rate = energy / odo * 100
        else:
            energy_rate = 0
        # 计算单日累积时间（行驶、静置、充电）
        acc_time_drive = ana.parameters.get_daily_accum_time(df_sel_bms, 'drive')
        acc_time_stand = ana.parameters.get_daily_accum_time(df_sel_bms, 'stand')
        acc_time_charge = ana.parameters.get_daily_accum_time(df_sel_bms, 'charge')
        # 计算过程平均温度，平均温升（静置、行驶）

        avr_stand_tem, avr_stand_tem_rate = ana.parameters.get_daily_stand_temp(df_sel_bms, 'stand')
        avr_drive_tem, avr_drive_tem_rate = ana.parameters.get_daily_stand_temp(df_sel_bms, 'drive')
        # 计算车辆功率
        max_pwr = ana.parameters.get_daily_max_pwr(df_sel_bms, 'drive')
        # 计算regen数据，是否有regen以及regen比例
        regen_flag, regen_rate = ana.parameters.get_daily_regen(df_sel_bms, 'drive')
        # 计算活动范围，圆心和半径

        center_long, center_lat, rad = ana.parameters.get_working_scope(df_sel_bms, df_sel_gps, 'drive')

        df_res = df_res.append({'sn': sn[0],
                                'date': date,
                                'odo': odo,
                                'capacity': capacity,
                                'energy': energy,
                                'energy_rate': energy_rate,
                                'acc_time_drive': acc_time_drive,
                                'acc_time_stand': acc_time_stand,
                                'acc_time_charge': acc_time_charge,
                                'avr_stand_tem': avr_stand_tem,
                                'avr_stand_tem_rate': avr_stand_tem_rate,
                                'max_pwr': max_pwr,
                                'regen_flag': regen_flag,
                                'regen_rate': regen_rate,
                                'avr_speed': avr_speed,
                                'max_speed': max_speed,
                                'avr_drive_tem': avr_drive_tem,
                                'avr_drive_tem_rate': avr_drive_tem_rate,
                                'center_long': center_long,
                                'center_lat': center_lat,
                                'rad': rad}, ignore_index=True)
        start_time = end_time
        end_time = start_time + timeDelta
        # print(end_time,df_bms.loc[len(df_bms) - 1, '时间戳'])
    print('{} daily data process Well Done!'.format(sn[0]))

    # 计算电池周期性数据
    df_soh_res_single, df_cell_res_single = ana.parameters.get_soh(df_bms, sn)
    df_soh_res = pd.concat([df_soh_res, df_soh_res_single], ignore_index=True)
    df_cell_res = pd.concat([df_cell_res, df_cell_res_single], ignore_index=True)
    print('{} period data process Well Done!'.format(sn[0]))

path = r'D:\Work\Interior\Cloud_BMS\data_ana\report\daily_data_analysis.csv'
df_res.to_csv(path, index=False, encoding='GB2312')
path = r'D:\Work\Interior\Cloud_BMS\data_ana\report\period_data_analysis.xlsx'
writer = pd.ExcelWriter(path)
df_soh_res.to_excel(writer, "SOH数据")
df_cell_res.to_excel(writer, "一致性数据")
writer.save()