es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

Diagrama de dispersión de la temperatura media por hora normalizada

#
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?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    import numpy as np
    from scipy.optimize import curve_fit
    
    # Define temperature patterns for daytime and nighttime
    def daytime_func(x, a, b, c, d):
        return a*np.exp(-b*x) + c*np.exp(-d*x)
    
    def nighttime_func(x, a, b, c):
        return a*np.cos(b*x) + c
    
    # Define the piecewise function to fit to the data
    def temp_func(x, *params):
        if x < 8 or x > 20:
            return nighttime_func(x, *params[:3])
        else:
            return daytime_func(x, *params[3:])
    
    # Generate some example data
    x = np.arange(0, 24)
    y = np.random.rand(24)
    
    # Fit the function to the data
    p0 = [1, 0.1, 1, 0.1, 1]  # Estimación inicial de los parámetros
    bounds = ([0]*5, [np.inf]*5)  # Límites de los parámetros
    popt, pcov = curve_fit(temp_func, x, y, p0=p0, bounds=bounds)
    
    # Plot the data and fitted curve
    import matplotlib.pyplot as plt
    plt.plot(x, y, 'ko')
    plt.plot(x, temp_func(x, *popt), 'r-')
    plt.show()
    

    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 o nighttime_func) según el valor de entrada. El parámetro p0 es una estimación inicial de los parámetros de la función, y bounds define los límites inferiores y superiores de cada parámetro durante la optimización. Finalmente, se llama a la función curve_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.

Comments are closed.