Spaces:
Sleeping
Sleeping
| import numpy as np | |
| import pandas as pd | |
| import streamlit as st | |
| import matplotlib.pyplot as plt | |
| import warnings | |
| from matplotlib.patches import Ellipse | |
| warnings.simplefilter("ignore") | |
| import matplotlib as mpl | |
| color_seq = np.array(['grey', 'blue', 'green', 'yellow', 'orange', 'red', 'purple', 'purple']) | |
| cog = np.array([-99, 0., 1.0, 1.5, 2.0, 2.5, 3.0, 3.0001]) | |
| cmap = mpl.colors.ListedColormap(color_seq) | |
| norm = mpl.colors.BoundaryNorm(cog, cmap.N) | |
| #@st.cache | |
| def get_text_block(fname): | |
| # this is how to read a block of text: | |
| path = "" | |
| f = open(fname, "r") | |
| # and then write it to the app | |
| return f.read(); | |
| def rotate(pts, rot): | |
| c = np.cos(np.radians(rot)) | |
| s = np.sin(np.radians(rot)) | |
| rotmat = np.array([[c, -s], [s, c]]) | |
| pts = np.dot(pts, rotmat) | |
| return pts; | |
| def plot_samps(df, plot_contour=True): | |
| aniso = (300.) / (750.) | |
| fig, ax = plt.subplots(figsize=(15, 15 * aniso * 0.8)) | |
| if plot_contour: | |
| xx, yy = dgrid(1.) | |
| rbfi = Rbf(df.YPT, df.ZPT, df.AU_G_T, function='cubic') | |
| zz = rbfi(xx, yy) | |
| ax.contour(xx, yy, zz, cog, colors=color_seq, alpha=0.5) | |
| ax.imshow(zz, origin='lower', extent=(0., 750, 0., 300.), alpha=0.2, cmap=cmap, norm=norm) | |
| scat = ax.scatter(df.YPT, df.ZPT, c=df.AU_G_T, cmap=cmap, norm=norm, edgecolor="black", s=40) | |
| cbar = fig.colorbar(scat, ticks=cog) | |
| cbar.set_label('Au g/t', rotation=0) | |
| plt.xlim((0,750)) | |
| plt.ylim((0, 300)) | |
| plt.xlabel('X') | |
| plt.ylabel('Y') | |
| return fig, ax; | |
| def block_modelling(): | |
| st.title("Block Modelling Exercise") | |
| st.markdown("## **Visual Trend Analysis**") | |
| st.markdown("The figure below is an orthogonal projection of full width intercepts within a narrow vein.") | |
| st.markdown("Prior to any statistical analysis, it is useful just to look at your data." + | |
| " Take it for a spin, look to see where high grades are located and what trends you can observe." + | |
| " When selecting a colour profile, try use a scheme that highlights trends but considers some economic" + | |
| " criteria too. It is always useful to have one or two colour bins below your cut-off grade." + | |
| " The last tip is, be consistent with your legend, make sure the samples and contours/blocks use the" + | |
| " same colour scheme.") | |
| df = pd.read_csv("data//sim_pts.csv") | |
| df = df[df.use==1].copy().reset_index(drop=True) | |
| # fig, ax = plot_samps(df) | |
| # st.pyplot(fig) | |
| st.image("images//contour.jpg", use_column_width=True) | |
| #-----------------------------------------------------------------------------------------------------------------# | |
| # Variogram | |
| # ----------------------------------------------------------------------------------------------------------------# | |
| st.markdown("## **Variogram Activity**") | |
| st.markdown("The omni-directional variogram is given in the chart that follows." + | |
| " Keep in mind that no direction has been chosen and that the range shown will be shorter than" + | |
| " the longest direction and longer than the shortest direction. Your job is to estimate the range" + | |
| " in the longest direction given your observations from the plot above.") | |
| st.image("images//interp_var.jpg") | |
| var_options = ["Select and Answer", | |
| "Major = 75m, Semi-Major = 75m", | |
| "Major = 125m, Semi-Major = 60m", | |
| "Major = 75m, Semi-Major = 100m", | |
| "Major = 150m, Semi-Major = 75m"] | |
| st.radio("What is you estimate of the major and semi major direction ranges?", options=var_options, key='vv1') | |
| #-----------------------------------------------------------------------------------------------------------------# | |
| # Set up search ellipse | |
| # ----------------------------------------------------------------------------------------------------------------# | |
| st.markdown("## **Search Ellipse Activity**") | |
| # scol1, scol2 = st.beta_columns((1, 1)) | |
| # with scol1: | |
| st.markdown('#### Ellipse Shape') | |
| rot = st.number_input('Pick a Rotation (-360 to 360)', min_value=-360., max_value=360., value=0., step=5., key=1) | |
| rot = (360. - rot) | |
| srange_major = st.number_input('Major Axis Range', min_value=10., max_value=500., value=100., step=5., key=2) | |
| srange_minor = st.number_input('Semi-Major Axis Range', min_value=10., max_value=500., value=100., step=5., key=3) | |
| # with scol2: | |
| # st.markdown('#### Sample Selection') | |
| # min_samps = st.number_input("Minimum Samples", min_value=1, max_value=40, value=2, step=1) | |
| # max_samps = st.number_input("Maximum Samples", min_value=1, max_value=40, value=10, step=1) | |
| fig, ax = plot_samps(df, plot_contour=False) | |
| e = Ellipse(xy=[350, 150], width=srange_minor * 2, height=srange_major * 2, angle=rot, linewidth=2) | |
| ax.add_artist(e) | |
| e.set_facecolor('None') | |
| e.set_edgecolor('black') | |
| st.pyplot(fig) | |
| src_options = ["Select an Answer", | |
| "Major = 75m, Semi-Major = 75m, Rotated by 90, Min 2 Max 40", | |
| "Major = 125m, Semi-Major = 60m, Rotated -60 towards South East, Min 3 Max 12", | |
| "Major = 125m, Semi-Major = 60m, Rotated 20 towards South West, Min 2 Max 12", | |
| "Major = 150m, Semi-Major = 75m, Min 2 Max 10, No Rotation"] | |
| st.radio("Select the appropriate search parameters?", options=src_options, key='ss1') | |
| st.markdown("## **Guess the Model: Question 1**") | |
| st.markdown("The interpolations given below are Nearest Neighbour (NN), Inverse Distance (ID) and Ordinary Kriging (OK) respectively") | |
| st.markdown("The curves increasing to the right on the grade tonnage curves are the grades foe each technique at different cut-offs.") | |
| scol1, scol2 = st.beta_columns((1, 1)) | |
| with scol1: | |
| st.image("images//interp_ests_q1.jpg", use_column_width=True) | |
| with scol2: | |
| st.write("") | |
| st.write("") | |
| st.write("") | |
| st.write("") | |
| st.write("") | |
| st.write("") | |
| st.write("") | |
| st.write("") | |
| st.write("") | |
| st.write("") | |
| st.image("images//interp_gt_q1.jpg", use_column_width=True) | |
| gt_options = ["Select an Answer", | |
| "Light blue is NN, purple is OK and red is ID", | |
| "Light blue is NN, purple is ID and red is OK", | |
| "Light blue is OK, purple is NN and red is ID", | |
| "Light blue is OK, purple is ID and red is NN"] | |
| st.radio("Which lines on the gt_curve belong to which estimate?", options=gt_options, key='gg1') | |
| st.text("Any additional comments?") | |
| st.markdown("## **Guess the Model: Question 2**") | |
| st.markdown("Use your knowledge gained to decipher the mystery of the images below.") | |
| st.markdown("What we know:") | |
| st.markdown("* ID squared was used for one estimate and OK for another") | |
| st.markdown("* Identical search parameters were used") | |
| st.markdown("* The variogram has nugget of around 0.3 and most of the variability is accounted for within about 20-30m.") | |
| st.image("images//interp_OK_q2.jpg") | |
| st.image("images//interp_ID_q2.jpg") | |
| est_options = ["Select an Answer", | |
| "Estimate A is more variable than estimate B. Estimate A is OK and Estimate B is ID", | |
| "Estimate B is more variable than estimate B. Estimate A is OK and Estimate B is ID", | |
| "Both estimates have equal variances as they use the same sample data. Estimate A is OK and Estimate B is ID", | |
| "Estimate B is more variable than estimate A. Estimate A is ID and Estimate B is OK",] | |
| st.radio("Select the correct statement", options=est_options, key='est1') | |