Abubakari's picture
Update app.py
a568849 verified
# Import necessary libraries
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import plotly.graph_objects as go
# Define the functions from your code
def Phi(z):
return norm.cdf(z)
def phi(z):
return norm.pdf(z)
# Define the BCNOLLN CDF based on the provided formula
def F_BCNOLLN(y1, y2, mu1, sigma1, alpha1, beta1, mu2, sigma2, alpha2, beta2, lambd):
# Convert y1, y2 to z-scores
z1 = (y1 - mu1) / sigma1
z2 = (y2 - mu2) / sigma2
# Compute H functions
H1_z1 = Phi(z1)**alpha1 + (1 - Phi(z1))**beta1
H2_z2 = Phi(z2)**alpha2 + (1 - Phi(z2))**beta2
# Compute the BCNOLLN CDF
term1 = (Phi(z1)*alpha1 / H1_z1)**(-lambd)
term2 = (Phi(z2)*alpha2 / H2_z2)**(-lambd)
term = term1 + term2 - 1
cdf = term**(-1/lambd)
return cdf
def f_BCNOLLN(y1, y2, mu1, sigma1, alpha1, beta1, mu2, sigma2, alpha2, beta2, lambd):
z1 = (y1 - mu1) / sigma1
z2 = (y2 - mu2) / sigma2
H1_z1 = Phi(z1)**alpha1 + (1 - Phi(z1))**beta1
H2_z2 = Phi(z2)**alpha2 + (1 - Phi(z2))**beta2
term1 = (Phi(z1)**alpha1 / H1_z1)**(-lambd)
term2 = (Phi(z2)**alpha2 / H2_z2)**(-lambd)
common_term = (term1 + term2 - 1)**(-(2*lambd + 1)/lambd)
factor1 = (phi(z1) * Phi(z1)**(alpha1 - 1) * (1 - Phi(z1))**(beta1 - 1) *
(alpha1 + (beta1 - alpha1) * Phi(z1))) / (sigma1 * H1_z1**2)
factor2 = (phi(z2) * Phi(z2)**(alpha2 - 1) * (1 - Phi(z2))**(beta2 - 1) *
(alpha2 + (beta2 - alpha2) * Phi(z2))) / (sigma2 * H2_z2**2)
pdf = (lambd + 1) * common_term * (factor1 * factor2)
return pdf
# Streamlit app
st.title('BCNOLLN Distribution Visualizer')
# Sidebar title and explanation
st.sidebar.title('Parameters')
st.sidebar.write('Adjust the parameters below to visualize the BCNOLLN distribution.')
# Input fields for parameters with sliders
mu1 = st.sidebar.slider('Mean μ1', min_value=-10.0, max_value=10.0, value=0.0, step=0.1)
sigma1 = st.sidebar.slider('Standard deviation σ1', min_value=0.1, max_value=10.0, value=1.0, step=0.1)
alpha1 = st.sidebar.slider('Alpha1 α1', min_value=0.0, max_value=1.0, value=0.2, step=0.01)
beta1 = st.sidebar.slider('Beta1 β1', min_value=0.0, max_value=1.0, value=0.2, step=0.01)
mu2 = st.sidebar.slider('Mean μ2', min_value=-10.0, max_value=10.0, value=0.0, step=0.1)
sigma2 = st.sidebar.slider('Standard deviation σ2', min_value=0.1, max_value=10.0, value=1.0, step=0.1)
alpha2 = st.sidebar.slider('Alpha2 α2', min_value=0.0, max_value=1.0, value=0.9, step=0.01)
beta2 = st.sidebar.slider('Beta2 β2', min_value=0.0, max_value=1.0, value=0.3, step=0.01)
lambd = st.sidebar.slider('Lambda λ', min_value=-1.0, max_value=1.0, value=-0.5, step=0.01)
# Generate y1 and y2 values
y1, y2 = np.meshgrid(np.linspace(-10, 10, 100), np.linspace(-10, 10, 100))
# Calculate PDF values
pdf_values = f_BCNOLLN(y1, y2, mu1, sigma1, alpha1, beta1, mu2, sigma2, alpha2, beta2, lambd)
# Calculate CDF values
cdf_values = F_BCNOLLN(y1, y2, mu1, sigma1, alpha1, beta1, mu2, sigma2, alpha2, beta2, lambd)
# Plotting
#fig, ax = plt.subplots()
#cp = ax.contourf(y1, y2, pdf_values, cmap='viridis')
#fig.colorbar(cp)
#ax.set_title('BCNOLLN PDF Contour Plot')
#ax.set_xlabel('y1')
#ax.set_ylabel('y2')
st.subheader('Results for PDF Plot')
# Create a 3D contour plot with Plotly
fig = go.Figure(data=[go.Surface(z=pdf_values, x=y1, y=y2, colorscale='Viridis')])
fig.update_layout(title='BCNOLLN PDF 3D Contour Plot', autosize=True,
scene=dict(
xaxis_title='y1',
yaxis_title='y2',
zaxis_title='PDF'
))
# Display the plot in Streamlit
st.plotly_chart(fig)
# Create the contour plot
fig, ax = plt.subplots()
contours = ax.contour(y1, y2, pdf_values, levels=20)
ax.clabel(contours, inline=True, fontsize=8, fmt='%.3f') # Add labels to the contours
ax.set_xlabel('y1')
ax.set_ylabel('y2')
ax.set_title('BCEOLLN PDF Distribution Contour Plot')
# Display the plot in Streamlit
st.pyplot(fig)
# Create a 2D contour plot for PDF using Matplotlib
fig_2d, ax = plt.subplots()
cp = ax.contourf(y1, y2, pdf_values, cmap='viridis')
fig_2d.colorbar(cp)
ax.set_title('BCNOLLN PDF 2D Contour Plot')
ax.set_xlabel('y1')
ax.set_ylabel('y2')
# Display the PDF plot in Streamlit using Matplotlib
st.pyplot(fig_2d)
st.subheader('Results for CDF Plot')
# Create a 3D contour plot with Plotly
fig = go.Figure(data=[go.Surface(z=cdf_values, x=y1, y=y2, colorscale='Viridis')])
fig.update_layout(title='BCNOLLN CDF 3D Contour Plot', autosize=True,
scene=dict(
xaxis_title='y1',
yaxis_title='y2',
zaxis_title='CDF'
))
# Display the plot in Streamlit
st.plotly_chart(fig)
# Create the contour plot
fig, ax = plt.subplots()
contours = ax.contour(y1, y2, cdf_values, levels=20)
ax.clabel(contours, inline=True, fontsize=8, fmt='%.3f') # Add labels to the contours
ax.set_xlabel('y1')
ax.set_ylabel('y2')
ax.set_title('BCEOLLN CDF Distribution Contour Plot')
# Display the plot in Streamlit
st.pyplot(fig)
# Create a 2D contour plot for PDF using Matplotlib
fig_2d, ax = plt.subplots()
cp = ax.contourf(y1, y2, cdf_values, cmap='viridis')
fig_2d.colorbar(cp)
ax.set_title('BCNOLLN CDF 2D Contour Plot')
ax.set_xlabel('y1')
ax.set_ylabel('y2')
# Display the PDF plot in Streamlit using Matplotlib
st.pyplot(fig_2d)
# Create a Plotly figure for the 2D contour plot
#fig_2d_plotly = go.Figure(data=
# go.Contour(
# z=cdf_values,
# x=y1, # Corresponds to Y1's axis values
# y=y2, # Corresponds to Y2's axis values
# colorscale='Viridis',
# contours=dict(
# coloring ='heatmap', # Use 'heatmap' for a filled contour plot
# showlabels = True, # Show labels on contours
# labelfont = dict( # Label font properties
# size = 12,
# color = 'white',
# ),
# )
# )
#)
# Update layout of the figure
#fig_2d_plotly.update_layout(
# title='BCNOLLN CDF 2D Contour Plot',
# xaxis_title='y1',
# yaxis_title='y2',
# autosize=True,
#)
# Display the plot in Streamlit
#st.plotly_chart(fig_2d_plotly)
#st.pyplot(fig)