使用 SciPy 优化以将一条曲线拟合到多个数据系列

Using SciPy optimize to fit one curve to many data series

我有很多天的每小时平均气温。这些都已标准化,因此每日最低和最高温度分别等于 0 和 1,每个小时平均温度都按比例缩放到此范围。

df
[out]:
    Date_time   00:00   01:00   02:00   03:00   04:00   05:00   06:00   07:00   08:00   09:00   10:00   11:00   12:00   13:00   14:00   15:00   16:00   17:00   18:00   19:00   20:00   21:00   22:00   23:00   Max     Min
0   2019-02-03  0.0875  0.0868  0.0440  0.0120  0.0108  0.0461  0.0961  0.2787  0.4908  0.6854  0.7379  0.8615  0.9284  0.8488  0.7711  0.2200  0.1617  0.2376  0.2211  0.1782  0.1700  0.1736  0.1174  0.1389  25.7    17.9
1   2019-03-07  0.0432  0.0432  0.0126  0.0011  0.0054  0.0065  0.0121  0.0592  0.2799  0.4322  0.7461  0.7475  0.8130  0.8599  0.6245  0.4815  0.4641  0.3502  0.2126  0.1878  0.1988  0.2114  0.2168  0.2292  21.6    17.9
2   2019-04-21  0.0651  0.0507  0.0324  0.0198  0.0703  0.0454  0.0457  0.2019  0.3700  0.5393  0.6593  0.7556  0.8682  0.9374  0.9593  0.9110  0.8721  0.6058  0.4426  0.3788  0.3447  0.3136  0.2564  0.1414  29.3    15.1

我希望使用 SciPy 优化来将曲线拟合到每小时的温度模式。我无法将曲线拟合到完整的时间序列数据集,因为:

绘制完整数据集时,结果如下:

我想为此拟合一条曲线,但是 SciPy 上的所有示例都使用了在任何时间间隔内只给出一个值的数据集。

一个选项可能是计算每小时的平均值并应用 SciPy 优化。我可以使用另一个函数对 Python 中的完整数据集应用拟合吗?

正如其他人提到的,有很多方法可以拟合数据。这取决于你的假设和你想做什么。这是对样本数据进行简单多项式拟合的示例。

首先加载并处理数据

from io import StringIO
from datetime import datetime as dt
import pandas as pd
import numpy as np
data = StringIO('''
    Date_time   00:00   01:00   02:00   03:00   04:00   05:00   06:00   07:00   08:00   09:00   10:00   11:00   12:00   13:00   14:00   15:00   16:00   17:00   18:00   19:00   20:00   21:00   22:00   23:00   Max     Min
0   2019-02-03  0.0875  0.0868  0.0440  0.0120  0.0108  0.0461  0.0961  0.2787  0.4908  0.6854  0.7379  0.8615  0.9284  0.8488  0.7711  0.2200  0.1617  0.2376  0.2211  0.1782  0.1700  0.1736  0.1174  0.1389  25.7    17.9
1   2019-03-07  0.0432  0.0432  0.0126  0.0011  0.0054  0.0065  0.0121  0.0592  0.2799  0.4322  0.7461  0.7475  0.8130  0.8599  0.6245  0.4815  0.4641  0.3502  0.2126  0.1878  0.1988  0.2114  0.2168  0.2292  21.6    17.9
2   2019-04-21  0.0651  0.0507  0.0324  0.0198  0.0703  0.0454  0.0457  0.2019  0.3700  0.5393  0.6593  0.7556  0.8682  0.9374  0.9593  0.9110  0.8721  0.6058  0.4426  0.3788  0.3447  0.3136  0.2564  0.1414  29.3    15.1
''')
df = pd.read_csv(data, sep = '\s+')
df2 = df.copy()
del df2['Date_time']
del df2['Max']
del df2['Min']

提取基础小时数和观测值,放入扁平数组中

hours = [dt.strptime(ts, '%H:%M').hour for ts in df2.columns]
raw_data = df2.values.flatten()
hours_rep = np.tile(hours, df2.values.shape[0])

拟合次数为 deg 的多项式(下面设置为 6)。这将是最佳拟合,因为输入数据在同一小时内有多个观测值

deg = 6
p = np.polyfit(hours_rep, raw_data, deg = deg)
fit_data = np.polyval(p, hours)

绘制结果

import matplotlib.pyplot as plt
plt.plot(hours, df2.values.T, '.', label = 'obs')
plt.plot(hours, fit_data, 'o-', label = 'fit')
plt.legend(loc = 'best')
plt.show()

这是它的样子