例如,在这里处理一些每月数据 -
月 | 价值 |
---|---|
2024年10月1日 | 100 |
2024年1月11日 | 150 |
2024年1月12日 | 400 |
现在请记住,这些值是相关月份的每日平均值。
最终目标是一个包含 2024 年 10 月 1 日至 2024 年 12 月 31 日每日值的 DataFrame,它已三次样条/连接月平均值,但问题是 - 这样日平均值就会达到原始月平均值。
我能够使用三次样条插值方法根据这些值创建每日预测,即
# data has been pre processed so that monthly values are at the midpoint for each month and other dates are empty
start_date = df.index.min()
end_date = df.index.max()
date_range = pd.date_range(start=start_date, end=end_date, freq='D')
new_df = pd.DataFrame(data=date_range, columns=['Month'])
new_df.set_index('Month', inplace=True)
for col in df.columns:
cs = CubicSpline(df.dropna().index.values, df[col].dropna().values)
new_df[col] = cs(new_df.index.values)
你明白了要点。
问题是我想优化结果,以便当我取每日值的平均值时,它们会达到原始的每月值。
我理解这可能是一个统计问题,而不是一个编码问题。我理解为什么会发生这种情况 - 这是因为 11 月两侧的月平均值(在本例中)与 11 月中点的距离不等,即进入 12 月的斜坡更陡,因此真正的平均值被拉高了。
scipy.interpolate 或其他包中是否有可用的优化可以做到这一点?
正如罗伯特在评论中暗示的那样,在标准库中找不到执行您想要的操作的正确算法。对该主题的快速搜索会产生一些有趣的结果,例如 https://www.sciencedirect.com/science/article/pii/S0022247X06001703,这证明在样条系数的推导中添加不常见的约束并不是闻所未闻的事情。具体来说,该论文的第二章讨论了将插值数据的平均值固定为固定值。我还没有阅读详细信息,但似乎他们的大多数引理仅适用于线性插值。
如果您的数学技能能够应对挑战,您应该首先尝试理解并推导常用的三次样条,然后按照与论文中类似的策略添加约束。