python对离散功率点进行积分得到电耗

data = pd.read_csv(r"C:\Users\EDY\Desktop\******.csv")
data

from scipy.integrate import trapz
scipy.integrate.trapz(y,x)
scipy.integrate.trapz(y,dx=2)

主要使用trapz()函数,y为离散的功率列表,x为时间戳点列表,由于实际情况导致我的x并不是连续的,两个算出来的结果相差较大,但是我的数据是2s一次,所以我直接选择dx=2来计算,算出来和根据soc算出的值相差不多,所以结果更加贴近实际值。
各位使用的时候请按照实际情况来选择。

import pandas as pd
import numpy as np
import scipy
from scipy.integrate import trapz

def calculate_power_integrals(data):
	#转为列表
    array_chassis = pd.to_numeric(data["chassisPower"])
    array_upper = pd.to_numeric(data["upperPower"])
    list_chassis_power = array_chassis.tolist()
    list_upper_power = array_upper.tolist()
	#数据nan预处理
    for i in range(len(list_chassis_power)):
        if np.isnan(list_chassis_power[i]):
            list_chassis_power[i]=(list_chassis_power[i-1]+list_chassis_power[i+1])/2
        if np.isnan(list_upper_power[i]):
            list_upper_power[i]=(list_upper_power[i-1]+list_upper_power[i+1])/2
	#再次判断是否有nan
    if True in np.isnan(list_chassis_power):
        print("list_chassis_power has nan.")
    if True in np.isnan(list_upper_power):
        print("list_upper_power has nan.")

    y_chassis = list_chassis_power
    y_upper = list_upper_power

    integrals_chassis = []
    integrals_upper = []
	
	#每个点算出来进行保存,但是只需要取最后一个值就是积分结果
    for i in range(len(y_chassis)):
    	# /60/60 因为单位需要
        integrals_chassis.append(trapz(y_chassis[:i + 1], dx=2)/60/60)
        integrals_upper.append(trapz(y_upper[:i + 1], dx=2)/60/60)
	#
    print("底盘电耗积分结果:"+ str(integrals_chassis[len(integrals_chassis)-1]))
    print("上装电耗积分结果:"+str(integrals_upper[len(integrals_upper)-1]))
    integrals_chassis=np.round(integrals_chassis,2)
    integrals_upper=np.round(integrals_upper,2)
    return integrals_chassis, integrals_upper



因为mysql查出来结果包括很对不同车和不同的日期,把每天每车的数据拿进函数进行计算得到每天的结果

# 创建一个空的dataframe,包含需要写入的列名
df = pd.DataFrame(columns=['VIN', 'day', 'integrals_chassis','integrals_upper'])
#对于两个DataFrame对象,可以使用merge函数将它们按照vin列和time列进行连接。
#需要将两个DataFrame的连接方式指定为inner,并且指定on参数为['vin', 'day'],表示按照vin列和day列进行连接。具体语法如下:
unique_vin_day = merged_df[['VIN',"day_x"]].dropna().drop_duplicates()

for i in range(len(unique_vin_day)) :
    index_vin = unique_vin_day.iloc[(i,0)]
    index_day =  unique_vin_day.iloc[(i,1)]
    result_df = merged_df[(merged_df['VIN'] == index_vin) & (merged_df['day_x'] == index_day)]
    integrals_chassis, integrals_upper =calculate_power_integrals(result_df)
    df.loc[i] = [index_vin, index_day, integrals_chassis[len(integrals_chassis)-1],integrals_upper[len(integrals_upper)-1]]

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值