Cutoffgrade / exercises /cut_off.py
SLRConsulting's picture
Update exercises/cut_off.py
fdd2896 verified
raw
history blame contribute delete
No virus
7.13 kB
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.50, 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.radio("1. What copper price results in a revenue which is double the break-even cut-off grade", ['$3.25', '$2.00', '$9.00', '$7.50'], 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.radio("2. What copper grade results in a revenue which is double the break-even cut-off grade", ['0.2%', '0.9%', '2.4%', '4.0%'], key='tt2')
st.write("")
adjust_calculation(df.copy())