Last active
November 14, 2023 18:36
-
-
Save rnelsonchem/cc8991f0a44047bda100aedecdbaa2b5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "c47a29c8-6504-4106-9346-b09c688b199d", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [], | |
"source": [ | |
"import pandas as pd" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "deb3a5b0-408e-4473-8668-1cdd72a1ff0e", | |
"metadata": {}, | |
"source": [ | |
"# Single reaction\n", | |
"\n", | |
"Here's a single reaction that mirrors the slides I shared; however, a solvent has been added to demonstrate how a Volumes -> kilogram conversion would be done in code. This is the minimum amount of information that a chemist would need to calculate the cost for an arbitrary reaction.\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "65a2f708-a6c6-44f3-8959-76f9cf11b1da", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.0</td>\n", | |
" <td>1.2</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.8</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes\n", | |
"0 1 A 122 NaN 200.0 1.0 NaN\n", | |
"1 1 B 212 NaN 175.0 1.2 NaN\n", | |
"2 1 Solvent 100 0.8 5.0 NaN 5.0\n", | |
"3 1 C 180 NaN NaN 0.8 NaN" | |
] | |
}, | |
"execution_count": 2, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"one_rxn = pd.read_excel('demo_rxns.xlsx', sheet_name='one rxn')\n", | |
"one_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "425ed612-5c4f-4349-bcb0-61b99a1f8ccc", | |
"metadata": {}, | |
"source": [ | |
"For compounds given in equivalents, the kilograms is just `\"Equivlents\"*\"MW\"`. The kilograms of solvents will be empty here." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "bebcf928-ffa7-4e2f-afe0-291f3c196492", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>122.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.0</td>\n", | |
" <td>1.2</td>\n", | |
" <td>NaN</td>\n", | |
" <td>254.4</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.8</td>\n", | |
" <td>NaN</td>\n", | |
" <td>144.0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn\n", | |
"0 1 A 122 NaN 200.0 1.0 NaN 122.0\n", | |
"1 1 B 212 NaN 175.0 1.2 NaN 254.4\n", | |
"2 1 Solvent 100 0.8 5.0 NaN 5.0 NaN\n", | |
"3 1 C 180 NaN NaN 0.8 NaN 144.0" | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"one_rxn['kgs/rxn'] = one_rxn['Equivalents']*one_rxn['MW']\n", | |
"one_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "58924d4e-3c16-43f4-a5e2-9a4b7b0a8c46", | |
"metadata": {}, | |
"source": [ | |
"Volumes of solvent are defined as \"Liters of solvent\"/\"kg of reference material\". In this case, the reference material is typically the limiting reagent. \"Compound A\" in the example here. First, extract the reference kilogram value (`ref_kg`). Next, mask out only the solvent values, which are defined by \"Volumes\". The kilograms of solvent will then be `\"Volumes\"*\"Density\"*\"Reference kgs\"`." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "daa9f1b0-3209-43ee-bf9a-8ebecb2057e9", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>122.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.0</td>\n", | |
" <td>1.2</td>\n", | |
" <td>NaN</td>\n", | |
" <td>254.4</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>488.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.8</td>\n", | |
" <td>NaN</td>\n", | |
" <td>144.0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn\n", | |
"0 1 A 122 NaN 200.0 1.0 NaN 122.0\n", | |
"1 1 B 212 NaN 175.0 1.2 NaN 254.4\n", | |
"2 1 Solvent 100 0.8 5.0 NaN 5.0 488.0\n", | |
"3 1 C 180 NaN NaN 0.8 NaN 144.0" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ref_kg = one_rxn['kgs/rxn'].iloc[0]\n", | |
"volume_mask = one_rxn['Volumes'].notna()\n", | |
"vols = one_rxn.loc[volume_mask]\n", | |
"vols.loc[:, 'kgs/rxn'] = vols['Volumes']*vols['Density']*ref_kg\n", | |
"one_rxn.loc[volume_mask, :] = vols\n", | |
"one_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "44bf8ada-d6a1-424c-a515-4b843b2b10e7", | |
"metadata": {}, | |
"source": [ | |
"It is typical to normalize the kilograms in a reaction to the product, which in this case is the last compound in the list." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"id": "2efb5295-9c1b-4101-b692-890275ecf59b", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.0</td>\n", | |
" <td>1.2</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.8</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn\n", | |
"0 1 A 122 NaN 200.0 1.0 NaN 0.847222\n", | |
"1 1 B 212 NaN 175.0 1.2 NaN 1.766667\n", | |
"2 1 Solvent 100 0.8 5.0 NaN 5.0 3.388889\n", | |
"3 1 C 180 NaN NaN 0.8 NaN 1.000000" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"prod_kg = one_rxn['kgs/rxn'].iloc[-1]\n", | |
"one_rxn['kgs/rxn'] = one_rxn['kgs/rxn']/prod_kg\n", | |
"one_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "0f6d9366-e22e-486d-9eaf-9bc4de5ff277", | |
"metadata": {}, | |
"source": [ | |
"The cost of each component per reaction is then `\"kgs/rxn\"*\"$/kg\"`. The `$/kg` for the product is going to be the sum of the `\"$/kg` of the reagents/solvents. Because this has been normalized to 1 kg of product, the yield has been taken into account. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"id": "1c4989e0-c77a-43f4-86cb-c016dae807f3", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.0</td>\n", | |
" <td>1.2</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.8</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.0 1.0 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.0 1.2 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.0 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN NaN 0.8 NaN 1.000000 \n", | |
"\n", | |
" $/rxn \n", | |
"0 169.444444 \n", | |
"1 309.166667 \n", | |
"2 16.944444 \n", | |
"3 NaN " | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"one_rxn['$/rxn'] = one_rxn['kgs/rxn']*one_rxn['$/kg']\n", | |
"one_rxn" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"id": "dad97b6e-8cc3-4246-bf32-9eced8c670a1", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.2</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.8</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.0 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.2 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.8 NaN 1.000000 \n", | |
"\n", | |
" $/rxn \n", | |
"0 169.444444 \n", | |
"1 309.166667 \n", | |
"2 16.944444 \n", | |
"3 NaN " | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"prod_index = one_rxn.index[-1]\n", | |
"prod_cost = one_rxn['$/rxn'].sum()\n", | |
"one_rxn.loc[prod_index, '$/kg'] = prod_cost\n", | |
"one_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "ecdea152-5324-4d16-9206-e3b1b952ff5b", | |
"metadata": {}, | |
"source": [ | |
"Converting the code above into a function." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"id": "9c342224-d96a-4fde-8575-e114ff0a1058", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import pandas as pd\n", | |
"\n", | |
"def single_rxn_costs(rxn):\n", | |
" # Equivalents -> kg\n", | |
" rxn['kgs/rxn'] = rxn['Equivalents']*rxn['MW']\n", | |
" \n", | |
" volume_mask = rxn['Volumes'].notna()\n", | |
" # Only do the volume calc if there are volumes defined\n", | |
" if volume_mask.any():\n", | |
" ref_kg = rxn['kgs/rxn'].iloc[0]\n", | |
" vols = rxn.loc[volume_mask]\n", | |
" vols.loc[:, 'kgs/rxn'] = vols['Volumes']*vols['Density']*ref_kg\n", | |
" rxn.loc[volume_mask, :] = vols\n", | |
" \n", | |
" # Normalization\n", | |
" rxn['kgs/rxn'] /= rxn['kgs/rxn'].iloc[-1] \n", | |
" \n", | |
" # Calc costs for reagents/solvents\n", | |
" rxn['$/rxn'] = rxn['kgs/rxn']*rxn['$/kg']\n", | |
" \n", | |
" # Calc cost for product\n", | |
" prod_index = rxn.index[-1]\n", | |
"\n", | |
" prod_cost = rxn['$/rxn'].sum()\n", | |
" rxn.loc[prod_index, '$/kg'] = prod_cost" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"id": "5ff638f0-e14a-4c64-b8e3-1fcb8b436d1a", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.2</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.8</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.0 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.2 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.8 NaN 1.000000 \n", | |
"\n", | |
" $/rxn \n", | |
"0 169.444444 \n", | |
"1 309.166667 \n", | |
"2 16.944444 \n", | |
"3 NaN " | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"one_rxn = pd.read_excel('demo_rxns.xlsx', sheet_name='one rxn')\n", | |
"\n", | |
"single_rxn_costs(one_rxn)\n", | |
"one_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "77bff07f-52b9-4b81-8b52-edb064098849", | |
"metadata": {}, | |
"source": [ | |
"# Multiple rxns\n", | |
"\n", | |
"For multiple reactions, the individual reaction costing will be identical; however, there will need to be a new set of data calculated for the overall product of the multistep route (`\"kgs/prod\"`). This ultimately requires calcualting the costs for each reaction individually. It seems that the most obvious way to do this calculation would be to move from the first reaction to the last reaction. However, as you'll see, the calculations need to start from the final reaction first, working backward (recursive). " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"id": "8372576c-e10f-463d-ac7c-393aacb7c716", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.0</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.0</td>\n", | |
" <td>1.20</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.0</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn $/rxn \\\n", | |
"0 1 A 122 NaN 200.0 1.00 NaN NaN NaN \n", | |
"1 1 B 212 NaN 175.0 1.20 NaN NaN NaN \n", | |
"2 1 Solvent 100 0.8 5.0 NaN 5.0 NaN NaN \n", | |
"3 1 C 180 NaN NaN 0.80 NaN NaN NaN \n", | |
"4 2 C 180 NaN NaN 1.00 NaN NaN NaN \n", | |
"5 2 D 155 NaN 35.0 1.80 NaN NaN NaN \n", | |
"6 2 E 252 NaN NaN 0.65 NaN NaN NaN \n", | |
"\n", | |
" kgs/prod \n", | |
"0 NaN \n", | |
"1 NaN \n", | |
"2 NaN \n", | |
"3 NaN \n", | |
"4 NaN \n", | |
"5 NaN \n", | |
"6 NaN " | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"import numpy as np\n", | |
"\n", | |
"two_rxn = pd.read_excel('demo_rxns.xlsx', sheet_name='two rxns')\n", | |
"two_rxn[['kgs/rxn', '$/rxn', 'kgs/prod']] = np.nan\n", | |
"two_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "d9f063be-cc00-434a-b2e5-cb46cbc741da", | |
"metadata": {}, | |
"source": [ | |
"Pull out the final reaction, and do a calculation of `\"kgs/rxn\"`. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"id": "4eeb0b3d-3c25-46d9-ac58-7b14f1ed2538", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.0</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn $/rxn \\\n", | |
"4 2 C 180 NaN NaN 1.00 NaN 1.098901 NaN \n", | |
"5 2 D 155 NaN 35.0 1.80 NaN 1.703297 NaN \n", | |
"6 2 E 252 NaN NaN 0.65 NaN 1.000000 NaN \n", | |
"\n", | |
" kgs/prod \n", | |
"4 NaN \n", | |
"5 NaN \n", | |
"6 NaN " | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"step_mask = two_rxn['Step'] == 2\n", | |
"step2 = two_rxn[step_mask].copy()\n", | |
"\n", | |
"step2['kgs/rxn'] = step2['Equivalents']*step2['MW']\n", | |
"step2['kgs/rxn'] /= step2['kgs/rxn'].iloc[-1]\n", | |
"step2" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "c164fd8b-8c40-454e-9e13-59bf25b38950", | |
"metadata": {}, | |
"source": [ | |
"As you can see, though, we can't calculate the `\"$/rxn\"` yet because the `\"$/kg\"` of Compound \"C\" is not defined. However, the `\"kgs/rxn\"` of Compound \"C\" (1.1) is an imporant value here. This value tells me that for Compound \"C\" I'll need ~1.1 kg in order to make 1 kg of product \"E\". We'll store that value as a scaling factor for later and move on to Step 1. For Step 1, we'll use our one step function above to do the normal calculation of costs." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"id": "42a21c1c-0662-4918-8ddc-9e939e70c7d7", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.2</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.8</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.0 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.2 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.8 NaN 1.000000 \n", | |
"\n", | |
" $/rxn kgs/prod \n", | |
"0 169.444444 NaN \n", | |
"1 309.166667 NaN \n", | |
"2 16.944444 NaN \n", | |
"3 NaN NaN " | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"scale = step2['kgs/rxn'].iloc[0]\n", | |
"\n", | |
"step_mask = two_rxn['Step'] == 1\n", | |
"step1 = two_rxn[step_mask].copy()\n", | |
"\n", | |
"single_rxn_costs(step1)\n", | |
"step1" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "194f6e07-f01a-468b-94cf-7c92868666b9", | |
"metadata": {}, | |
"source": [ | |
"Now we are ready to calculate the kilograms per product. In this case, it is going to be the `\"kgs/rxn\"` multiplied by the scaling factor." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"id": "0ac0a267-e2aa-4935-a545-b72f9531f55c", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" <td>0.931013</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.2</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" <td>1.941392</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" <td>3.724054</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.8</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.0 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.2 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.8 NaN 1.000000 \n", | |
"\n", | |
" $/rxn kgs/prod \n", | |
"0 169.444444 0.931013 \n", | |
"1 309.166667 1.941392 \n", | |
"2 16.944444 3.724054 \n", | |
"3 NaN 1.098901 " | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"step1['kgs/prod'] = step1['kgs/rxn']*scale\n", | |
"step1" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "73e2d0d5-5a6f-44ae-b6ac-28f269592d5d", | |
"metadata": {}, | |
"source": [ | |
"Set the data for the first reaction back into the main table." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"id": "a5546bfb-905c-427c-be10-3838ac8d534c", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" <td>0.931013</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.20</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" <td>1.941392</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" <td>3.724054</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.000000</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.00 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.20 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.80 NaN 1.000000 \n", | |
"4 2 C 180 NaN NaN 1.00 NaN NaN \n", | |
"5 2 D 155 NaN 35.000000 1.80 NaN NaN \n", | |
"6 2 E 252 NaN NaN 0.65 NaN NaN \n", | |
"\n", | |
" $/rxn kgs/prod \n", | |
"0 169.444444 0.931013 \n", | |
"1 309.166667 1.941392 \n", | |
"2 16.944444 3.724054 \n", | |
"3 NaN 1.098901 \n", | |
"4 NaN NaN \n", | |
"5 NaN NaN \n", | |
"6 NaN NaN " | |
] | |
}, | |
"execution_count": 14, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"two_rxn.loc[step1.index, :] = step1\n", | |
"two_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "20bdf6bc-ef50-4e62-a84c-b0bb0012e629", | |
"metadata": {}, | |
"source": [ | |
"Now we can go back to Step 2 and use the cost we calcualted for the first reaction to finish off the costing for that step." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"id": "c2e6b44f-bb6c-450e-a916-a0b38a78b93d", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.000000</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"4 2 C 180 NaN 495.555556 1.00 NaN 1.098901 \n", | |
"5 2 D 155 NaN 35.000000 1.80 NaN 1.703297 \n", | |
"6 2 E 252 NaN NaN 0.65 NaN 1.000000 \n", | |
"\n", | |
" $/rxn kgs/prod \n", | |
"4 NaN NaN \n", | |
"5 NaN NaN \n", | |
"6 NaN NaN " | |
] | |
}, | |
"execution_count": 15, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"step1_prod_cost = step1['$/kg'].iloc[-1]\n", | |
"\n", | |
"step2.loc[4, '$/kg'] = step1_prod_cost\n", | |
"step2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"id": "a5a39e83-7335-4f08-bf1e-5957adbc4937", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>544.566545</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.000000</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>604.181929</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"4 2 C 180 NaN 495.555556 1.00 NaN 1.098901 \n", | |
"5 2 D 155 NaN 35.000000 1.80 NaN 1.703297 \n", | |
"6 2 E 252 NaN 604.181929 0.65 NaN 1.000000 \n", | |
"\n", | |
" $/rxn kgs/prod \n", | |
"4 544.566545 NaN \n", | |
"5 59.615385 NaN \n", | |
"6 NaN NaN " | |
] | |
}, | |
"execution_count": 16, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"single_rxn_costs(step2)\n", | |
"step2" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "f09cd6a0-7189-496b-bec0-2b1844aa3083", | |
"metadata": {}, | |
"source": [ | |
"For Step 2, the `\"kgs/prod\"` is equivalent to the `\"kgs/rxn\"` because this is the final step. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"id": "310f8ad6-3a0a-444c-84ff-5bc3fa4cb3d6", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" <td>0.931013</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.20</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" <td>1.941392</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" <td>3.724054</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>544.566545</td>\n", | |
" <td>1.098901</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.000000</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" <td>1.703297</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>604.181929</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.00 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.20 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.80 NaN 1.000000 \n", | |
"4 2 C 180 NaN 495.555556 1.00 NaN 1.098901 \n", | |
"5 2 D 155 NaN 35.000000 1.80 NaN 1.703297 \n", | |
"6 2 E 252 NaN 604.181929 0.65 NaN 1.000000 \n", | |
"\n", | |
" $/rxn kgs/prod \n", | |
"0 169.444444 0.931013 \n", | |
"1 309.166667 1.941392 \n", | |
"2 16.944444 3.724054 \n", | |
"3 NaN 1.098901 \n", | |
"4 544.566545 1.098901 \n", | |
"5 59.615385 1.703297 \n", | |
"6 NaN 1.000000 " | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"step2['kgs/prod'] = step2['kgs/rxn']\n", | |
"\n", | |
"two_rxn.loc[step2.index, :] = step2\n", | |
"two_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "5df6cad2-0462-4ed3-a607-eb89bd66d3ed", | |
"metadata": {}, | |
"source": [ | |
"# Why do you need \"kgs/prod\"?\n", | |
"\n", | |
"You may be asking why we created the \"kgs/prod\" column. In principal, you could move forward through the reactions and take each reaction product cost into the next reaction. But the \"kgs/prod\" column is extremely important because it tells a process chemist what scale each reaction will have to be run in order to make 1 kg of product. If 1,000 kg of product is desired, then it will just be that column multiplied by 1,000. The \"kgs/prod\" can be used to determine the waste (PMI) associated with a process. And perhaps most importantly, you can also use that column to calculate the cost of each component as a function of the entire process, which is crucial for determining the cost driver for a synthetic route. That is done below. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"id": "3247cf3c-8187-4720-b6e4-4536d4eb94b9", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" <th>$/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" <td>0.931013</td>\n", | |
" <td>186.202686</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.20</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" <td>1.941392</td>\n", | |
" <td>339.743590</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" <td>3.724054</td>\n", | |
" <td>18.620269</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>544.566545</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>544.566545</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>544.566545</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.000000</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>604.181929</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>604.181929</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.00 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.20 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.80 NaN 1.000000 \n", | |
"4 2 C 180 NaN 495.555556 1.00 NaN 1.098901 \n", | |
"5 2 D 155 NaN 35.000000 1.80 NaN 1.703297 \n", | |
"6 2 E 252 NaN 604.181929 0.65 NaN 1.000000 \n", | |
"\n", | |
" $/rxn kgs/prod $/prod \n", | |
"0 169.444444 0.931013 186.202686 \n", | |
"1 309.166667 1.941392 339.743590 \n", | |
"2 16.944444 3.724054 18.620269 \n", | |
"3 NaN 1.098901 544.566545 \n", | |
"4 544.566545 1.098901 544.566545 \n", | |
"5 59.615385 1.703297 59.615385 \n", | |
"6 NaN 1.000000 604.181929 " | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"two_rxn[\"$/prod\"] = two_rxn[\"kgs/prod\"]*two_rxn[\"$/kg\"]\n", | |
"two_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "cbfa4b04-7ccf-4d3a-beb1-a3e5931795cb", | |
"metadata": {}, | |
"source": [ | |
"For this column, though, you need to filter out values that are calculated, i.e. Compounds \"C\" and \"E\"." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"id": "6c86028c-43d0-4689-a739-bba236706403", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" <th>$/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" <td>0.931013</td>\n", | |
" <td>186.202686</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.20</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" <td>1.941392</td>\n", | |
" <td>339.743590</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" <td>3.724054</td>\n", | |
" <td>18.620269</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>544.566545</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.000000</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>604.181929</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.00 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.20 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.80 NaN 1.000000 \n", | |
"4 2 C 180 NaN 495.555556 1.00 NaN 1.098901 \n", | |
"5 2 D 155 NaN 35.000000 1.80 NaN 1.703297 \n", | |
"6 2 E 252 NaN 604.181929 0.65 NaN 1.000000 \n", | |
"\n", | |
" $/rxn kgs/prod $/prod \n", | |
"0 169.444444 0.931013 186.202686 \n", | |
"1 309.166667 1.941392 339.743590 \n", | |
"2 16.944444 3.724054 18.620269 \n", | |
"3 NaN 1.098901 NaN \n", | |
"4 544.566545 1.098901 NaN \n", | |
"5 59.615385 1.703297 59.615385 \n", | |
"6 NaN 1.000000 NaN " | |
] | |
}, | |
"execution_count": 19, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"mask = two_rxn['Compound'].isin([\"C\", \"E\"])\n", | |
"two_rxn.loc[mask, \"$/prod\"] = np.nan\n", | |
"two_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "16162c93-61f1-4028-9e93-0ef70865a7e1", | |
"metadata": { | |
"tags": [] | |
}, | |
"source": [ | |
"And to make it a little easier to compare, we can convert this to percentages." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"id": "5ceebd3e-be58-4dd9-ba3d-1668af1ce408", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" <th>$/prod</th>\n", | |
" <th>%/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" <td>0.931013</td>\n", | |
" <td>186.202686</td>\n", | |
" <td>30.818976</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.20</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" <td>1.941392</td>\n", | |
" <td>339.743590</td>\n", | |
" <td>56.232001</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" <td>3.724054</td>\n", | |
" <td>18.620269</td>\n", | |
" <td>3.081898</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>544.566545</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.000000</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" <td>9.867125</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>604.181929</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.00 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.20 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.80 NaN 1.000000 \n", | |
"4 2 C 180 NaN 495.555556 1.00 NaN 1.098901 \n", | |
"5 2 D 155 NaN 35.000000 1.80 NaN 1.703297 \n", | |
"6 2 E 252 NaN 604.181929 0.65 NaN 1.000000 \n", | |
"\n", | |
" $/rxn kgs/prod $/prod %/prod \n", | |
"0 169.444444 0.931013 186.202686 30.818976 \n", | |
"1 309.166667 1.941392 339.743590 56.232001 \n", | |
"2 16.944444 3.724054 18.620269 3.081898 \n", | |
"3 NaN 1.098901 NaN NaN \n", | |
"4 544.566545 1.098901 NaN NaN \n", | |
"5 59.615385 1.703297 59.615385 9.867125 \n", | |
"6 NaN 1.000000 NaN NaN " | |
] | |
}, | |
"execution_count": 20, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"two_rxn['%/prod'] = two_rxn['$/prod']*100/two_rxn['$/prod'].sum()\n", | |
"two_rxn" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "03e07212-4689-4428-b818-2da7e7f2d507", | |
"metadata": {}, | |
"source": [ | |
"# Interpretation\n", | |
"\n", | |
"The cost driver in this route is Compound \"B\", which contributes 56% to the overall raw material costs. This is a little bit surprising, because Compound \"A\" is the most expensive individual reagent. So this demonstrates the importance of this type of complete route analysis. \n", | |
"\n", | |
"# Making a recursive costing function.\n", | |
"\n", | |
"The recursive costing function will be a little different than the single reaction variant in a couple of ways. First, it will need the step where the final product is costed. It will also require scaling factor as a keyword argument, with the default being 1. There will be an internal loop to run through the reagents to find ones that don't have costs associated with them. Finally, it will need to return a the cost associated with the individual reaction." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"id": "51c2e501-4dec-4f05-a291-a02322044a7c", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"import pandas as pd\n", | |
"\n", | |
"def multiple_rxn_costs(rxns, step, scale=1.):\n", | |
" # Pull out a single reaction from the full rxns table\n", | |
" rxn_mask = rxns['Step'] == step\n", | |
" rxn = rxns[rxn_mask].copy()\n", | |
" \n", | |
" # Equivalents -> kg\n", | |
" rxn['kgs/rxn'] = rxn['Equivalents']*rxn['MW']\n", | |
" \n", | |
" volume_mask = rxn['Volumes'].notna()\n", | |
" # Only do the volume calc if there are volumes defined\n", | |
" if volume_mask.any():\n", | |
" ref_kg = rxn['kgs/rxn'].iloc[0]\n", | |
" vols = rxn.loc[volume_mask]\n", | |
" vols.loc[:, 'kgs/rxn'] = vols['Volumes']*vols['Density']*ref_kg\n", | |
" rxn.loc[volume_mask, :] = vols\n", | |
" \n", | |
" # Normalization\n", | |
" rxn['kgs/rxn'] /= rxn['kgs/rxn'].iloc[-1] \n", | |
" \n", | |
" # Set the kgs/prod using the scaling factor\n", | |
" rxn['kgs/prod'] = rxn['kgs/rxn']*scale\n", | |
" \n", | |
" # Loop through the compounds to find unknown costs\n", | |
" # Need the product name as well for comparison purposes\n", | |
" prod = rxn['Compound'].iloc[-1]\n", | |
" for idx, row in rxn.iterrows():\n", | |
" # If a $/kg value is empty (but not the rxn product)\n", | |
" # Then do the recursion\n", | |
" if row['Compound'] != prod and pd.isna(row['$/kg']):\n", | |
" # Find the step for the unknonwn price\n", | |
" next_step_mask = (rxns['Compound'] == row['Compound']) & \\\n", | |
" (rxns['Step'] != step)\n", | |
" # The iloc is necessary because otherwise you get a Series\n", | |
" # and you just want a single value. This assumes that there is\n", | |
" # only one reaction defining how to make this product, which should\n", | |
" # always be true in practice\n", | |
" next_step = rxns.loc[next_step_mask, 'Step'].iloc[0]\n", | |
" \n", | |
" # The kgs/rxn value will be the scaling factor; however,\n", | |
" # The scaling factor needs to be multiplied by the input scale\n", | |
" # because for number of rxns >2 the early reactions will be\n", | |
" # scaled by multiple factors\n", | |
" new_scale = scale*row['kgs/rxn']\n", | |
" \n", | |
" new_cost = multiple_rxn_costs(rxns, next_step, scale=new_scale)\n", | |
" rxn.loc[idx, '$/kg'] = new_cost\n", | |
" \n", | |
" # Filter out the \"kgs/prod\" for this compound because the price\n", | |
" # was calculated\n", | |
" rxn.loc[idx, 'kgs/prod'] = np.nan\n", | |
" \n", | |
" # Calc costs for reagents/solvents\n", | |
" rxn['$/rxn'] = rxn['kgs/rxn']*rxn['$/kg']\n", | |
" \n", | |
" # Calc cost for product\n", | |
" prod_index = rxn.index[-1]\n", | |
" prod_cost = rxn['$/rxn'].sum()\n", | |
" rxn.loc[prod_index, '$/kg'] = prod_cost\n", | |
" \n", | |
" # Filter out the \"kgs/prod\" for the rxn product because it is calculated\n", | |
" rxn.loc[prod_index, 'kgs/prod'] = np.nan\n", | |
" \n", | |
" rxns.loc[rxn.index, :] = rxn\n", | |
" \n", | |
" return rxn['$/kg'].iloc[-1]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"id": "b5fdf05d-2c9d-4b44-bed8-ae2f3a316386", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" <td>0.931013</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.20</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" <td>1.941392</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" <td>3.724054</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>544.566545</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.000000</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" <td>1.703297</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>604.181929</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.00 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.20 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.80 NaN 1.000000 \n", | |
"4 2 C 180 NaN 495.555556 1.00 NaN 1.098901 \n", | |
"5 2 D 155 NaN 35.000000 1.80 NaN 1.703297 \n", | |
"6 2 E 252 NaN 604.181929 0.65 NaN 1.000000 \n", | |
"\n", | |
" $/rxn kgs/prod \n", | |
"0 169.444444 0.931013 \n", | |
"1 309.166667 1.941392 \n", | |
"2 16.944444 3.724054 \n", | |
"3 NaN NaN \n", | |
"4 544.566545 NaN \n", | |
"5 59.615385 1.703297 \n", | |
"6 NaN NaN " | |
] | |
}, | |
"execution_count": 22, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"two_rxn = pd.read_excel('demo_rxns.xlsx', sheet_name='two rxns')\n", | |
"two_rxn[['kgs/rxn', '$/rxn', 'kgs/prod']] = np.nan\n", | |
"\n", | |
"multiple_rxn_costs(two_rxn, 2)\n", | |
"two_rxn" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"id": "a723757d-6d61-436c-974c-6ea21b9eda02", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Step</th>\n", | |
" <th>Compound</th>\n", | |
" <th>MW</th>\n", | |
" <th>Density</th>\n", | |
" <th>$/kg</th>\n", | |
" <th>Equivalents</th>\n", | |
" <th>Volumes</th>\n", | |
" <th>kgs/rxn</th>\n", | |
" <th>$/rxn</th>\n", | |
" <th>kgs/prod</th>\n", | |
" <th>$/prod</th>\n", | |
" <th>%/prod</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>A</td>\n", | |
" <td>122</td>\n", | |
" <td>NaN</td>\n", | |
" <td>200.000000</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.847222</td>\n", | |
" <td>169.444444</td>\n", | |
" <td>0.931013</td>\n", | |
" <td>186.202686</td>\n", | |
" <td>30.818976</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>B</td>\n", | |
" <td>212</td>\n", | |
" <td>NaN</td>\n", | |
" <td>175.000000</td>\n", | |
" <td>1.20</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.766667</td>\n", | |
" <td>309.166667</td>\n", | |
" <td>1.941392</td>\n", | |
" <td>339.743590</td>\n", | |
" <td>56.232001</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1</td>\n", | |
" <td>Solvent</td>\n", | |
" <td>100</td>\n", | |
" <td>0.8</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>5.0</td>\n", | |
" <td>3.388889</td>\n", | |
" <td>16.944444</td>\n", | |
" <td>3.724054</td>\n", | |
" <td>18.620269</td>\n", | |
" <td>3.081898</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>0.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2</td>\n", | |
" <td>C</td>\n", | |
" <td>180</td>\n", | |
" <td>NaN</td>\n", | |
" <td>495.555556</td>\n", | |
" <td>1.00</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.098901</td>\n", | |
" <td>544.566545</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2</td>\n", | |
" <td>D</td>\n", | |
" <td>155</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.000000</td>\n", | |
" <td>1.80</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" <td>1.703297</td>\n", | |
" <td>59.615385</td>\n", | |
" <td>9.867125</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2</td>\n", | |
" <td>E</td>\n", | |
" <td>252</td>\n", | |
" <td>NaN</td>\n", | |
" <td>604.181929</td>\n", | |
" <td>0.65</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Step Compound MW Density $/kg Equivalents Volumes kgs/rxn \\\n", | |
"0 1 A 122 NaN 200.000000 1.00 NaN 0.847222 \n", | |
"1 1 B 212 NaN 175.000000 1.20 NaN 1.766667 \n", | |
"2 1 Solvent 100 0.8 5.000000 NaN 5.0 3.388889 \n", | |
"3 1 C 180 NaN 495.555556 0.80 NaN 1.000000 \n", | |
"4 2 C 180 NaN 495.555556 1.00 NaN 1.098901 \n", | |
"5 2 D 155 NaN 35.000000 1.80 NaN 1.703297 \n", | |
"6 2 E 252 NaN 604.181929 0.65 NaN 1.000000 \n", | |
"\n", | |
" $/rxn kgs/prod $/prod %/prod \n", | |
"0 169.444444 0.931013 186.202686 30.818976 \n", | |
"1 309.166667 1.941392 339.743590 56.232001 \n", | |
"2 16.944444 3.724054 18.620269 3.081898 \n", | |
"3 NaN NaN NaN NaN \n", | |
"4 544.566545 NaN NaN NaN \n", | |
"5 59.615385 1.703297 59.615385 9.867125 \n", | |
"6 NaN NaN NaN NaN " | |
] | |
}, | |
"execution_count": 23, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# After the recursive function, you can calculate the remaining \"per prod\" values\n", | |
"two_rxn['$/prod'] = two_rxn['kgs/prod']*two_rxn['$/kg']\n", | |
"two_rxn['%/prod'] = two_rxn['$/prod']*100/two_rxn['$/prod'].sum()\n", | |
"two_rxn" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "1870b0f7-a308-42e8-aec1-93635a427817", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.9.18" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment