def test_Fit_Lognormal_3P(): dist = Lognormal_Distribution(mu=1,sigma=0.5, gamma=500) rawdata = dist.random_samples(20, seed=5) data = make_right_censored_data(data=rawdata, threshold=dist.mean) fit = Fit_Lognormal_3P(failures=data.failures, right_censored=data.right_censored, show_probability_plot=False, print_results=False) assert_allclose(fit.mu, 6.2074393111799395,rtol=rtol,atol=atol) assert_allclose(fit.sigma, 0.0018428336205591194,rtol=rtol,atol=atol) assert_allclose(fit.gamma, 6.216971087828216,rtol=rtol,atol=atol) assert_allclose(fit.AICc, 54.382774526710904,rtol=rtol,atol=atol) assert_allclose(fit.Cov_mu_sigma, 4.689716427080205e-08,rtol=rtol,atol=atol) assert_allclose(fit.loglik, -23.441387263355452,rtol=rtol,atol=atol)
def test_Fit_Lognormal_2P(): dist = Lognormal_Distribution(mu=1,sigma=0.5) rawdata = dist.random_samples(20, seed=5) data = make_right_censored_data(data=rawdata, threshold=dist.mean) fit = Fit_Lognormal_2P(failures=data.failures, right_censored=data.right_censored, show_probability_plot=False, print_results=False) assert_allclose(fit.mu, 0.9494189618970151,rtol=rtol,atol=atol) assert_allclose(fit.sigma, 0.4267323807168996,rtol=rtol,atol=atol) assert_allclose(fit.gamma, 0,rtol=rtol,atol=atol) assert_allclose(fit.AICc, 49.69392320890684,rtol=rtol,atol=atol) assert_allclose(fit.Cov_mu_sigma, 0.0025054526707355687,rtol=rtol,atol=atol) assert_allclose(fit.loglik, -22.494020427982832,rtol=rtol,atol=atol)
def test_Probability_of_failure(): stress = Weibull_Distribution(alpha=40, beta=4) strength = Lognormal_Distribution(mu=1.8, sigma=0.25, gamma=50) result = Probability_of_failure(stress=stress, strength=strength, print_results=False, show_distribution_plot=False) assert_allclose(result, 0.02155359226336879, rtol=rtol, atol=atol)
def test_stress_strength(): stress = Weibull_Distribution(alpha=40, beta=4) strength = Lognormal_Distribution(mu=1.8, sigma=0.25, gamma=50) result = stress_strength(stress=stress, strength=strength, print_results=False, show_plot=False) assert_allclose(result, 0.021559141113795574, rtol=rtol, atol=atol)
def __update_params(_, self): value1 = self.s0.val value2 = self.s1.val value3 = self.s2.val if self.name == 'Weibull': dist = Weibull_Distribution(alpha=value1, beta=value2, gamma=value3) elif self.name == 'Loglogistic': dist = Loglogistic_Distribution(alpha=value1, beta=value2, gamma=value3) elif self.name == 'Gamma': dist = Gamma_Distribution(alpha=value1, beta=value2, gamma=value3) elif self.name == 'Loglogistic': dist = Loglogistic_Distribution(alpha=value1, beta=value2, gamma=value3) elif self.name == 'Lognormal': dist = Lognormal_Distribution(mu=value1, sigma=value2, gamma=value3) elif self.name == 'Beta': dist = Beta_Distribution(alpha=value1, beta=value2) elif self.name == 'Normal': dist = Normal_Distribution(mu=value1, sigma=value2) elif self.name == 'Exponential': dist = Exponential_Distribution(Lambda=value1, gamma=value2) else: raise ValueError(str(self.name + ' is an unknown distribution name')) plt.sca(self.ax_pdf) plt.cla() dist.PDF() plt.title('PDF') plt.xlabel('') plt.ylabel('') plt.sca(self.ax_cdf) plt.cla() dist.CDF() plt.title('CDF') plt.xlabel('') plt.ylabel('') plt.sca(self.ax_sf) plt.cla() dist.SF() plt.title('SF') plt.xlabel('') plt.ylabel('') plt.sca(self.ax_hf) plt.cla() dist.HF() plt.title('HF') plt.xlabel('') plt.ylabel('') plt.sca(self.ax_chf) plt.cla() dist.CHF() plt.title('CHF') plt.xlabel('') plt.ylabel('') plt.subplots_adjust(left=0.07, right=0.98, top=0.9, bottom=0.25, wspace=0.18, hspace=0.30) plt.suptitle(dist.param_title_long, fontsize=15) plt.draw()
def test_Fit_Lognormal_3P(): dist = Lognormal_Distribution(mu=1, sigma=0.5, gamma=500) rawdata = dist.random_samples(20, seed=5) data = make_right_censored_data(data=rawdata, threshold=dist.mean) MLE = Fit_Lognormal_3P(failures=data.failures, right_censored=data.right_censored, method='MLE', show_probability_plot=False, print_results=False) assert_allclose(MLE.mu, 0.5608879850309877, rtol=rtol, atol=atol) assert_allclose(MLE.sigma, 0.7396271168422542, rtol=rtol, atol=atol) assert_allclose(MLE.gamma, 500.79568888668746, rtol=rtol, atol=atol) assert_allclose(MLE.AICc, 52.067948767151364, rtol=rtol, atol=atol) assert_allclose(MLE.BIC, 53.555145587813335, rtol=rtol, atol=atol) assert_allclose(MLE.loglik, -22.283974383575682, rtol=rtol, atol=atol) assert_allclose(MLE.AD, 46.95299490218758, rtol=rtol, atol=atol) assert_allclose(MLE.Cov_mu_sigma, 0.007500058692172027, rtol=rtol, atol=atol) LS = Fit_Lognormal_3P(failures=data.failures, right_censored=data.right_censored, method='LS', show_probability_plot=False, print_results=False) assert_allclose(LS.mu, 0.976088004545536, rtol=rtol, atol=atol) assert_allclose(LS.sigma, 0.4340076639560259, rtol=rtol, atol=atol) assert_allclose(LS.gamma, 499.9229609896007, rtol=rtol, atol=atol) assert_allclose(LS.AICc, 52.60637160294965, rtol=rtol, atol=atol) assert_allclose(LS.BIC, 54.09356842361162, rtol=rtol, atol=atol) assert_allclose(LS.loglik, -22.553185801474825, rtol=rtol, atol=atol) assert_allclose(LS.AD, 46.93164376455629, rtol=rtol, atol=atol) assert_allclose(LS.Cov_mu_sigma, 0.0025619981036203664, rtol=rtol, atol=atol)
def test_Fit_Lognormal_2P(): dist = Lognormal_Distribution(mu=1, sigma=0.5) rawdata = dist.random_samples(20, seed=5) data = make_right_censored_data(data=rawdata, threshold=dist.mean) MLE = Fit_Lognormal_2P(failures=data.failures, right_censored=data.right_censored, method='MLE', show_probability_plot=False, print_results=False) assert_allclose(MLE.mu, 0.9494190246173423, rtol=rtol, atol=atol) assert_allclose(MLE.sigma, 0.4267323457212804, rtol=rtol, atol=atol) assert_allclose(MLE.gamma, 0, rtol=rtol, atol=atol) assert_allclose(MLE.AICc, 49.69392320890687, rtol=rtol, atol=atol) assert_allclose(MLE.BIC, 50.979505403073674, rtol=rtol, atol=atol) assert_allclose(MLE.loglik, -22.494020427982846, rtol=rtol, atol=atol) assert_allclose(MLE.AD, 46.91678130009629, rtol=rtol, atol=atol) assert_allclose(MLE.Cov_mu_sigma, 0.002505454567167978, rtol=rtol, atol=atol) LS = Fit_Lognormal_2P(failures=data.failures, right_censored=data.right_censored, method='LS', show_probability_plot=False, print_results=False) assert_allclose(LS.mu, 0.9427890879489974, rtol=rtol, atol=atol) assert_allclose(LS.sigma, 0.4475312141445822, rtol=rtol, atol=atol) assert_allclose(LS.gamma, 0, rtol=rtol, atol=atol) assert_allclose(LS.AICc, 49.757609068995194, rtol=rtol, atol=atol) assert_allclose(LS.BIC, 51.043191263162, rtol=rtol, atol=atol) assert_allclose(LS.loglik, -22.52586335802701, rtol=rtol, atol=atol) assert_allclose(LS.AD, 46.93509652892565, rtol=rtol, atol=atol) assert_allclose(LS.Cov_mu_sigma, 0.0025640250120794526, rtol=rtol, atol=atol)
def __init__(self, distribution, include_location_shifted=True, show_plot=True, print_results=True, number_of_distributions_to_show=3): # ensure the input is a distribution object if type(distribution) not in [ Weibull_Distribution, Normal_Distribution, Lognormal_Distribution, Exponential_Distribution, Gamma_Distribution, Beta_Distribution ]: raise ValueError( 'distribution must be a probability distribution object from the reliability.Distributions module. First define the distribution using Reliability.Distributions.___' ) # sample the CDF from 0.001 to 0.999. These samples will be used to fit all other distributions. RVS = distribution.quantile( np.linspace(0.001, 0.999, 698) ) # 698 samples is the ideal number for the points to align. Evidenced using plot_points. # filter out negative values RVS_filtered = [] negative_values_error = False for item in RVS: if item > 0: RVS_filtered.append(item) else: negative_values_error = True if negative_values_error is True: print( 'WARNING: The input distribution has non-negligible area for x<0. Samples from this region have been discarded to enable other distributions to be fitted.' ) fitted_results = Fit_Everything( failures=RVS_filtered, print_results=False, show_probability_plot=False, show_histogram_plot=False, show_PP_plot=False ) # fit all distributions to the filtered samples ranked_distributions = list(fitted_results.results.index.values) ranked_distributions.remove( distribution.name2 ) # removes the fitted version of the original distribution ranked_distributions_objects = [] ranked_distributions_labels = [] sigfig = 2 for dist_name in ranked_distributions: if dist_name == 'Weibull_2P': ranked_distributions_objects.append( Weibull_Distribution(alpha=fitted_results.Weibull_2P_alpha, beta=fitted_results.Weibull_2P_beta)) ranked_distributions_labels.append( str('Weibull_2P (α=' + str(round(fitted_results.Weibull_2P_alpha, sigfig)) + ',β=' + str(round(fitted_results.Weibull_2P_beta, sigfig)) + ')')) elif dist_name == 'Gamma_2P': ranked_distributions_objects.append( Gamma_Distribution(alpha=fitted_results.Gamma_2P_alpha, beta=fitted_results.Gamma_2P_beta)) ranked_distributions_labels.append( str('Gamma_2P (α=' + str(round(fitted_results.Gamma_2P_alpha, sigfig)) + ',β=' + str(round(fitted_results.Gamma_2P_beta, sigfig)) + ')')) elif dist_name == 'Normal_2P': ranked_distributions_objects.append( Normal_Distribution(mu=fitted_results.Normal_2P_mu, sigma=fitted_results.Normal_2P_sigma)) ranked_distributions_labels.append( str('Normal_2P (μ=' + str(round(fitted_results.Normal_2P_mu, sigfig)) + ',σ=' + str(round(fitted_results.Normal_2P_sigma, sigfig)) + ')')) elif dist_name == 'Lognormal_2P': ranked_distributions_objects.append( Lognormal_Distribution( mu=fitted_results.Lognormal_2P_mu, sigma=fitted_results.Lognormal_2P_sigma)) ranked_distributions_labels.append( str('Lognormal_2P (μ=' + str(round(fitted_results.Lognormal_2P_mu, sigfig)) + ',σ=' + str(round(fitted_results.Lognormal_2P_sigma, sigfig)) + ')')) elif dist_name == 'Exponential_1P': ranked_distributions_objects.append( Exponential_Distribution( Lambda=fitted_results.Expon_1P_lambda)) ranked_distributions_labels.append( str('Exponential_1P (lambda=' + str(round(fitted_results.Expon_1P_lambda, sigfig)) + ')')) elif dist_name == 'Beta_2P': ranked_distributions_objects.append( Beta_Distribution(alpha=fitted_results.Beta_2P_alpha, beta=fitted_results.Beta_2P_beta)) ranked_distributions_labels.append( str('Beta_2P (α=' + str(round(fitted_results.Beta_2P_alpha, sigfig)) + ',β=' + str(round(fitted_results.Beta_2P_beta, sigfig)) + ')')) if include_location_shifted is True: if dist_name == 'Weibull_3P': ranked_distributions_objects.append( Weibull_Distribution( alpha=fitted_results.Weibull_3P_alpha, beta=fitted_results.Weibull_3P_beta, gamma=fitted_results.Weibull_3P_gamma)) ranked_distributions_labels.append( str('Weibull_3P (α=' + str( round(fitted_results.Weibull_3P_alpha, sigfig)) + ',β=' + str(round(fitted_results.Weibull_3P_beta, sigfig)) + ',γ=' + str(round(fitted_results.Weibull_3P_gamma, sigfig)) + ')')) elif dist_name == 'Gamma_3P': ranked_distributions_objects.append( Gamma_Distribution( alpha=fitted_results.Gamma_3P_alpha, beta=fitted_results.Gamma_3P_beta, gamma=fitted_results.Gamma_3P_gamma)) ranked_distributions_labels.append( str('Gamma_3P (α=' + str(round(fitted_results.Gamma_3P_alpha, sigfig)) + ',β=' + str(round(fitted_results.Gamma_3P_beta, sigfig)) + ',γ=' + str(round(fitted_results.Gamma_3P_gamma, sigfig)) + ')')) elif dist_name == 'Lognormal_3P': ranked_distributions_objects.append( Lognormal_Distribution( mu=fitted_results.Lognormal_3P_mu, sigma=fitted_results.Lognormal_3P_sigma, gamma=fitted_results.Lognormal_3P_gamma)) ranked_distributions_labels.append( str('Lognormal_3P (μ=' + str( round(fitted_results.Lognormal_3P_mu, sigfig)) + ',σ=' + str( round(fitted_results.Lognormal_3P_sigma, sigfig)) + ',γ=' + str( round(fitted_results.Lognormal_3P_gamma, sigfig)) + ')')) elif dist_name == 'Exponential_2P': ranked_distributions_objects.append( Exponential_Distribution( Lambda=fitted_results.Expon_1P_lambda, gamma=fitted_results.Expon_2P_gamma)) ranked_distributions_labels.append( str('Exponential_1P (lambda=' + str( round(fitted_results.Expon_1P_lambda, sigfig)) + ',γ=' + str(round(fitted_results.Expon_2P_gamma, sigfig)) + ')')) number_of_distributions_fitted = len(ranked_distributions_objects) self.results = ranked_distributions_objects self.most_similar_distribution = ranked_distributions_objects[0] if print_results is True: print('The input distribution was:') print(distribution.param_title_long) if number_of_distributions_fitted < number_of_distributions_to_show: number_of_distributions_to_show = number_of_distributions_fitted print('\nThe top', number_of_distributions_to_show, 'most similar distributions are:') counter = 0 while counter < number_of_distributions_to_show and counter < number_of_distributions_fitted: dist = ranked_distributions_objects[counter] print(dist.param_title_long) counter += 1 if show_plot is True: plt.figure(figsize=(14, 6)) plt.suptitle( str('Plot of similar distributions to ' + distribution.param_title_long)) counter = 0 xlower = distribution.quantile(0.001) xupper = distribution.quantile(0.999) x_delta = xupper - xlower plt.subplot(121) distribution.PDF(label=str('Input distribution [' + distribution.name2 + ']'), linestyle='--') while counter < number_of_distributions_to_show and counter < number_of_distributions_fitted: ranked_distributions_objects[counter].PDF( label=ranked_distributions_labels[counter]) counter += 1 plt.xlim([xlower - x_delta * 0.1, xupper + x_delta * 0.1]) plt.legend() plt.title('PDF') counter = 0 plt.subplot(122) distribution.CDF(label=str('Input distribution [' + distribution.name2 + ']'), linestyle='--') while counter < number_of_distributions_to_show and counter < number_of_distributions_fitted: ranked_distributions_objects[counter].CDF( label=ranked_distributions_labels[counter]) counter += 1 plt.xlim([xlower - x_delta * 0.1, xupper + x_delta * 0.1]) plt.legend() plt.title('CDF') plt.subplots_adjust(left=0.08, right=0.95) plt.show()
def __update_distribution(name, self): self.name = name if self.name == 'Weibull': dist = Weibull_Distribution(alpha=100, beta=2, gamma=0) param_names = ['Alpha', 'Beta', 'Gamma'] plt.sca(self.ax0) plt.cla() self.s0 = Slider(self.ax0, param_names[0], valmin=0.1, valmax=500, valinit=dist.alpha) plt.sca(self.ax1) plt.cla() self.s1 = Slider(self.ax1, param_names[1], valmin=0.2, valmax=25, valinit=dist.beta) try: # clear the slider axis if it exists plt.sca(self.ax2) plt.cla() except ValueError: # if the slider axis does no exist (because it was destroyed by a 2P distribution) then recreate it self.ax2 = plt.axes([0.1, 0.05, 0.8, 0.03], facecolor=self.background_color) self.s2 = Slider(self.ax2, param_names[2], valmin=0, valmax=500, valinit=dist.gamma) elif self.name == 'Gamma': dist = Gamma_Distribution(alpha=100, beta=5, gamma=0) param_names = ['Alpha', 'Beta', 'Gamma'] plt.sca(self.ax0) plt.cla() self.s0 = Slider(self.ax0, param_names[0], valmin=0.1, valmax=500, valinit=dist.alpha) plt.sca(self.ax1) plt.cla() self.s1 = Slider(self.ax1, param_names[1], valmin=0.2, valmax=25, valinit=dist.beta) try: # clear the slider axis if it exists plt.sca(self.ax2) plt.cla() except ValueError: # if the slider axis does no exist (because it was destroyed by a 2P distribution) then recreate it self.ax2 = plt.axes([0.1, 0.05, 0.8, 0.03], facecolor=self.background_color) self.s2 = Slider(self.ax2, param_names[2], valmin=0, valmax=500, valinit=dist.gamma) elif self.name == 'Loglogistic': dist = Loglogistic_Distribution(alpha=100, beta=8, gamma=0) param_names = ['Alpha', 'Beta', 'Gamma'] plt.sca(self.ax0) plt.cla() self.s0 = Slider(self.ax0, param_names[0], valmin=0.1, valmax=500, valinit=dist.alpha) plt.sca(self.ax1) plt.cla() self.s1 = Slider(self.ax1, param_names[1], valmin=0.2, valmax=50, valinit=dist.beta) try: # clear the slider axis if it exists plt.sca(self.ax2) plt.cla() except ValueError: # if the slider axis does no exist (because it was destroyed by a 2P distribution) then recreate it self.ax2 = plt.axes([0.1, 0.05, 0.8, 0.03], facecolor=self.background_color) self.s2 = Slider(self.ax2, param_names[2], valmin=0, valmax=500, valinit=dist.gamma) elif self.name == 'Lognormal': dist = Lognormal_Distribution(mu=2.5, sigma=0.5, gamma=0) param_names = ['Mu', 'Sigma', 'Gamma'] plt.sca(self.ax0) plt.cla() self.s0 = Slider(self.ax0, param_names[0], valmin=0, valmax=5, valinit=dist.mu) plt.sca(self.ax1) plt.cla() self.s1 = Slider(self.ax1, param_names[1], valmin=0.01, valmax=2, valinit=dist.sigma) try: # clear the slider axis if it exists plt.sca(self.ax2) plt.cla() except ValueError: # if the slider axis does no exist (because it was destroyed by a 2P distribution) then recreate it self.ax2 = plt.axes([0.1, 0.05, 0.8, 0.03], facecolor=self.background_color) self.s2 = Slider(self.ax2, param_names[2], valmin=0, valmax=500, valinit=dist.gamma) elif self.name == 'Normal': dist = Normal_Distribution(mu=0, sigma=10) param_names = ['Mu', 'Sigma', ''] plt.sca(self.ax0) plt.cla() self.s0 = Slider(self.ax0, param_names[0], valmin=-100, valmax=100, valinit=dist.mu) plt.sca(self.ax1) plt.cla() self.s1 = Slider(self.ax1, param_names[1], valmin=0.01, valmax=20, valinit=dist.sigma) try: # clear the slider axis if it exists self.ax2.remove() # this will destroy the axes except KeyError: pass elif self.name == 'Exponential': dist = Exponential_Distribution(Lambda=1, gamma=0) param_names = ['Lambda', 'Gamma', ''] plt.sca(self.ax0) plt.cla() self.s0 = Slider(self.ax0, param_names[0], valmin=0.001, valmax=5, valinit=dist.Lambda) plt.sca(self.ax1) plt.cla() self.s1 = Slider(self.ax1, param_names[1], valmin=0, valmax=500, valinit=dist.gamma) try: # clear the slider axis if it exists self.ax2.remove() # this will destroy the axes except KeyError: pass elif self.name == 'Beta': dist = Beta_Distribution(alpha=2, beta=2) param_names = ['Alpha', 'Beta', ''] plt.sca(self.ax0) plt.cla() self.s0 = Slider(self.ax0, param_names[0], valmin=0.01, valmax=5, valinit=dist.alpha) plt.sca(self.ax1) plt.cla() self.s1 = Slider(self.ax1, param_names[1], valmin=0.01, valmax=5, valinit=dist.beta) try: # clear the slider axis if it exists self.ax2.remove() # this will destroy the axes except KeyError: pass else: raise ValueError(str(self.name + ' is an unknown distribution name')) plt.suptitle(dist.param_title_long, fontsize=15) distribution_explorer.__update_params(None, self) distribution_explorer.__interactive(self) plt.draw()
def __init__(self, distribution=None, include_location_shifted=True, show_plot=True, print_results=True, monte_carlo_trials=1000, number_of_distributions_to_show=3): if type(distribution) not in [ Weibull_Distribution, Normal_Distribution, Lognormal_Distribution, Exponential_Distribution, Gamma_Distribution, Beta_Distribution ]: raise ValueError( 'distribution must be a probability distribution object from the reliability.Distributions module. First define the distribution using Reliability.Distributions.___' ) if monte_carlo_trials < 100: print( 'WARNING: Using less than 100 monte carlo trials will lead to extremely inaccurate results. The number of monte carlo trials has been changed to 100 to ensure accuracy.' ) monte_carlo_trials = 100 elif monte_carlo_trials >= 100 and monte_carlo_trials < 1000: print( 'WARNING: Using less than 1000 monte carlo trials will lead to inaccurate results.' ) if monte_carlo_trials > 10000: print( 'The recommended number of monte carlo trials is 1000. Using over 10000 may take a long time to calculate.' ) RVS = distribution.random_samples( number_of_samples=monte_carlo_trials ) # draw random samples from the original distribution # filter out negative values RVS_filtered = [] negative_values_error = False for item in RVS: if item > 0: RVS_filtered.append(item) else: negative_values_error = True if negative_values_error is True: print( 'WARNING: The input distribution has non-negligible area for x<0. Monte carlo samples from this region have been discarded to enable other distributions to be fitted.' ) fitted_results = Fit_Everything( failures=RVS_filtered, print_results=False, show_probability_plot=False, show_histogram_plot=False, show_PP_plot=False ) # fit all distributions to the filtered samples ranked_distributions = list(fitted_results.results.index.values) ranked_distributions.remove( distribution.name2 ) # removes the fitted version of the original distribution ranked_distributions_objects = [] ranked_distributions_labels = [] sigfig = 2 for dist_name in ranked_distributions: if dist_name == 'Weibull_2P': ranked_distributions_objects.append( Weibull_Distribution(alpha=fitted_results.Weibull_2P_alpha, beta=fitted_results.Weibull_2P_beta)) ranked_distributions_labels.append( str('Weibull_2P (α=' + str(round(fitted_results.Weibull_2P_alpha, sigfig)) + ',β=' + str(round(fitted_results.Weibull_2P_beta, sigfig)) + ')')) elif dist_name == 'Gamma_2P': ranked_distributions_objects.append( Gamma_Distribution(alpha=fitted_results.Gamma_2P_alpha, beta=fitted_results.Gamma_2P_beta)) ranked_distributions_labels.append( str('Gamma_2P (α=' + str(round(fitted_results.Gamma_2P_alpha, sigfig)) + ',β=' + str(round(fitted_results.Gamma_2P_beta, sigfig)) + ')')) elif dist_name == 'Normal_2P': ranked_distributions_objects.append( Normal_Distribution(mu=fitted_results.Normal_2P_mu, sigma=fitted_results.Normal_2P_sigma)) ranked_distributions_labels.append( str('Normal_2P (μ=' + str(round(fitted_results.Normal_2P_mu, sigfig)) + ',σ=' + str(round(fitted_results.Normal_2P_sigma, sigfig)) + ')')) elif dist_name == 'Lognormal_2P': ranked_distributions_objects.append( Lognormal_Distribution( mu=fitted_results.Lognormal_2P_mu, sigma=fitted_results.Lognormal_2P_sigma)) ranked_distributions_labels.append( str('Lognormal_2P (μ=' + str(round(fitted_results.Lognormal_2P_mu, sigfig)) + ',σ=' + str(round(fitted_results.Lognormal_2P_sigma, sigfig)) + ')')) elif dist_name == 'Exponential_1P': ranked_distributions_objects.append( Exponential_Distribution( Lambda=fitted_results.Expon_1P_lambda)) ranked_distributions_labels.append( str('Exponential_1P (lambda=' + str(round(fitted_results.Expon_1P_lambda, sigfig)) + ')')) elif dist_name == 'Beta_2P': ranked_distributions_objects.append( Beta_Distribution(alpha=fitted_results.Beta_2P_alpha, beta=fitted_results.Beta_2P_beta)) ranked_distributions_labels.append( str('Beta_2P (α=' + str(round(fitted_results.Beta_2P_alpha, sigfig)) + ',β=' + str(round(fitted_results.Beta_2P_beta, sigfig)) + ')')) if include_location_shifted is True: if dist_name == 'Weibull_3P': ranked_distributions_objects.append( Weibull_Distribution( alpha=fitted_results.Weibull_3P_alpha, beta=fitted_results.Weibull_3P_beta, gamma=fitted_results.Weibull_3P_gamma)) ranked_distributions_labels.append( str('Weibull_3P (α=' + str( round(fitted_results.Weibull_3P_alpha, sigfig)) + ',β=' + str(round(fitted_results.Weibull_3P_beta, sigfig)) + ',γ=' + str(round(fitted_results.Weibull_3P_gamma, sigfig)) + ')')) elif dist_name == 'Gamma_3P': ranked_distributions_objects.append( Gamma_Distribution( alpha=fitted_results.Gamma_3P_alpha, beta=fitted_results.Gamma_3P_beta, gamma=fitted_results.Gamma_3P_gamma)) ranked_distributions_labels.append( str('Gamma_3P (α=' + str(round(fitted_results.Gamma_3P_alpha, sigfig)) + ',β=' + str(round(fitted_results.Gamma_3P_beta, sigfig)) + ',γ=' + str(round(fitted_results.Gamma_3P_gamma, sigfig)) + ')')) elif dist_name == 'Lognormal_3P': ranked_distributions_objects.append( Lognormal_Distribution( mu=fitted_results.Lognormal_3P_mu, sigma=fitted_results.Lognormal_3P_sigma, gamma=fitted_results.Lognormal_3P_gamma)) ranked_distributions_labels.append( str('Lognormal_3P (μ=' + str( round(fitted_results.Lognormal_3P_mu, sigfig)) + ',σ=' + str( round(fitted_results.Lognormal_3P_sigma, sigfig)) + ',γ=' + str( round(fitted_results.Lognormal_3P_gamma, sigfig)) + ')')) elif dist_name == 'Exponential_2P': ranked_distributions_objects.append( Exponential_Distribution( Lambda=fitted_results.Expon_1P_lambda, gamma=fitted_results.Expon_2P_gamma)) ranked_distributions_labels.append( str('Exponential_1P (lambda=' + str( round(fitted_results.Expon_1P_lambda, sigfig)) + ',γ=' + str(round(fitted_results.Expon_2P_gamma, sigfig)) + ')')) number_of_distributions_fitted = len(ranked_distributions_objects) self.results = ranked_distributions_objects self.most_similar_distribution = ranked_distributions_objects[0] if print_results is True: print('The input distribution was:') print(distribution.param_title_long) if number_of_distributions_fitted < number_of_distributions_to_show: number_of_distributions_to_show = number_of_distributions_fitted print('\nThe top', number_of_distributions_to_show, 'most similar distributions are:') counter = 0 while counter < number_of_distributions_to_show and counter < number_of_distributions_fitted: dist = ranked_distributions_objects[counter] print(dist.param_title_long) counter += 1 if show_plot is True: plt.figure(figsize=(14, 6)) plt.suptitle( str('Plot of similar distributions to ' + distribution.param_title_long)) counter = 0 xlower = distribution.quantile(0.001) xupper = distribution.quantile(0.999) x_delta = xupper - xlower plt.subplot(121) distribution.PDF(label='Input distribution', linestyle='--') while counter < number_of_distributions_to_show and counter < number_of_distributions_fitted: ranked_distributions_objects[counter].PDF( label=ranked_distributions_labels[counter]) counter += 1 plt.xlim([xlower - x_delta * 0.1, xupper + x_delta * 0.1]) plt.legend() plt.title('PDF') counter = 0 plt.subplot(122) distribution.CDF(label='Input distribution', linestyle='--') while counter < number_of_distributions_to_show and counter < number_of_distributions_fitted: ranked_distributions_objects[counter].CDF( label=ranked_distributions_labels[counter]) counter += 1 plt.xlim([xlower - x_delta * 0.1, xupper + x_delta * 0.1]) plt.legend() plt.title('CDF') plt.subplots_adjust(left=0.08, right=0.95) plt.show()
def HistogramPLOT_all(data, month, year): #Initiate Situation = [] mon = [ 'January', 'Febuary', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ] #Get just Full day data logicF = (data["isFULL"].apply(lambda x: x) == (1)) data01 = data[logicF].copy() data01.fillna(method='ffill', inplace=True) logicY = (data01["DateTime"].apply(lambda x: x.year) == (year)) data01 = data01[logicY].copy() fig = plt.figure(figsize=(24, 18), dpi=80, facecolor='w', edgecolor='r') #Plotting 12 graph xvals = np.linspace(0, 30, 1000) for i in range(month): ax = plt.subplot2grid((4, 3), (int(np.floor(i / 3)), int(i % 3))) logic = (data01["DateTime"].apply(lambda x: x.month)) == (i + 1) ws = data01['WS95'][logic] ws = ws + 0.0001 failures = [] censored = [] threshold = 30 for item in ws: if item > threshold: censored.append(threshold) else: failures.append(item) xvals = np.linspace(0, 30, 1000) print(ws.shape) if (np.sum(logic) != 0): ax.hist(ws, bins=30, normed=True) hist, edge = np.histogram(np.array(ws), bins=1000, range=(0, 30), normed=True) wb2 = Fit_Weibull_2P(failures=failures, show_probability_plot=False, print_results=False) wb3 = Fit_Weibull_3P(failures=failures, show_probability_plot=False, print_results=False) gm2 = Fit_Gamma_2P(failures=failures, show_probability_plot=False, print_results=False) gm3 = Fit_Gamma_3P(failures=failures, show_probability_plot=False, print_results=False) ln2 = Fit_Lognormal_2P(failures=failures, show_probability_plot=False, print_results=False) wbm = Fit_Weibull_Mixture(failures=failures, right_censored=censored, show_plot=False, print_results=False) wb2_pdf = Weibull_Distribution(alpha=wb2.alpha, beta=wb2.beta).PDF( xvals=xvals, show_plot=True, label='Weibull_2P') wb3_pdf = Weibull_Distribution(alpha=wb3.alpha, beta=wb3.beta, gamma=wb3.gamma).PDF( xvals=xvals, show_plot=True, label='Weibull_3P') gm2_pdf = Gamma_Distribution(alpha=gm2.alpha, beta=gm2.beta).PDF(xvals=xvals, show_plot=True, label='Gamma_2P') gm3_pdf = Gamma_Distribution(alpha=gm3.alpha, beta=gm3.beta, gamma=gm3.gamma).PDF(xvals=xvals, show_plot=True, label='Gamma_3P') ln2_pdf = Lognormal_Distribution(mu=ln2.mu, sigma=ln2.sigma).PDF( xvals=xvals, show_plot=True, label='Lognormal_2P') part1_pdf = Weibull_Distribution(alpha=wbm.alpha_1, beta=wbm.beta_1).PDF( xvals=xvals, show_plot=False) part2_pdf = Weibull_Distribution(alpha=wbm.alpha_2, beta=wbm.beta_2).PDF( xvals=xvals, show_plot=False) Mixture_PDF = part1_pdf * wbm.proportion_1 + part2_pdf * wbm.proportion_2 ax.plot(xvals, Mixture_PDF, label='Weibull_Mixture') ax.legend() ax.set_ylim(0, 0.16) ax.set_xlim(0, 30) ax.set_xticks([0, 5, 10, 15, 20, 25, 30]) ax.tick_params(axis="x", labelsize=20) ax.tick_params(axis="y", labelsize=20) ax.set_title('{}'.format(mon[i]), fontweight='bold', size=20) plt.tight_layout() plt.show()
def test_Lognormal_Distribution(): dist = Lognormal_Distribution(mu=2, sigma=0.8, gamma=10) assert_allclose(dist.mean, 20.175674306073336, rtol=rtol, atol=atol) assert_allclose(dist.standard_deviation, 9.634600550542682, rtol=rtol, atol=atol) assert_allclose(dist.variance, 92.82552776851736, rtol=rtol, atol=atol) assert_allclose(dist.skewness, 3.689292296091298, rtol=rtol, atol=atol) assert_allclose(dist.kurtosis, 34.36765343083244, rtol=rtol, atol=atol) assert dist.param_title_long == 'Lognormal Distribution (μ=2,σ=0.8,γ=10)' assert_allclose(dist.quantile(0.2), 13.7685978648453116, rtol=rtol, atol=atol) assert_allclose(dist.inverse_SF(q=0.7), 14.857284757111664, rtol=rtol, atol=atol) assert_allclose(dist.mean_residual_life(20), 9.143537277214762, rtol=rtol, atol=atol) xvals = [dist.gamma - 1, dist.quantile(0.001), dist.quantile(0.01), dist.quantile(0.1), dist.quantile(0.9), dist.quantile(0.99), dist.quantile(0.999)] assert_allclose(dist.PDF(xvals=xvals, show_plot=False), [0.0, 0.006748891633682291, 0.028994071579561444, 0.08276575111567319, 0.01064970121764939, 0.0007011277158027589, 4.807498012690953e-05], rtol=rtol, atol=atol) assert_allclose(dist.CDF(xvals=xvals, show_plot=False), [0.0, 0.001, 0.01, 0.1, 0.9, 0.99, 0.999], rtol=rtol, atol=atol) assert_allclose(dist.SF(xvals=xvals, show_plot=False), [1.0, 0.999, 0.99, 0.9, 0.1, 0.01, 0.001], rtol=rtol, atol=atol) assert_allclose(dist.HF(xvals=xvals, show_plot=False), [0.0, 0.006755647280963254, 0.029286940989456004, 0.09196194568408134, 0.10649701217649381, 0.07011277158027589, 0.04807498012690954], rtol=rtol, atol=atol) assert_allclose(dist.CHF(xvals=xvals, show_plot=False), [-0.0, 0.0010005003335835344, 0.01005033585350145, 0.1053605156578264, 2.302585092994045, 4.605170185988091, 6.907755278982137], rtol=rtol, atol=atol)