示例#1
0
def distrib_quantile(q, largeur):
    """modèles de distribution pour partager en quantile (pour affichage du seuil [axvline])"""
    global ladistribution
    if ladistribution == "alpha":
        return alpha.ppf(q, 0.8, 0, largeur)
    elif ladistribution == "gauss":
        return stat.norm.ppf(q, 0, largeur)
    elif ladistribution == "triangle":
        return triang.ppf(q, 0, 0, largeur)
    elif ladistribution == "weibull":
        return weibull_min.ppf(q, 1.1, 0, largeur)
示例#2
0
# Author:      Jean
#
# Created:     27/08/2019
# Copyright:   (c) Jean 2019
# Licence:     <your licence>
#-------------------------------------------------------------------------------

import numpy as np
from scipy.stats import alpha
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, 1)
a = 3.57
mean, var, skew, kurt = alpha.stats(a, moments='mvsk')
#print(mean, var, skew, kurt)
x = np.linspace(alpha.ppf(0.01, a), alpha.ppf(0.99, a), 100)

#Display the probability density function (pdf)
ax.plot(x, alpha.pdf(x, a), 'r-', lw=5, alpha=0.6, label='alpha pdf')

#Freeze the distribution and display the frozen pdf
rv = alpha(a)
ax.plot(x, rv.pdf(x), 'k-', lw=1, label='frozen pdf')

#Check accuracy of cdf and ppf
vals = alpha.ppf([0.001, 0.5, 0.999], a)
np.allclose([0.001, 0.5, 0.999], alpha.cdf(vals, a))

#Generate random numbers
r = alpha.rvs(a, size=1000)
def optimize1Model(modele, datedebut):
    """
        
        Modelise la courbe google trends par une fonction mathematique en optimisant ses parametres. Parmi les trois distributions, on retient la meilleure
        
        modele: str, le modele a optimiser
        
        datedebut: dict, dictionnaire associant a chaque modele sa date de lancement
        
        return: une liste avec l'ecart cummule entre la modelisation et la courbe brute pour les trois lois, la meilleure distribution et l'estimation de l'obsolescence associee.
        
        """
    modele = formatNameModel(modele)
    print('optimisation du modele : ', modele)
    donnees_brutes = recoverRawTrends(modele)

    ##recuperation ou calcul de la date de lancement
    launchdate = datedebut[modele]
    if not launchdate:
        launchdate = calculatelaunchdate(donnees_brutes["Mois"],
                                         donnees_brutes[modele])

    ##fonctions d'optimisations suivant la distribution choisie
    def objW(X):
        return objectif('w', X, launchdate.toordinal(), donnees_brutes[modele],
                        donnees_brutes["Mois"])

    def objA(X):
        return objectif('a', X, launchdate.toordinal(), donnees_brutes[modele],
                        donnees_brutes["Mois"])

    def objT(X):
        return objectif('t', X, launchdate.toordinal(), donnees_brutes[modele],
                        donnees_brutes["Mois"])

    ## minimizer
    x0W = [183, 25000, 1.15]  #modelisation initiale pour Weibull
    bndsW = ((150, 1500), (24000, 100000), (1.05, 1.9)
             )  #bornes des parametres de la loi de Weibull
    x0A = [250, 50, 0]  #modelisation initiale pour Alpha et triangulaire
    bndsA = (
        (100, 5000), (1, 100), (-400, 50)
    )  # bornes des parametres de la loi Alpha et triangulaires (entre 60 et 10000 jours, entre 1 et 100 unites ordonnée et entre -400 et 50 pour l'offset)
    resultW = minimize(objW,
                       x0W,
                       method='Powell',
                       bounds=bndsW,
                       options={
                           'maxiter': 100000,
                           'maxfev': 1000,
                           'return_all': True
                       })  #fonction d'optimisation de notre modelisation
    ecartW = objectif('w', resultW.x, launchdate.toordinal(),
                      donnees_brutes[modele], donnees_brutes["Mois"])
    min = 'w'
    resultA = minimize(objA,
                       x0A,
                       method='Powell',
                       bounds=bndsA,
                       options={
                           'maxiter': 100000,
                           'maxfev': 1000,
                           'return_all': True
                       })
    ecartA = objectif('a', resultA.x, launchdate.toordinal(),
                      donnees_brutes[modele], donnees_brutes["Mois"])
    if ecartA < ecartW:
        min = 'a'
    resultT = minimize(objT,
                       x0A,
                       method='Powell',
                       bounds=bndsA,
                       options={
                           'maxiter': 100000,
                           'maxfev': 1000,
                           'return_all': True
                       })
    ecartT = objectif('a', resultT.x, launchdate.toordinal(),
                      donnees_brutes[modele], donnees_brutes["Mois"])
    if (ecartT < ecartA and min == 'a') or (ecartT < ecartW and min == 'w'):
        min = 't'
    print('meilleure distribution : ' + min)
    print('Parametres optimisés : ', end='')
    if min == 'a':
        print(resultA.x)
        best = resultA
        minscore = round(
            alpha.ppf(0.8,
                      0.8,
                      loc=launchdate.toordinal() - resultA.x[0] / 10 +
                      resultA.x[2],
                      scale=resultA.x[0] / 1.7) - launchdate.toordinal())
    elif min == 't':
        print(resultT.x)
        best = resultT
        minscore = round(
            triang.stats(0.1,
                         launchdate.toordinal() +
                         resultT.x[2], resultT.x[0], 'm') +
            2.5 * math.sqrt(
                triang.stats(0.1,
                             launchdate.toordinal() +
                             resultT.x[2], resultT.x[0], 'v')) -
            launchdate.toordinal())
    else:
        print(resultW.x)
        best = resultW
        minscore = round(
            weibull_min.stats(resultW.x[2], launchdate.toordinal(),
                              resultW.x[0], 'm') +
            2.5 * math.sqrt(
                weibull_min.stats(resultW.x[2], launchdate.toordinal(),
                                  resultW.x[0], 'v')) - launchdate.toordinal())
    print()
    # montre_solution(min, best.x, launchdate.toordinal(), donnees_brutes[modele], donnees_brutes["Mois"], modele) #affichage de la solution

    return ([modele, resultA.x, resultT.x,
             resultW.x], [modele, ecartT, ecartA, ecartW, min, minscore])