import streamlit as st import funcs import pandas as pd import numpy as np import plotly.express as px def adjust_calculation(df2): colx1, colx2, colx3, colx4 = st.beta_columns((1,1,1,1)) with colx1: st.markdown("Block Grade") df2.loc[0, 'Resource COG'] = 1000000 df2.loc[1, 'Resource COG'] = st.slider("Cu %", 0., 2.0, 0.9, 0.1, key="cgsl2") df2.loc[2, 'Resource COG'] = st.slider("Au g/t", 0., 2.0, 0.7, 0.1, key="cgsl3") cug = df2.loc[1, 'Resource COG'] aug = df2.loc[2, 'Resource COG'] with colx2: st.markdown("Recoveries") df2.loc[4, 'Resource COG'] = st.slider("Cu Recovery", 60., 95., 87., 1.0, key="cgsl4") df2.loc[5, 'Resource COG'] = st.slider("Au Recover", 60., 95., 90., 1.0, key="cgsl5") with colx3: st.markdown("Metal Prices") df2.loc[16, 'Resource COG'] = st.slider("Cu Price ($/lbs)", 2.5, 10.0, 3.25, 0.1, key="cgsl6") df2.loc[17, 'Resource COG'] = float(st.slider("Au Price ($/oz)", 1000.0, 2000.0, 1500.0, 100.0, key="cgsl7")) with colx4: st.markdown("Other") df2.loc[10, 'Resource COG'] = st.slider("Cu Con Grade", 20.0, 35.0, 25.0, 1.0, key="cgsl8") df2.loc[13, 'Comments'] = st.slider("Payabe Cu", 85., 100., 90., 1.0, key="cgsl9") df2.loc[14, 'Comments'] = st.slider("Payable Au", 85., 100., 99., 1.0, key="cgsl10") df2.loc[7, 'Resource COG'] = np.round(df2.loc[0, 'Resource COG']*(df2.loc[1, 'Resource COG']/100.)*(df2.loc[4, 'Resource COG']/100.)*2.20462,0) df2.loc[8, 'Resource COG'] = np.round(df2.loc[0, 'Resource COG']*(df2.loc[2, 'Resource COG'])/31.1035*(df2.loc[5, 'Resource COG']/100.), 0) df2.loc[9, 'Resource COG'] = np.round(df2.loc[7, 'Resource COG']*1000./2204.62/(df2.loc[10, 'Resource COG']/100.), 0) df2.loc[11, 'Resource COG'] = np.round(df2.loc[8, 'Resource COG']*31.1035/df2.loc[9, 'Resource COG'],2) df2.loc[13, 'Resource COG'] = np.round(df2.loc[7, 'Resource COG']*(df2.loc[13, 'Comments'])/100.,0) df2.loc[14, 'Resource COG'] = np.round(df2.loc[8, 'Resource COG']*(df2.loc[14, 'Comments'])/100,0) df2.loc[18, 'Resource COG'] = np.round(df2.loc[13, 'Resource COG']*df2.loc[16, 'Resource COG'], 0) df2.loc[19, 'Resource COG'] = np.round(df2.loc[14, 'Resource COG']*float(df2.loc[17, 'Resource COG']/1000.), 0) df2.loc[20, 'Resource COG'] = df2.loc[18, 'Resource COG']+df2.loc[19, 'Resource COG'] df2.loc[22, 'Resource COG'] = np.round(df2.loc[9, 'Resource COG']*9.0/1000, 0) df2.loc[23, 'Resource COG'] = np.round(df2.loc[13, 'Resource COG']*0.09,0) df2.loc[24, 'Resource COG'] = np.round(df2.loc[14, 'Resource COG']*5.0/1000, 0) df2.loc[25, 'Resource COG'] = np.round(df2.loc[20, 'Resource COG']-df2.loc[22, 'Resource COG']-df2.loc[23, 'Resource COG']-df2.loc[24, 'Resource COG'], 0) df2.loc[27, 'Resource COG'] = np.round((df2.loc[18, 'Resource COG']-df2.loc[22, 'Resource COG']-0.09*df2.loc[13, 'Resource COG']/1000.)/df2.loc[25, 'Resource COG'], 2) df2.loc[28, 'Resource COG'] = np.round((df2.loc[19, 'Resource COG']-df2.loc[23, 'Resource COG']-5.0*df2.loc[14, 'Resource COG']/1000.)/df2.loc[25, 'Resource COG'], 2) df2.loc[30, 'Resource COG'] = np.round((df2.loc[27, 'Resource COG']*df2.loc[25, 'Resource COG']*1000./(df2.loc[0, 'Resource COG']*df2.loc[1, 'Resource COG'])),0) df2.loc[31, 'Resource COG'] = np.round((df2.loc[28, 'Resource COG']*df2.loc[25, 'Resource COG']*1000./(df2.loc[0, 'Resource COG']*df2.loc[2, 'Resource COG'])),0) colz1, colz2, colz3 = st.beta_columns((1,1,1)) metal = ['Cu', 'Au'] grades = np.array([cug, aug]) nsr_fact = np.array([df2.loc[30, 'Resource COG'], df2.loc[31, 'Resource COG']]) blk_rev = grades*nsr_fact ddf = pd.DataFrame({'Metal':metal, 'Grade': grades, 'Revenue by Metal Unit': nsr_fact, 'Block Revenue per tonne':blk_rev}) with colz1: st.write("") st.write("") st.write("") st.write("") st.write("") st.write("") st.write("") st.write("") st.table(ddf) with colz2: fig = px.bar(ddf, x='Metal', y='Revenue by Metal Unit', color='Metal') fig.update_yaxes(range=(0,200)) st.plotly_chart(fig, use_container_width=True) with colz3: fig = px.bar(ddf, x='Metal', y='Block Revenue per tonne', color='Metal') fig.update_yaxes(range=(0,200)) st.plotly_chart(fig, use_container_width=True) # st.table(df2) def cut_off(): df = pd.read_csv("data//Worksheet COGs.csv") df = df.fillna("") df = df[:32].copy() st.title("Cut-off Grade Exercise") st.write("") st.markdown("## Question 1: Do we send this block to the processing plant?") st.write("") col1, col2 = st.beta_columns([1, 2]) with col1: st.image("images//cog1_block.jpg", width=300) with col2: st.write("") st.write("") st.write("") st.write("") st.write("") st.write("") st.markdown('### Operating costs:') st.markdown('* Mining: $50/t') st.markdown('* Process: $20/t') st.markdown('* G&A: $15/t') q1_options = ['yes', 'no'] cog_q1_answer = st.radio("Do we send this block to the processing plant?", options=q1_options, key='cog_q1') st.write("") st.markdown("## Question 2: Complex Cut-off Calculation") st.write("") st.markdown("### Considering the block grades from Question 1, analyze the NSR calculation and answer the question below.") st.write("") col3, col4 = st.beta_columns([1, 2]) with col3: text = funcs.get_text_block("cog_q2_intro.txt") st.markdown(text) with col4: st.image("images//nsr_table.png", width=500) st.write("*Note that the average grade of the deposit is not known until the cut-off is known. This is normally an early approximation and an iterative process. While it does not impact the calculations, once the average grade is known, a simple cash flow analysis can be performed.") q2_options = ['A. I have no idea', 'B. The block value is below all cut-off grades', 'C. The block value is greater than the marginal but less than the break-even cut-off', 'D. The block value exceeds all cut-off grades'] cog_q2_answer = st.radio("Select the appropriate statement:", options=q2_options, key='cog_q2') st.write("") st.markdown("## Question 3: Sensitivities") st.write("") st.markdown("### By Adjusting the various input parameters given below, comment on the following:") st.text_area("1. What copper price results in a revenue which is double the break-even cut-off grade", height=5, key='tt1') st.text_area("2. What copper grade results in a revenue which is double the break-even cut-off grade", height=5, key='tt2') st.write("") adjust_calculation(df.copy())