'''目标:拟合物料冷却规律
分类变量:物料规格,冷却方式
连续变量:温度,时间
其他因素:车间温度
现实因素:初始温度,初始时间
需求因素:目标温度的时间,目标温度的时长(时间-初始时间),当前时间的温度
不加入分类变量则为单个线性模型'''
'''实验1 只有温度和时间
每个物料的初始温度和初始时间不一样
无分类变量需转为读热编码'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
'''
# 生成数据
temperature = np.array([300, 200, 100, 10])
time = np.array([np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 07:00:00'), np.datetime64('2023-01-01 12:00:00'), np.datetime64('2023-01-01 20:00:00')])
time_initial = time[0]
temperature_initial = temperature[0]
# 转为与初始时间和初始温度比较,未做归一化(离差标准化),标准化等处理
# 这样, 所有的线性模型的初始自变量和初始因变量都是0,在第四象限大体呈递减状
# 模型拟合完成后,需要预测时,再分别加上初始时间和初始温度即可
x = time - time_initial
Y = temperature - temperature_initial
# 每个物料都有各自的初始时间和初始温度
# 生成数据,转化数据
# array内部长度不一需指定dtype
# 使用pandas生成面板数据以供筛选
'''
# 生成数据,转化数据
panel_data = pd.DataFrame(
{
'material': ['materila_1']*3 + ['material_2']*4 + ['material_3']*5,
'time':
[np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 07:00:00'), np.datetime64('2023-01-01 18:00:00')] +
[np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 07:00:00'), np.datetime64('2023-01-01 12:00:00'), np.datetime64('2023-01-01 20:00:00')] +
[np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 06:00:00'), np.datetime64('2023-01-01 12:00:00'), np.datetime64('2023-01-01 16:00:00'), np.datetime64('2023-01-01 21:00:00')],
'temperature': [250, 150, 20] + [300, 200, 100, 10] + [310, 200, 90, 50, 5]
}
)
panel_data.set_index(['material'], inplace=True) # 若无这一步,下一步会报错
panel_data['time_initial'] = panel_data.groupby(['material']).apply(lambda x: x['time'][0])
panel_data['temperature_initial'] = panel_data.groupby('material').apply(lambda x: x['temperature'][0])
panel_data['x'] = panel_data['time'] - panel_data['time_initial']
panel_data['Y'] = panel_data['temperature'] - panel_data['temperature_initial']
panel_data.set_index([panel_data.index, 'time_initial', 'temperature_initial', 'time'], inplace=True)
# 汇总拟合
# 分组预测
X = panel_data['x'].dt.total_seconds().values.reshape(-1, 1)
Y = panel_data['Y']
linear_model = LinearRegression()
linear_model.fit(X, Y)
Y_pred = linear_model.predict(X)
plt.scatter(X, Y, label='Linear Regression Actual Data')
plt.plot(X, Y_pred, color='red', label='Linear Regression Prediction')
plt.xlabel('Time Difference')
plt.ylabel('Temperature Difference')
plt.title(f"Linear Regression Prediction Formula: Y_pred = {linear_model.coef_[0]:.4f} * X + {linear_model.intercept_:.4f}")
plt.legend()
plt.show()
In [253]:
panel_data['Y_pred'] = linear_model.predict(X)
panel_data['temperature_pred'] = panel_data['Y_pred'].values + panel_data.reset_index()['temperature_initial'].values
panel_data
Out[253]:
temperature | x | Y | Y_pred | temperature_pred | ||||
material | time_initial | temperature_initial | time | |||||
materila_1 | 2023-01-01 | 250 | 2023-01-01 00:00:00 | 250 | 0 days 00:00:00 | 0 | -7.548712 | 242.451288 |
2023-01-01 07:00:00 | 150 | 0 days 07:00:00 | -100 | -108.984915 | 141.015085 | |||
2023-01-01 18:00:00 | 20 | 0 days 18:00:00 | -230 | -268.384664 | -18.384664 | |||
material_2 | 2023-01-01 | 300 | 2023-01-01 00:00:00 | 300 | 0 days 00:00:00 | 0 | -7.548712 | 292.451288 |
2023-01-01 07:00:00 | 200 | 0 days 07:00:00 | -100 | -108.984915 | 191.015085 | |||
2023-01-01 12:00:00 | 100 | 0 days 12:00:00 | -200 | -181.439346 | 118.560654 | |||
2023-01-01 20:00:00 | 10 | 0 days 20:00:00 | -290 | -297.366436 | 2.633564 | |||
material_3 | 2023-01-01 | 310 | 2023-01-01 00:00:00 | 310 | 0 days 00:00:00 | 0 | -7.548712 | 302.451288 |
2023-01-01 06:00:00 | 200 | 0 days 06:00:00 | -110 | -94.494029 | 215.505971 | |||
2023-01-01 12:00:00 | 90 | 0 days 12:00:00 | -220 | -181.439346 | 128.560654 | |||
2023-01-01 16:00:00 | 50 | 0 days 16:00:00 | -260 | -239.402891 | 70.597109 | |||
2023-01-01 21:00:00 | 5 | 0 days 21:00:00 | -305 | -311.857322 | -1.857322 |
In [251]:
panel_data['Y_pred']
Out[251]:
material time_initial temperature_initial time
materila_1 2023-01-01 250 2023-01-01 00:00:00 -7.548712
2023-01-01 07:00:00 -108.984915
2023-01-01 18:00:00 -268.384664
material_2 2023-01-01 300 2023-01-01 00:00:00 -7.548712
2023-01-01 07:00:00 -108.984915
2023-01-01 12:00:00 -181.439346
2023-01-01 20:00:00 -297.366436
material_3 2023-01-01 310 2023-01-01 00:00:00 -7.548712
2023-01-01 06:00:00 -94.494029
2023-01-01 12:00:00 -181.439346
2023-01-01 16:00:00 -239.402891
2023-01-01 21:00:00 -311.857322
Name: Y_pred, dtype: float64
In [ ]: