You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多台供暖设备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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:06:31