python - 如何使用 python 将曲线拟合到数据,然后从计算的曲线中获取可重用的函数?
问题描述
我有一个值的字典,在这种情况下,键是时间间隔,值是百分比,目的是查看某个值是否在一段时间内超过了某个值。该表用于确定我们是否根据经过的时间和获得的回报出售投资,随着时间的推移,它变得不那么严格。
roi = {
"0": 0.13,
"10": 0.07,
"30": 0.04,
"50": 0.025,
"75": 0.017,
"360": 0.01,
"720": 0.005,
"1440": 0
}
例如,在上表中,一项投资将具有以百分比表示的利润值,以及自交易开始以来经过的时间量。
假设当前交易开始时间为 321 分钟,该投资的当前利润为 0.012(或 1.2%)。根据上表,我不会卖出,因为在 75 分钟时阈值为 0.017,直到 360 分钟才下降到 0.01。我想计算上述步骤的“介于”值。
我想做的是拿这张表并为其拟合多项式曲线(或任何形状曲线似乎最有意义)。我想我可以用 scipy.optimize curve_fit 来完成那部分,我不明白该怎么做就是使用生成的曲线作为我可以重用的函数。
理想情况下,我会制作一条曲线并得到一个类似于 f(t) = curve(t) 的结果函数,如果我将经过的时间(以分钟为单位)提供给它,它将返回一个阈值,我可以简单地与我当前的利润点进行比较.
我怎样才能以最简单的方式做到这一点?
解决方案
好吧,curve_fit
接受一个要使用的函数,所以写一个你想象的函数,它可能会估计你的数据并告诉函数把东西放进去。
例如,这是一个快速工作台,它尝试了几个不同的公式(似乎没有一个对您的数据有好处):
import numpy as np
import scipy.optimize
def poly1(x, a, b):
return a + (x * b)
def poly2(x, a, b, c):
return a + (x * b) + (x * c ** 2)
def poly3(x, a, b, c, d):
return a + (x * b) + (x * c ** 2) + (x * d ** 3)
def poly4(x, a, b, c, d, e):
return a + (x * b) + (x * c ** 2) + (x * d ** 3) + (x * e ** 4)
def exp(x, a, b, c):
return a * np.exp(-b * x) + c
def make_estimator(func, data):
xs, ys = zip(*sorted(data.items()))
popt, pcov = scipy.optimize.curve_fit(func, xs, ys)
return lambda x: func(x, *popt)
roi = {0: 0.13, 10: 0.07, 30: 0.04, 50: 0.025, 75: 0.017, 360: 0.01, 720: 0.005, 1440: 0}
for fn in (poly1, poly2, poly3, poly4, exp):
estimator = make_estimator(fn, roi)
print(fn.__name__)
for x, y in roi.items():
print(" ", x, y, estimator(x))
输出(函数名称,然后是 X / 预期 Y / 估计 Y):
poly1
0 0.13 0.05327832501447001
10 0.07 0.0527970341388061
30 0.04 0.051834452387478275
50 0.025 0.05087187063615046
75 0.017 0.04966864344699068
360 0.01 0.035951853490569216
720 0.005 0.01862538196666843
1440 0 -0.01602756108113315
poly2
0 0.13 0.05327825887535825
10 0.07 0.05279697258050309
30 0.04 0.05183439999079287
50 0.025 0.05087182740108176
75 0.017 0.04966861166394487
360 0.01 0.03595195226056802
720 0.005 0.01862564564576985
1440 0 -0.01602696758379807
poly3
0 0.13 0.053278611339440854
10 0.07 0.05279731865610769
30 0.04 0.051834733289439286
50 0.025 0.05087214792277088
75 0.017 0.049668916214438044
360 0.01 0.03595207473939817
720 0.005 0.0186255381393882
1440 0 -0.01602753506068859
poly4
0 0.13 0.05327798112102359
10 0.07 0.05279669504099971
30 0.04 0.051834122880952016
50 0.025 0.05087155072090255
75 0.017 0.04966833552083472
360 0.01 0.035951682240153104
720 0.005 0.018625383359278658
1440 0 -0.016027214402470236
exp
0 0.13 0.12999999999999978
10 0.07 0.023857142857142858
30 0.04 0.023857142857142858
50 0.025 0.023857142857142858
75 0.017 0.023857142857142858
360 0.01 0.023857142857142858
720 0.005 0.023857142857142858
1440 0 0.023857142857142858
推荐阅读
- laravel - 如何在真实设备中运行与另一个 laravel 应用程序的 api 配合使用的离子应用程序?
- react-native - 无法在 react-native-webrtc 上启动仅音频连接
- css - Bootstrap css不适用于角度动态注入的组件
- unity3d - (Unity)如何保存我动态添加到下拉列表中的所有选项?
- python - 使用栅格计算器和整数值构建 Qgis Modeler
- java - 我如何修复这个 java.io.NotSerializableException: java 中的错误?
- java - 如何使用 Sketchware 修改 Java 代码以发送多个电子邮件附件?
- android - Android 和 iOS:仅针对选定条件显示推送通知
- css - 如何使 vue js 网站打印机可访问?
- vuejs2 - 单击对话框上的取消后,Vuetify 组合框没有获得焦点