Note
Click here to download the full example code
Basic usage XR
A simple example demonstrating how to use mass-composition.
import xarray as xr
import pandas as pd
from elphick.mass_composition import MassComposition
from elphick.mass_composition.datasets.sample_data import sample_data
# noinspection PyUnresolvedReferences
import elphick.mass_composition.mc_xarray # keep this "unused" import - it helps
Create a mass-composition (mc) enabled Xarray Dataset
We get some demo data in the form of a pandas DataFrame
df_data: pd.DataFrame = sample_data()
print(df_data.head())
wet_mass mass_dry FE SIO2 al2o3 LOI group
index
0 100.0 90.0 57.0 5.2 3.0 5.0 grp_1
1 90.0 80.0 59.0 3.1 1.7 4.0 grp_1
2 110.0 90.0 61.0 2.2 0.9 3.0 grp_2
Construct a MassComposition object first to create a compliant xarray object with the concrete property
xr_ds: xr.Dataset = MassComposition(data=df_data, name='test').to_xarray()
print(xr_ds.mc.data())
<xarray.Dataset> Size: 216B
Dimensions: (index: 3)
Coordinates:
* index (index) int64 24B 0 1 2
Data variables:
mass_wet (index) float64 24B 100.0 90.0 110.0
mass_dry (index) float64 24B 90.0 80.0 90.0
H2O (index) float64 24B 10.0 11.11 18.18
Fe (index) float64 24B 57.0 59.0 61.0
SiO2 (index) float64 24B 5.2 3.1 2.2
Al2O3 (index) float64 24B 3.0 1.7 0.9
LOI (index) float64 24B 5.0 4.0 3.0
group (index) object 24B 'grp_1' 'grp_1' 'grp_2'
Attributes:
mc_name: test
mc_vars_mass: ['mass_wet', 'mass_dry']
mc_vars_chem: ['Fe', 'SiO2', 'Al2O3', 'LOI']
mc_vars_attrs: ['group']
mc_interval_edges: {}
Validate the round trip by converting composition to mass and back to composition
xr_ds_mass = xr_ds.mc.composition_to_mass()
print(xr_ds_mass.mc.data())
xr_ds_chem = xr_ds_mass.mc.mass_to_composition()
print(xr_ds_chem.mc.data())
pd.testing.assert_frame_equal(xr_ds.to_dataframe(), xr_ds_chem.to_dataframe())
<xarray.Dataset> Size: 216B
Dimensions: (index: 3)
Coordinates:
* index (index) int64 24B 0 1 2
Data variables:
mass_wet (index) float64 24B 100.0 90.0 110.0
mass_dry (index) float64 24B 90.0 80.0 90.0
H2O (index) float64 24B 10.0 11.11 18.18
Fe (index) float64 24B 51.3 47.2 54.9
SiO2 (index) float64 24B 4.68 2.48 1.98
Al2O3 (index) float64 24B 2.7 1.36 0.81
LOI (index) float64 24B 4.5 3.2 2.7
group (index) object 24B 'grp_1' 'grp_1' 'grp_2'
Attributes:
mc_name: test
mc_vars_mass: ['mass_wet', 'mass_dry']
mc_vars_chem: ['Fe', 'SiO2', 'Al2O3', 'LOI']
mc_vars_attrs: ['group']
mc_interval_edges: {}
<xarray.Dataset> Size: 216B
Dimensions: (index: 3)
Coordinates:
* index (index) int64 24B 0 1 2
Data variables:
mass_wet (index) float64 24B 100.0 90.0 110.0
mass_dry (index) float64 24B 90.0 80.0 90.0
H2O (index) float64 24B 10.0 11.11 18.18
Fe (index) float64 24B 57.0 59.0 61.0
SiO2 (index) float64 24B 5.2 3.1 2.2
Al2O3 (index) float64 24B 3.0 1.7 0.9
LOI (index) float64 24B 5.0 4.0 3.0
group (index) object 24B 'grp_1' 'grp_1' 'grp_2'
Attributes:
mc_name: test
mc_vars_mass: ['mass_wet', 'mass_dry']
mc_vars_chem: ['Fe', 'SiO2', 'Al2O3', 'LOI']
mc_vars_attrs: ['group']
mc_interval_edges: {}
Demonstrate splitting an object
xr_1, xr_2 = xr_ds.mc.split(fraction=0.25)
print(xr_1.mc.data())
print(xr_2.mc.data())
<xarray.Dataset> Size: 216B
Dimensions: (index: 3)
Coordinates:
* index (index) int64 24B 0 1 2
Data variables:
mass_wet (index) float64 24B 25.0 22.5 27.5
mass_dry (index) float64 24B 22.5 20.0 22.5
H2O (index) float64 24B 10.0 11.11 18.18
Fe (index) float64 24B 57.0 59.0 61.0
SiO2 (index) float64 24B 5.2 3.1 2.2
Al2O3 (index) float64 24B 3.0 1.7 0.9
LOI (index) float64 24B 5.0 4.0 3.0
group (index) object 24B 'grp_1' 'grp_1' 'grp_2'
Attributes:
mc_name: (0.25 * test)
mc_vars_mass: ['mass_wet', 'mass_dry']
mc_vars_chem: ['Fe', 'SiO2', 'Al2O3', 'LOI']
mc_vars_attrs: ['group']
mc_interval_edges: {}
<xarray.Dataset> Size: 216B
Dimensions: (index: 3)
Coordinates:
* index (index) int64 24B 0 1 2
Data variables:
mass_wet (index) float64 24B 75.0 67.5 82.5
mass_dry (index) float64 24B 67.5 60.0 67.5
H2O (index) float64 24B 10.0 11.11 18.18
Fe (index) float64 24B 57.0 59.0 61.0
SiO2 (index) float64 24B 5.2 3.1 2.2
Al2O3 (index) float64 24B 3.0 1.7 0.9
LOI (index) float64 24B 5.0 4.0 3.0
group (index) object 24B 'grp_1' 'grp_1' 'grp_2'
Attributes:
mc_name: (0.75 * test)
mc_vars_mass: ['mass_wet', 'mass_dry']
mc_vars_chem: ['Fe', 'SiO2', 'Al2O3', 'LOI']
mc_vars_attrs: ['group']
mc_interval_edges: {}
Demonstrate the mc aggregate function
i.e. weight average of the dataset, a.k.a. head grade
xr_ds_wtd: xr.Dataset = xr_ds.mc.aggregate()
print(xr_ds_wtd.mc.data())
# xr_ds_wtd.mc.to_dataframe(original_column_names=True)
<xarray.Dataset> Size: 56B
Dimensions: (index: 1)
Dimensions without coordinates: index
Data variables:
mass_wet (index) float64 8B 300.0
mass_dry (index) float64 8B 260.0
H2O (index) float64 8B 13.33
Fe (index) float64 8B 59.0
SiO2 (index) float64 8B 3.515
Al2O3 (index) float64 8B 1.873
LOI (index) float64 8B 4.0
Attributes:
mc_name: Aggregate of test
mc_vars_mass: ['mass_wet', 'mass_dry']
mc_vars_chem: ['Fe', 'SiO2', 'Al2O3', 'LOI']
mc_vars_attrs: []
mc_interval_edges: {}
Convert to a pandas DataFrame
print(xr_ds.mc.aggregate(as_dataframe=True, original_column_names=False))
print(xr_ds.mc.aggregate(as_dataframe=True, original_column_names=True))
mass_wet mass_dry H2O Fe SiO2 Al2O3 LOI
name
test 300.0 260.0 13.333333 59.0 3.515385 1.873077 4.0
wet_mass mass_dry H2O FE SIO2 al2o3 LOI
name
test 300.0 260.0 13.333333 59.0 3.515385 1.873077 4.0
Aggregate by a group variable
print(xr_ds.mc.aggregate(group_var='group', as_dataframe=True))
mass_wet mass_dry H2O Fe SiO2 Al2O3 LOI
group
grp_1 190.0 170.0 10.526316 57.941176 4.211765 2.388235 4.529412
grp_2 110.0 90.0 18.181818 61.000000 2.200000 0.900000 3.000000
Math operations - we’ll go full circle again, so we can check.
xr_ds_added: xr.Dataset = xr_1.mc.add(xr_2)
print(xr_ds_added.mc.data())
pd.testing.assert_frame_equal(xr_ds.to_dataframe(), xr_ds_added.to_dataframe())
xr_ds_add_sub: xr.Dataset = xr_ds.mc.add(xr_1).mc.sub(xr_1)
print(xr_ds_added.mc.data())
pd.testing.assert_frame_equal(xr_ds.to_dataframe(), xr_ds_add_sub.to_dataframe())
print('done')
<xarray.Dataset> Size: 216B
Dimensions: (index: 3)
Coordinates:
* index (index) int64 24B 0 1 2
Data variables:
mass_wet (index) float64 24B 100.0 90.0 110.0
mass_dry (index) float64 24B 90.0 80.0 90.0
H2O (index) float64 24B 10.0 11.11 18.18
Fe (index) float64 24B 57.0 59.0 61.0
SiO2 (index) float64 24B 5.2 3.1 2.2
Al2O3 (index) float64 24B 3.0 1.7 0.9
LOI (index) float64 24B 5.0 4.0 3.0
group (index) object 24B 'grp_1' 'grp_1' 'grp_2'
Attributes:
mc_name: ((0.25 * test) + (0.75 * test))
mc_vars_mass: ['mass_wet', 'mass_dry']
mc_vars_chem: ['Fe', 'SiO2', 'Al2O3', 'LOI']
mc_vars_attrs: ['group']
mc_interval_edges: {}
<xarray.Dataset> Size: 216B
Dimensions: (index: 3)
Coordinates:
* index (index) int64 24B 0 1 2
Data variables:
mass_wet (index) float64 24B 100.0 90.0 110.0
mass_dry (index) float64 24B 90.0 80.0 90.0
H2O (index) float64 24B 10.0 11.11 18.18
Fe (index) float64 24B 57.0 59.0 61.0
SiO2 (index) float64 24B 5.2 3.1 2.2
Al2O3 (index) float64 24B 3.0 1.7 0.9
LOI (index) float64 24B 5.0 4.0 3.0
group (index) object 24B 'grp_1' 'grp_1' 'grp_2'
Attributes:
mc_name: ((0.25 * test) + (0.75 * test))
mc_vars_mass: ['mass_wet', 'mass_dry']
mc_vars_chem: ['Fe', 'SiO2', 'Al2O3', 'LOI']
mc_vars_attrs: ['group']
mc_interval_edges: {}
done
Total running time of the script: ( 0 minutes 0.186 seconds)