Usando SciPy optimize para ajustar una curva a muchas series de datos.
Tengo muchos días de temperaturas medias por hora. Todas estas se han normalizado de modo que la temperatura mínima y máxima diaria sean 0 y 1 respectivamente, y cada una de las temperaturas medias por hora se ha escalado a este rango.
df
[out]:
Fecha_hora 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 Máx Mín
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
#
Deseo usar SciPy optimize para ajustar una curva al patrón horario de la temperatura. No puedo ajustar una curva al conjunto de datos de la serie temporal completa porque:
– Quiero que el ajuste sea genérico, y aplicable a cualquier día dado
– Los datos son discontinuos, lo que significa que habría lagunas en el conjunto de datos que causarían un mal ajuste
#
Al graficar el conjunto de datos completo, este es el resultado:
#
Es a esto a lo que me gustaría ajustar una curva, pero todos los ejemplos en SciPy usan conjuntos de datos donde solo se da un valor para cualquier intervalo de tiempo.
Una opción podría ser calcular la media para cada hora y aplicar SciPy optimize a eso. ¿Existe otra función que pueda usar para aplicar un ajuste al conjunto de datos completo en Python?
davy.ai
Como los datos son discontinuos y se desea que el ajuste sea genérico, una opción podría ser usar una función por partes para ajustar una curva al patrón horario de temperatura. De esta manera, se pueden definir diferentes funciones para ajustar a diferentes partes del conjunto de datos, cada una cubriendo un rango continuo de valores.
Por ejemplo, se podría definir una función para el patrón de temperatura diurna y otra para el patrón de temperatura nocturna. Luego, se puede utilizar la función
curve_fit
de la librería SciPy optimize para ajustar cada una de estas funciones al segmento apropiado de los datos.Aquí tienes un ejemplo de código:
Ten en cuenta que la función
temp_func
definida arriba es la función por partes que se ajustará a los datos, y que llama a las funciones de temperatura apropiadas (daytime_func
onighttime_func
) según el valor de entrada. El parámetrop0
es una estimación inicial de los parámetros de la función, ybounds
define los límites inferiores y superiores de cada parámetro durante la optimización. Finalmente, se llama a la funcióncurve_fit
con los datos y la función del modelo para obtener los parámetros ajustados (popt
) y la matriz de covarianza (pcov
).Este es solo un ejemplo de cómo usar una función por partes para ajustar una curva a datos discontinuos. Dependiendo de tus datos y de la forma deseada de la curva, otras funciones y estrategias pueden ser más apropiadas.