import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import Thermobar as pt
df_ideal_oxide = pd.DataFrame(columns=['Sample_ID_Liq', 'SiO2', 'TiO2', 'Al2O3',
'FeOt', 'MnO', 'MgO', 'CaO', 'Na2O', 'K2O',
'Cr2O3', 'P2O5'])
oxide_mass = {'SiO2': 60.0843, 'MgO': 40.3044,
'MnO': 70.9375, 'FeOt': 71.8464, 'CaO': 56.0774,
'Al2O3': 101.961,'Na2O': 61.9789, 'K2O': 94.196,
'TiO2': 79.8788, 'P2O5': 141.937, 'Cr2O3': 151.9982}
# Now we turn this dictionary of oxide mass into a pandas dataframe so matrix functions can be used.
oxide_mass_df = pd.DataFrame.from_dict(
oxide_mass, orient='index').T
oxide_mass_df['Sample_ID_Liq'] = 'MolWt'
oxide_mass_df.set_index('Sample_ID_Liq', inplace=True)
oxide_mass_df_altered=oxide_mass_df.set_index('Sample_ID_Liq')
oxide_mass_df2 = pd.DataFrame.from_dict(
oxide_mass, orient='index').T
oxide_mass_df2
SiO2 | MgO | MnO | FeOt | CaO | Al2O3 | Na2O | K2O | TiO2 | P2O5 | Cr2O3 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 60.0843 | 40.3044 | 70.9375 | 71.8464 | 56.0774 | 101.961 | 61.9789 | 94.196 | 79.8788 | 141.937 | 151.9982 |
oxide_mass_df2['Sample_ID_Liq'] = 'MolWt'
oxide_mass_df2
SiO2 | MgO | MnO | FeOt | CaO | Al2O3 | Na2O | K2O | TiO2 | P2O5 | Cr2O3 | Sample_ID_Liq | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 60.0843 | 40.3044 | 70.9375 | 71.8464 | 56.0774 | 101.961 | 61.9789 | 94.196 | 79.8788 | 141.937 | 151.9982 | MolWt |
input1=pd.read_excel('Christy_input.xlsx', sheet_name="Sheet1")
import Thermobar as pt
input2=pt.import_excel('Christy_input.xlsx', sheet_name="Sheet1", suffix="_Liq").get("Liqs")
c:\users\penny\onedrive - oregon state university\postdoc\pymme\mybarometers\thermobar_outer\src\Thermobar\import_export.py:333: UserWarning: We notice you have specified a suffix, but some of your columns already have this suffix. e.g., If you already have _Liq in the file, you shouldnt specify suffix="_Liq" during the import w.warn('We notice you have specified a suffix, but some of your columns already have this suffix. '
def calculate_anhydrous_mol_proportions(df):
'''Import Liq compositions using liq_comps=My_Liquids, returns anhydrous mole proportions
Parameters
-------
inputs: df. pandas.DataFrame
Panda DataFrame of input compositions with column headings SiO2, TiO2
Returns
-------
pandas DataFrame
anhydrous mole proportions with column headings of the form SiO2_Liq_mol_prop, stithced to original dataframe
'''
# This makes the input match the columns in the oxide mass dataframe
liq_wt = df.reindex(
df_ideal_oxide.columns, axis=1).fillna(0)
# Combine the molecular weight and weight percent dataframes
liq_wt_combo = pd.concat([oxide_mass_df, liq_wt],)
# Divide throguh by the MolDrop the calculation column
mol_prop_anhyd = liq_wt_combo.div(
liq_wt_combo.loc['MolWt', :], axis='columns').drop(['MolWt'])
mol_prop_anhyd.columns = [
str(col) + '_mol_prop' for col in mol_prop_anhyd.columns]
return mol_prop_anhyd
df=input1
liq_wt = df.reindex(
df_ideal_oxide.columns, axis=1).fillna(0)
# Combine the molecular weight and weight percent dataframes
liq_wt_combo = pd.concat([oxide_mass_df, liq_wt],)
# Divide throguh by the MolDrop the calculation column
mol_prop_anhyd = liq_wt_combo.div(
liq_wt_combo.loc['MolWt', :], axis='columns').drop(['MolWt'])
mol_prop_anhyd.columns = [
str(col) + '_mol_prop' for col in mol_prop_anhyd.columns]
liq_wt_combo
SiO2 | MgO | MnO | FeOt | CaO | Al2O3 | Na2O | K2O | TiO2 | P2O5 | Cr2O3 | Sample_ID_Liq | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
MolWt | 60.084300 | 40.30440 | 70.937500 | 71.84640 | 56.07740 | 101.961000 | 61.97890 | 94.196000 | 79.878800 | 141.937000 | 151.9982 | NaN |
0 | 57.023602 | 4.19180 | 0.103851 | 4.36174 | 6.94858 | 16.332899 | 3.59702 | 0.896895 | 0.623106 | 0.226584 | 0.0000 | liq1 |
1 | 57.658600 | 2.86892 | 0.084105 | 3.90621 | 5.91538 | 17.194799 | 3.85948 | 1.018600 | 0.654150 | 0.214935 | 0.0000 | liq2 |
Calc_Prop=calculate_anhydrous_mol_proportions(df=input1)
Calc_Prop
SiO2_mol_prop | MgO_mol_prop | MnO_mol_prop | FeOt_mol_prop | CaO_mol_prop | Al2O3_mol_prop | Na2O_mol_prop | K2O_mol_prop | TiO2_mol_prop | P2O5_mol_prop | Cr2O3_mol_prop | Sample_ID_Liq_mol_prop | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.94906 | 0.104004 | 0.001464 | 0.060709 | 0.123911 | 0.160188 | 0.058036 | 0.009522 | 0.007801 | 0.001596 | 0.0 | NaN |
1 | 0.959628 | 0.071181 | 0.001186 | 0.054369 | 0.105486 | 0.168641 | 0.062271 | 0.010814 | 0.008189 | 0.001514 | 0.0 | NaN |
def demonstrate_classification_scheme(df, projection=None):
if projection == "Cpx":
return "Im using the Cpx normalizatoin scheme"
if projection == "Plag-Amp":
return "Im using the Plag-Amp normalizatoin scheme"
demonstrate_classification_scheme(df=input1, projection="Cpx")
'Im using the Cpx normalizatoin scheme'
demonstrate_classification_scheme(df=input1, projection="Plag-Amp")
'Im using the Plag-Amp normalizatoin scheme'
def calculate_liq_components_as_minerals(df, projection=None):
# First, take the input dataframe of liquids, and calculate mole prop.
#Using the function you defined above
mol_prop_alone=calculate_anhydrous_mol_proportions(df=df)
# Lets ocmbine mol_prop and the input to get 1 big dataframe
mol_prop=pd.concat([df, mol_prop_alone], axis=1)
# Now add whatever calculation you want to it, e.g., say I want to sum MgO and SiO2 mol proportions
mol_prop['Sum_Mg_Si']=mol_prop['MgO_mol_prop'] + mol_prop['SiO2_mol_prop']
# Now return this function with new columns added on. Initiall, the coluns go at the end,
#but I can send you some code later to shuffle column order once its all together
# Add your iff statements, append the projection-specific things on.
# E.g., say projection = Cpx, I want to return a oclumn reading Cpx something
if projection == "Cpx":
mol_prop['Cpx_calc1']=5
if projection == "Plag":
mol_prop['Plag_Calc']=10
if projection == "Amp":
mol_prop['Amp_Calc']=20
# You can either return a specific result beneath the if, or append to a column name and return the whole thing here
return mol_prop
calculate_liq_components_as_minerals(df=input1, projection="Cpx")
Sample_ID_Liq | SiO2 | TiO2 | Al2O3 | FeOt | MnO | MgO | CaO | Na2O | K2O | ... | CaO_mol_prop | Al2O3_mol_prop | Na2O_mol_prop | K2O_mol_prop | TiO2_mol_prop | P2O5_mol_prop | Cr2O3_mol_prop | Sample_ID_Liq_mol_prop | Sum_Mg_Si | Cpx_calc1 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | liq1 | 57.023602 | 0.623106 | 16.332899 | 4.36174 | 0.103851 | 4.19180 | 6.94858 | 3.59702 | 0.896895 | ... | 0.123911 | 0.160188 | 0.058036 | 0.009522 | 0.007801 | 0.001596 | 0.0 | NaN | 1.053063 | 5 |
1 | liq2 | 57.658600 | 0.654150 | 17.194799 | 3.90621 | 0.084105 | 2.86892 | 5.91538 | 3.85948 | 1.018600 | ... | 0.105486 | 0.168641 | 0.062271 | 0.010814 | 0.008189 | 0.001514 | 0.0 | NaN | 1.03081 | 5 |
2 rows × 26 columns