多台供暖设备DataFrame合并与温度-产热关系建模方案咨询
多台供暖设备温度-产热关系分析与拟合最优方案
一、数据合并与预处理
- 给每台设备的DataFrame添加唯一标识列(如
device_id),再合并所有设备数据 - 直接删除含
outside_temp或heat_production空值的行,避免缺失值对后续均值计算的干扰(若缺失数据量大,可考虑用线性插值补全,但需评估对结果的影响)
import pandas as pd import numpy as np from scipy.optimize import curve_fit # 假设所有设备数据存储在列表devices_data中,每个元素为单台设备的DataFrame for idx, df in enumerate(devices_data): df['device_id'] = f'device_{idx+1}' # 合并所有设备数据 combined_df = pd.concat(devices_data, ignore_index=True) # 清理含NaN的行 cleaned_df = combined_df.dropna(subset=['outside_temp', 'heat_production'])
二、按设备+温度分组计算平均产热
- 可选择对温度进行分箱(比如按1℃区间),避免原始温度值过于离散导致分组过多;也可直接按原始温度值分组
- 分组后计算每组的平均产热,得到各设备不同温度下的产热均值表
# 可选:按1℃区间对温度分箱,取箱中值作为代表温度 cleaned_df['temp_bin'] = pd.cut(cleaned_df['outside_temp'], bins=np.arange(-20, 30, 1), right=False) mean_prod_df = cleaned_df.groupby(['device_id', 'temp_bin'], as_index=False)['heat_production'].mean() # 提取温度箱中值,方便后续拟合 mean_prod_df['outside_temp'] = mean_prod_df['temp_bin'].apply(lambda bin: bin.mid) # 若无需分箱,直接按原始温度分组: # mean_prod_df = cleaned_df.groupby(['device_id', 'outside_temp'], as_index=False)['heat_production'].mean()
三、拟合Polynomial/Sigmoid函数
1. 多项式拟合
对每台设备单独拟合,选择2-3阶多项式平衡拟合效果与过拟合风险:
def fit_polynomial(x, y, degree=2): coeffs = np.polyfit(x, y, degree) return np.poly1d(coeffs) # 为每个设备生成拟合结果 poly_fit_results = [] for device in mean_prod_df['device_id'].unique(): device_data = mean_prod_df[mean_prod_df['device_id'] == device] x = device_data['outside_temp'].values y = device_data['heat_production'].values poly_func = fit_polynomial(x, y) device_result = pd.DataFrame({ 'device_id': device, 'outside_temp': x, 'avg_heat_production': y, 'fitted_heat_production': poly_func(x) }) poly_fit_results.append(device_result) poly_fit_df = pd.concat(poly_fit_results, ignore_index=True)
2. Sigmoid拟合
Sigmoid函数更贴合供暖设备“低温高产能、高温低产能”的非线性特性,函数形式为y = a/(1+exp(-b*(x-c)))+d:
def sigmoid(x, a, b, c, d): return a / (1 + np.exp(-b*(x - c))) + d def fit_sigmoid(x, y): # 初始参数猜测:a为最大产能,b为斜率,c为拐点温度,d为基础产能 initial_guess = [y.max(), 0.1, x.mean(), y.min()] popt, _ = curve_fit(sigmoid, x, y, p0=initial_guess) return lambda x_val: sigmoid(x_val, *popt) # 为每个设备生成Sigmoid拟合结果 sigmoid_fit_results = [] for device in mean_prod_df['device_id'].unique(): device_data = mean_prod_df[mean_prod_df['device_id'] == device] x = device_data['outside_temp'].values y = device_data['heat_production'].values sigmoid_func = fit_sigmoid(x, y) device_result = pd.DataFrame({ 'device_id': device, 'outside_temp': x, 'avg_heat_production': y, 'fitted_heat_production': sigmoid_func(x) }) sigmoid_fit_results.append(device_result) sigmoid_fit_df = pd.concat(sigmoid_fit_results, ignore_index=True)
四、生成全温度范围预测数据(可选)
如果需要覆盖更完整的温度区间,可生成连续温度序列,用拟合函数计算预测值:
full_temp_range = np.arange(-20, 30, 0.5) full_pred_results = [] for device in mean_prod_df['device_id'].unique(): device_data = mean_prod_df[mean_prod_df['device_id'] == device] x = device_data['outside_temp'].values y = device_data['heat_production'].values sigmoid_func = fit_sigmoid(x, y) full_pred = pd.DataFrame({ 'device_id': device, 'outside_temp': full_temp_range, 'fitted_heat_production': sigmoid_func(full_temp_range) }) full_pred_results.append(full_pred) full_pred_df = pd.concat(full_pred_results, ignore_index=True)
内容的提问来源于stack exchange,提问作者Hitchhike113
相关产品推荐
相关产品推荐

