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)
# 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])