我在使用Pandas进行数据分析方面相对较新。
我试图用几种条件定义一个函数,然后使用apply()函数来建模电池存储系统的充电状态(SOC)。
由于我需要访问以前的SOC,所以在我的功能中使用shift(1)。
我真的试图使它简单,但我仍然不知道如何限制电池SOC为16 kWh,并使我的代码运行。
我有以下Pandas Dataframe:带有太阳能电池板的房屋的电力概况
然后,我在Pandas Dataframe中创建了另外两个列“盈余”和"SOC“。
1表示电力生产盈余,0表示电力负荷较高。
Electricity_profiles_df['surplus'] = Electricity_profiles_df['Electricity Surplus / Deficit [kWh]'].apply(lambda x: 1 if x > 0 else 0)
Electricity_profiles_df['SOC'] = np.NaN然后,我将我的功能定义如下:
def state_of_charge(surplus, SOC, power):
if surplus == 1:
if SOC.shift(1) < 16:
SOC = power + SOC.shift(1)
else:
SOC = SOC.shift(1)
elif surplus == 0:
if SOC.shift(1) > 3.2:
SOC = SOC.shift(1) + power
else:
SOC = SOC.shift(1)
else:
SOC = 3.2
return SOC最后,我尝试使用新定义的函数,并按行顺序使用apply()函数:
Electricity_profiles_df['SOC'] = Electricity_profiles_df['surplus','SOC', 'Electricity Surplus / Deficit [kWh]'].apply(state_of_charge, axis=1)显示以下错误:
非常感谢你的帮助!
发布于 2022-10-05 08:22:08
在木星笔记本上试试这个。基本上,您在numpy数组中工作,并且只在最后将这些数组添加到一个熊猫数据数组中。
import pandas as pd
import numpy as np
pd.options.plotting.backend = "plotly"
%%time
#Parameters
SOC0 = 0
sim_time = 90
A_demand = 1
A_prod = 1.2
max_SOC = 16
#Signals generation
#Initial empty arrays
t = np.arange(0,sim_time)
grid_demand = np.zeros(sim_time)
battery = np.zeros(sim_time)
charge_array = np.zeros(sim_time)
#External production and demand signals (can set any shape of curve)
prod = (np.sin(t/(2*np.pi))*A_prod + A_prod)/2
demand = np.ones(sim_time)*A_demand
#Estimates battery SOC
SOC = SOC0
for i in t:
battery[i] = SOC
#Energy required from the grid (No surplus)
if demand[i] - prod[i] >= 0:
#Battery has some charge left for next step
if (demand[i] - prod[i] - SOC) < 0 :
grid_demand[i] = 0
charge = -(demand[i] - prod[i])
#Battery fully discharges
else:
grid_demand[i] = demand[i] - prod[i] - SOC
charge = -SOC
#Surplus of energy demand
elif demand[i] - prod[i] < 0:
grid_demand[i] = 0
charge = prod[i] - demand[i]
SOC = min(SOC + charge,max_SOC)
charge_array[i] = charge
#Creates data frame
data_dict = {"demand":demand,
"prod":prod,
"battery":battery,
"grid_demand":grid_demand,
"charge":charge_array}
df = pd.DataFrame(data_dict)
#Plots
df.plot()https://stackoverflow.com/questions/71111557
复制相似问题