Metadata-Version: 2.1
Name: metric-forge
Version: 0.3.0
Summary: The Ultimate Metric Library
Home-page: https://github.com/jrasband-dev/metric-forge
Author: Jayden Rasband
Author-email: jayden.rasband@gmail.com
License: MIT
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: polars

# Metric Forge

<img src="https://raw.githubusercontent.com/jrasband-dev/metric-forge/fb6a5ed63c35eda1443c3e6cedd9b4f4b18d5e41/static/metric-forge2.svg" alt="Description of the image" width="300" height="300">

Metric Forge is your ultimate toolkit for measuring and evaluating performance across various business domains.

### Disclaimer

Metric Forge provides a collection of calculations across various domains, including finance, mortgage, marketing, and more. While every effort has been made to ensure the accuracy and reliability of the calculations and methods provided, Metric Forge is intended for informational and educational purposes only.

Important Notice:

No Warranty: The calculations and methods provided in this package are offered "as-is" without any guarantees or warranties of any kind, either express or implied. The package's creators do not assume any responsibility for errors or omissions or for any damages resulting from the use of the package.

Not Professional Advice: The results produced by the package should not be considered as professional financial, investment, legal, or any other type of advice. Users should consult with qualified professionals before making any decisions based on the outputs generated by this package.

Use at Your Own Risk: Users of Metric Forge assume full responsibility for the use of the package and its results. The creators of the package shall not be held liable for any decisions made based on the information provided or for any consequences arising from the use of the package.

By using this package, you acknowledge and agree to this disclaimer. If you do not agree, please refrain from using the Metric Forge package.


## Getting Started 
install the package via pip

```python
pip install metric-forge
```

## Ecommerce
You can use Ecommerce Metrics in two different ways:
* With Polars
* As a Single Value Function (SVF)

Metric Forge extends the Polars expression library; making it possible to perform row-wise-calculations for various metrics. In addition to mass calculations, you can also perform single value calculations that return just one value. 


```python
from metric_forge.ecommerce import * 
import polars as pl
data = pl.read_csv('datasets/ecommerce_metrics.csv')
data.head()
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (5, 15)</small><table border="1" class="dataframe"><thead><tr><th>month</th><th>total_revenue</th><th>number_of_orders</th><th>cost_of_acquisition</th><th>new_customers</th><th>carts_created</th><th>completed_purchases</th><th>revenue_from_ads</th><th>advertising_spend</th><th>num_conversions</th><th>num_visitors</th><th>revenue_per_customer</th><th>average_customer_lifetime</th><th>num_customers_lost</th><th>total_customers_beginning</th></tr><tr><td>str</td><td>f64</td><td>i64</td><td>f64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td></tr></thead><tbody><tr><td>&quot;2023-01&quot;</td><td>87454.011885</td><td>991</td><td>22958.350559</td><td>406</td><td>1969</td><td>1425</td><td>81339.957696</td><td>5390.910169</td><td>300</td><td>13154</td><td>202.427329</td><td>3.159364</td><td>239</td><td>3306</td></tr><tr><td>&quot;2023-02&quot;</td><td>145071.430641</td><td>913</td><td>18736.874206</td><td>234</td><td>1506</td><td>1421</td><td>76875.083402</td><td>15585.037018</td><td>427</td><td>14762</td><td>116.173436</td><td>1.812245</td><td>124</td><td>4680</td></tr><tr><td>&quot;2023-03&quot;</td><td>123199.394181</td><td>1305</td><td>28355.586842</td><td>120</td><td>1497</td><td>965</td><td>116505.482191</td><td>14872.037954</td><td>367</td><td>10056</td><td>384.265156</td><td>4.771414</td><td>177</td><td>4675</td></tr><tr><td>&quot;2023-04&quot;</td><td>109865.84842</td><td>885</td><td>14184.81582</td><td>428</td><td>1963</td><td>1102</td><td>106008.046381</td><td>12337.204368</td><td>132</td><td>19948</td><td>144.356328</td><td>3.395462</td><td>299</td><td>2972</td></tr><tr><td>&quot;2023-05&quot;</td><td>65601.864044</td><td>691</td><td>18764.339456</td><td>266</td><td>1009</td><td>801</td><td>97258.809912</td><td>5351.995568</td><td>147</td><td>13110</td><td>275.734601</td><td>3.77914</td><td>296</td><td>3768</td></tr></tbody></table></div>



#### Customer Acquisition Cost


```python
data.with_columns(pl.col('*').forge_ecommerce.customer_acquisition_cost('cost_of_acquisition', 'new_customers'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (12, 16)</small><table border="1" class="dataframe"><thead><tr><th>month</th><th>total_revenue</th><th>number_of_orders</th><th>cost_of_acquisition</th><th>new_customers</th><th>carts_created</th><th>completed_purchases</th><th>revenue_from_ads</th><th>advertising_spend</th><th>num_conversions</th><th>num_visitors</th><th>revenue_per_customer</th><th>average_customer_lifetime</th><th>num_customers_lost</th><th>total_customers_beginning</th><th>customer_acquisition_cost</th></tr><tr><td>str</td><td>f64</td><td>i64</td><td>f64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-01&quot;</td><td>87454.011885</td><td>991</td><td>22958.350559</td><td>406</td><td>1969</td><td>1425</td><td>81339.957696</td><td>5390.910169</td><td>300</td><td>13154</td><td>202.427329</td><td>3.159364</td><td>239</td><td>3306</td><td>56.547661</td></tr><tr><td>&quot;2023-02&quot;</td><td>145071.430641</td><td>913</td><td>18736.874206</td><td>234</td><td>1506</td><td>1421</td><td>76875.083402</td><td>15585.037018</td><td>427</td><td>14762</td><td>116.173436</td><td>1.812245</td><td>124</td><td>4680</td><td>80.072112</td></tr><tr><td>&quot;2023-03&quot;</td><td>123199.394181</td><td>1305</td><td>28355.586842</td><td>120</td><td>1497</td><td>965</td><td>116505.482191</td><td>14872.037954</td><td>367</td><td>10056</td><td>384.265156</td><td>4.771414</td><td>177</td><td>4675</td><td>236.296557</td></tr><tr><td>&quot;2023-04&quot;</td><td>109865.84842</td><td>885</td><td>14184.81582</td><td>428</td><td>1963</td><td>1102</td><td>106008.046381</td><td>12337.204368</td><td>132</td><td>19948</td><td>144.356328</td><td>3.395462</td><td>299</td><td>2972</td><td>33.142093</td></tr><tr><td>&quot;2023-05&quot;</td><td>65601.864044</td><td>691</td><td>18764.339456</td><td>266</td><td>1009</td><td>801</td><td>97258.809912</td><td>5351.995568</td><td>147</td><td>13110</td><td>275.734601</td><td>3.77914</td><td>296</td><td>3768</td><td>70.54263</td></tr><tr><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td></tr><tr><td>&quot;2023-08&quot;</td><td>136617.614577</td><td>660</td><td>33555.278842</td><td>188</td><td>1108</td><td>601</td><td>116872.977654</td><td>24754.388513</td><td>392</td><td>8840</td><td>290.148089</td><td>2.182535</td><td>280</td><td>3479</td><td>178.485526</td></tr><tr><td>&quot;2023-09&quot;</td><td>110111.501174</td><td>959</td><td>15990.213465</td><td>415</td><td>1975</td><td>1395</td><td>84633.082292</td><td>20148.99937</td><td>198</td><td>6028</td><td>325.310229</td><td>1.421977</td><td>239</td><td>3434</td><td>38.530635</td></tr><tr><td>&quot;2023-10&quot;</td><td>120807.25778</td><td>813</td><td>25427.033152</td><td>113</td><td>800</td><td>669</td><td>54839.926382</td><td>28157.521963</td><td>271</td><td>12385</td><td>378.206435</td><td>2.826138</td><td>274</td><td>2648</td><td>225.017992</td></tr><tr><td>&quot;2023-11&quot;</td><td>52058.44943</td><td>521</td><td>27772.437066</td><td>341</td><td>2005</td><td>1215</td><td>56664.615513</td><td>21276.925638</td><td>459</td><td>5502</td><td>155.732582</td><td>1.873762</td><td>178</td><td>2317</td><td>81.444097</td></tr><tr><td>&quot;2023-12&quot;</td><td>146990.985216</td><td>752</td><td>11393.512382</td><td>364</td><td>1704</td><td>855</td><td>44874.024516</td><td>27873.991889</td><td>313</td><td>11910</td><td>341.766952</td><td>2.66604</td><td>170</td><td>3257</td><td>31.300858</td></tr></tbody></table></div>



#### Average Order Value


```python
data.with_columns(pl.col('*').forge_ecommerce.average_order_value('total_revenue', 'number_of_orders'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (12, 16)</small><table border="1" class="dataframe"><thead><tr><th>month</th><th>total_revenue</th><th>number_of_orders</th><th>cost_of_acquisition</th><th>new_customers</th><th>carts_created</th><th>completed_purchases</th><th>revenue_from_ads</th><th>advertising_spend</th><th>num_conversions</th><th>num_visitors</th><th>revenue_per_customer</th><th>average_customer_lifetime</th><th>num_customers_lost</th><th>total_customers_beginning</th><th>average_order_value</th></tr><tr><td>str</td><td>f64</td><td>i64</td><td>f64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-01&quot;</td><td>87454.011885</td><td>991</td><td>22958.350559</td><td>406</td><td>1969</td><td>1425</td><td>81339.957696</td><td>5390.910169</td><td>300</td><td>13154</td><td>202.427329</td><td>3.159364</td><td>239</td><td>3306</td><td>88.248246</td></tr><tr><td>&quot;2023-02&quot;</td><td>145071.430641</td><td>913</td><td>18736.874206</td><td>234</td><td>1506</td><td>1421</td><td>76875.083402</td><td>15585.037018</td><td>427</td><td>14762</td><td>116.173436</td><td>1.812245</td><td>124</td><td>4680</td><td>158.895324</td></tr><tr><td>&quot;2023-03&quot;</td><td>123199.394181</td><td>1305</td><td>28355.586842</td><td>120</td><td>1497</td><td>965</td><td>116505.482191</td><td>14872.037954</td><td>367</td><td>10056</td><td>384.265156</td><td>4.771414</td><td>177</td><td>4675</td><td>94.405666</td></tr><tr><td>&quot;2023-04&quot;</td><td>109865.84842</td><td>885</td><td>14184.81582</td><td>428</td><td>1963</td><td>1102</td><td>106008.046381</td><td>12337.204368</td><td>132</td><td>19948</td><td>144.356328</td><td>3.395462</td><td>299</td><td>2972</td><td>124.142202</td></tr><tr><td>&quot;2023-05&quot;</td><td>65601.864044</td><td>691</td><td>18764.339456</td><td>266</td><td>1009</td><td>801</td><td>97258.809912</td><td>5351.995568</td><td>147</td><td>13110</td><td>275.734601</td><td>3.77914</td><td>296</td><td>3768</td><td>94.937575</td></tr><tr><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td></tr><tr><td>&quot;2023-08&quot;</td><td>136617.614577</td><td>660</td><td>33555.278842</td><td>188</td><td>1108</td><td>601</td><td>116872.977654</td><td>24754.388513</td><td>392</td><td>8840</td><td>290.148089</td><td>2.182535</td><td>280</td><td>3479</td><td>206.996386</td></tr><tr><td>&quot;2023-09&quot;</td><td>110111.501174</td><td>959</td><td>15990.213465</td><td>415</td><td>1975</td><td>1395</td><td>84633.082292</td><td>20148.99937</td><td>198</td><td>6028</td><td>325.310229</td><td>1.421977</td><td>239</td><td>3434</td><td>114.819084</td></tr><tr><td>&quot;2023-10&quot;</td><td>120807.25778</td><td>813</td><td>25427.033152</td><td>113</td><td>800</td><td>669</td><td>54839.926382</td><td>28157.521963</td><td>271</td><td>12385</td><td>378.206435</td><td>2.826138</td><td>274</td><td>2648</td><td>148.594413</td></tr><tr><td>&quot;2023-11&quot;</td><td>52058.44943</td><td>521</td><td>27772.437066</td><td>341</td><td>2005</td><td>1215</td><td>56664.615513</td><td>21276.925638</td><td>459</td><td>5502</td><td>155.732582</td><td>1.873762</td><td>178</td><td>2317</td><td>99.920248</td></tr><tr><td>&quot;2023-12&quot;</td><td>146990.985216</td><td>752</td><td>11393.512382</td><td>364</td><td>1704</td><td>855</td><td>44874.024516</td><td>27873.991889</td><td>313</td><td>11910</td><td>341.766952</td><td>2.66604</td><td>170</td><td>3257</td><td>195.466736</td></tr></tbody></table></div>



#### Cart Abandonment Rate


```python
data.with_columns(pl.col('*').forge_ecommerce.cart_abandonment_rate('carts_created', 'completed_purchases'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (12, 16)</small><table border="1" class="dataframe"><thead><tr><th>month</th><th>total_revenue</th><th>number_of_orders</th><th>cost_of_acquisition</th><th>new_customers</th><th>carts_created</th><th>completed_purchases</th><th>revenue_from_ads</th><th>advertising_spend</th><th>num_conversions</th><th>num_visitors</th><th>revenue_per_customer</th><th>average_customer_lifetime</th><th>num_customers_lost</th><th>total_customers_beginning</th><th>cart_abandonment_rate</th></tr><tr><td>str</td><td>f64</td><td>i64</td><td>f64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-01&quot;</td><td>87454.011885</td><td>991</td><td>22958.350559</td><td>406</td><td>1969</td><td>1425</td><td>81339.957696</td><td>5390.910169</td><td>300</td><td>13154</td><td>202.427329</td><td>3.159364</td><td>239</td><td>3306</td><td>27.628238</td></tr><tr><td>&quot;2023-02&quot;</td><td>145071.430641</td><td>913</td><td>18736.874206</td><td>234</td><td>1506</td><td>1421</td><td>76875.083402</td><td>15585.037018</td><td>427</td><td>14762</td><td>116.173436</td><td>1.812245</td><td>124</td><td>4680</td><td>5.64409</td></tr><tr><td>&quot;2023-03&quot;</td><td>123199.394181</td><td>1305</td><td>28355.586842</td><td>120</td><td>1497</td><td>965</td><td>116505.482191</td><td>14872.037954</td><td>367</td><td>10056</td><td>384.265156</td><td>4.771414</td><td>177</td><td>4675</td><td>35.537742</td></tr><tr><td>&quot;2023-04&quot;</td><td>109865.84842</td><td>885</td><td>14184.81582</td><td>428</td><td>1963</td><td>1102</td><td>106008.046381</td><td>12337.204368</td><td>132</td><td>19948</td><td>144.356328</td><td>3.395462</td><td>299</td><td>2972</td><td>43.861437</td></tr><tr><td>&quot;2023-05&quot;</td><td>65601.864044</td><td>691</td><td>18764.339456</td><td>266</td><td>1009</td><td>801</td><td>97258.809912</td><td>5351.995568</td><td>147</td><td>13110</td><td>275.734601</td><td>3.77914</td><td>296</td><td>3768</td><td>20.61447</td></tr><tr><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td></tr><tr><td>&quot;2023-08&quot;</td><td>136617.614577</td><td>660</td><td>33555.278842</td><td>188</td><td>1108</td><td>601</td><td>116872.977654</td><td>24754.388513</td><td>392</td><td>8840</td><td>290.148089</td><td>2.182535</td><td>280</td><td>3479</td><td>45.758123</td></tr><tr><td>&quot;2023-09&quot;</td><td>110111.501174</td><td>959</td><td>15990.213465</td><td>415</td><td>1975</td><td>1395</td><td>84633.082292</td><td>20148.99937</td><td>198</td><td>6028</td><td>325.310229</td><td>1.421977</td><td>239</td><td>3434</td><td>29.367089</td></tr><tr><td>&quot;2023-10&quot;</td><td>120807.25778</td><td>813</td><td>25427.033152</td><td>113</td><td>800</td><td>669</td><td>54839.926382</td><td>28157.521963</td><td>271</td><td>12385</td><td>378.206435</td><td>2.826138</td><td>274</td><td>2648</td><td>16.375</td></tr><tr><td>&quot;2023-11&quot;</td><td>52058.44943</td><td>521</td><td>27772.437066</td><td>341</td><td>2005</td><td>1215</td><td>56664.615513</td><td>21276.925638</td><td>459</td><td>5502</td><td>155.732582</td><td>1.873762</td><td>178</td><td>2317</td><td>39.401496</td></tr><tr><td>&quot;2023-12&quot;</td><td>146990.985216</td><td>752</td><td>11393.512382</td><td>364</td><td>1704</td><td>855</td><td>44874.024516</td><td>27873.991889</td><td>313</td><td>11910</td><td>341.766952</td><td>2.66604</td><td>170</td><td>3257</td><td>49.823944</td></tr></tbody></table></div>



#### Return on Advertising Spend


```python
data.with_columns(pl.col('*').forge_ecommerce.return_on_advertising_spend('revenue_from_ads', 'advertising_spend'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (12, 16)</small><table border="1" class="dataframe"><thead><tr><th>month</th><th>total_revenue</th><th>number_of_orders</th><th>cost_of_acquisition</th><th>new_customers</th><th>carts_created</th><th>completed_purchases</th><th>revenue_from_ads</th><th>advertising_spend</th><th>num_conversions</th><th>num_visitors</th><th>revenue_per_customer</th><th>average_customer_lifetime</th><th>num_customers_lost</th><th>total_customers_beginning</th><th>return_on_advertising_spend</th></tr><tr><td>str</td><td>f64</td><td>i64</td><td>f64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-01&quot;</td><td>87454.011885</td><td>991</td><td>22958.350559</td><td>406</td><td>1969</td><td>1425</td><td>81339.957696</td><td>5390.910169</td><td>300</td><td>13154</td><td>202.427329</td><td>3.159364</td><td>239</td><td>3306</td><td>15.088353</td></tr><tr><td>&quot;2023-02&quot;</td><td>145071.430641</td><td>913</td><td>18736.874206</td><td>234</td><td>1506</td><td>1421</td><td>76875.083402</td><td>15585.037018</td><td>427</td><td>14762</td><td>116.173436</td><td>1.812245</td><td>124</td><td>4680</td><td>4.932621</td></tr><tr><td>&quot;2023-03&quot;</td><td>123199.394181</td><td>1305</td><td>28355.586842</td><td>120</td><td>1497</td><td>965</td><td>116505.482191</td><td>14872.037954</td><td>367</td><td>10056</td><td>384.265156</td><td>4.771414</td><td>177</td><td>4675</td><td>7.833861</td></tr><tr><td>&quot;2023-04&quot;</td><td>109865.84842</td><td>885</td><td>14184.81582</td><td>428</td><td>1963</td><td>1102</td><td>106008.046381</td><td>12337.204368</td><td>132</td><td>19948</td><td>144.356328</td><td>3.395462</td><td>299</td><td>2972</td><td>8.59255</td></tr><tr><td>&quot;2023-05&quot;</td><td>65601.864044</td><td>691</td><td>18764.339456</td><td>266</td><td>1009</td><td>801</td><td>97258.809912</td><td>5351.995568</td><td>147</td><td>13110</td><td>275.734601</td><td>3.77914</td><td>296</td><td>3768</td><td>18.172438</td></tr><tr><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td></tr><tr><td>&quot;2023-08&quot;</td><td>136617.614577</td><td>660</td><td>33555.278842</td><td>188</td><td>1108</td><td>601</td><td>116872.977654</td><td>24754.388513</td><td>392</td><td>8840</td><td>290.148089</td><td>2.182535</td><td>280</td><td>3479</td><td>4.721303</td></tr><tr><td>&quot;2023-09&quot;</td><td>110111.501174</td><td>959</td><td>15990.213465</td><td>415</td><td>1975</td><td>1395</td><td>84633.082292</td><td>20148.99937</td><td>198</td><td>6028</td><td>325.310229</td><td>1.421977</td><td>239</td><td>3434</td><td>4.200362</td></tr><tr><td>&quot;2023-10&quot;</td><td>120807.25778</td><td>813</td><td>25427.033152</td><td>113</td><td>800</td><td>669</td><td>54839.926382</td><td>28157.521963</td><td>271</td><td>12385</td><td>378.206435</td><td>2.826138</td><td>274</td><td>2648</td><td>1.947612</td></tr><tr><td>&quot;2023-11&quot;</td><td>52058.44943</td><td>521</td><td>27772.437066</td><td>341</td><td>2005</td><td>1215</td><td>56664.615513</td><td>21276.925638</td><td>459</td><td>5502</td><td>155.732582</td><td>1.873762</td><td>178</td><td>2317</td><td>2.663196</td></tr><tr><td>&quot;2023-12&quot;</td><td>146990.985216</td><td>752</td><td>11393.512382</td><td>364</td><td>1704</td><td>855</td><td>44874.024516</td><td>27873.991889</td><td>313</td><td>11910</td><td>341.766952</td><td>2.66604</td><td>170</td><td>3257</td><td>1.609889</td></tr></tbody></table></div>



#### Conversion Rate


```python
data.with_columns(pl.col('*').forge_ecommerce.conversion_rate('num_conversions', 'num_visitors'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (12, 16)</small><table border="1" class="dataframe"><thead><tr><th>month</th><th>total_revenue</th><th>number_of_orders</th><th>cost_of_acquisition</th><th>new_customers</th><th>carts_created</th><th>completed_purchases</th><th>revenue_from_ads</th><th>advertising_spend</th><th>num_conversions</th><th>num_visitors</th><th>revenue_per_customer</th><th>average_customer_lifetime</th><th>num_customers_lost</th><th>total_customers_beginning</th><th>conversion_rate</th></tr><tr><td>str</td><td>f64</td><td>i64</td><td>f64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-01&quot;</td><td>87454.011885</td><td>991</td><td>22958.350559</td><td>406</td><td>1969</td><td>1425</td><td>81339.957696</td><td>5390.910169</td><td>300</td><td>13154</td><td>202.427329</td><td>3.159364</td><td>239</td><td>3306</td><td>2.280675</td></tr><tr><td>&quot;2023-02&quot;</td><td>145071.430641</td><td>913</td><td>18736.874206</td><td>234</td><td>1506</td><td>1421</td><td>76875.083402</td><td>15585.037018</td><td>427</td><td>14762</td><td>116.173436</td><td>1.812245</td><td>124</td><td>4680</td><td>2.892562</td></tr><tr><td>&quot;2023-03&quot;</td><td>123199.394181</td><td>1305</td><td>28355.586842</td><td>120</td><td>1497</td><td>965</td><td>116505.482191</td><td>14872.037954</td><td>367</td><td>10056</td><td>384.265156</td><td>4.771414</td><td>177</td><td>4675</td><td>3.649562</td></tr><tr><td>&quot;2023-04&quot;</td><td>109865.84842</td><td>885</td><td>14184.81582</td><td>428</td><td>1963</td><td>1102</td><td>106008.046381</td><td>12337.204368</td><td>132</td><td>19948</td><td>144.356328</td><td>3.395462</td><td>299</td><td>2972</td><td>0.66172</td></tr><tr><td>&quot;2023-05&quot;</td><td>65601.864044</td><td>691</td><td>18764.339456</td><td>266</td><td>1009</td><td>801</td><td>97258.809912</td><td>5351.995568</td><td>147</td><td>13110</td><td>275.734601</td><td>3.77914</td><td>296</td><td>3768</td><td>1.121281</td></tr><tr><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td></tr><tr><td>&quot;2023-08&quot;</td><td>136617.614577</td><td>660</td><td>33555.278842</td><td>188</td><td>1108</td><td>601</td><td>116872.977654</td><td>24754.388513</td><td>392</td><td>8840</td><td>290.148089</td><td>2.182535</td><td>280</td><td>3479</td><td>4.434389</td></tr><tr><td>&quot;2023-09&quot;</td><td>110111.501174</td><td>959</td><td>15990.213465</td><td>415</td><td>1975</td><td>1395</td><td>84633.082292</td><td>20148.99937</td><td>198</td><td>6028</td><td>325.310229</td><td>1.421977</td><td>239</td><td>3434</td><td>3.284672</td></tr><tr><td>&quot;2023-10&quot;</td><td>120807.25778</td><td>813</td><td>25427.033152</td><td>113</td><td>800</td><td>669</td><td>54839.926382</td><td>28157.521963</td><td>271</td><td>12385</td><td>378.206435</td><td>2.826138</td><td>274</td><td>2648</td><td>2.188131</td></tr><tr><td>&quot;2023-11&quot;</td><td>52058.44943</td><td>521</td><td>27772.437066</td><td>341</td><td>2005</td><td>1215</td><td>56664.615513</td><td>21276.925638</td><td>459</td><td>5502</td><td>155.732582</td><td>1.873762</td><td>178</td><td>2317</td><td>8.342421</td></tr><tr><td>&quot;2023-12&quot;</td><td>146990.985216</td><td>752</td><td>11393.512382</td><td>364</td><td>1704</td><td>855</td><td>44874.024516</td><td>27873.991889</td><td>313</td><td>11910</td><td>341.766952</td><td>2.66604</td><td>170</td><td>3257</td><td>2.628044</td></tr></tbody></table></div>



#### Customer Lifetime Value


```python
data.with_columns(pl.col('*').forge_ecommerce.customer_lifetime_value('revenue_per_customer', 'average_customer_lifetime'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (12, 16)</small><table border="1" class="dataframe"><thead><tr><th>month</th><th>total_revenue</th><th>number_of_orders</th><th>cost_of_acquisition</th><th>new_customers</th><th>carts_created</th><th>completed_purchases</th><th>revenue_from_ads</th><th>advertising_spend</th><th>num_conversions</th><th>num_visitors</th><th>revenue_per_customer</th><th>average_customer_lifetime</th><th>num_customers_lost</th><th>total_customers_beginning</th><th>customer_lifetime_value</th></tr><tr><td>str</td><td>f64</td><td>i64</td><td>f64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td><td>f64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-01&quot;</td><td>87454.011885</td><td>991</td><td>22958.350559</td><td>406</td><td>1969</td><td>1425</td><td>81339.957696</td><td>5390.910169</td><td>300</td><td>13154</td><td>202.427329</td><td>3.159364</td><td>239</td><td>3306</td><td>639.54169</td></tr><tr><td>&quot;2023-02&quot;</td><td>145071.430641</td><td>913</td><td>18736.874206</td><td>234</td><td>1506</td><td>1421</td><td>76875.083402</td><td>15585.037018</td><td>427</td><td>14762</td><td>116.173436</td><td>1.812245</td><td>124</td><td>4680</td><td>210.534716</td></tr><tr><td>&quot;2023-03&quot;</td><td>123199.394181</td><td>1305</td><td>28355.586842</td><td>120</td><td>1497</td><td>965</td><td>116505.482191</td><td>14872.037954</td><td>367</td><td>10056</td><td>384.265156</td><td>4.771414</td><td>177</td><td>4675</td><td>1833.488253</td></tr><tr><td>&quot;2023-04&quot;</td><td>109865.84842</td><td>885</td><td>14184.81582</td><td>428</td><td>1963</td><td>1102</td><td>106008.046381</td><td>12337.204368</td><td>132</td><td>19948</td><td>144.356328</td><td>3.395462</td><td>299</td><td>2972</td><td>490.156408</td></tr><tr><td>&quot;2023-05&quot;</td><td>65601.864044</td><td>691</td><td>18764.339456</td><td>266</td><td>1009</td><td>801</td><td>97258.809912</td><td>5351.995568</td><td>147</td><td>13110</td><td>275.734601</td><td>3.77914</td><td>296</td><td>3768</td><td>1042.039585</td></tr><tr><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td></tr><tr><td>&quot;2023-08&quot;</td><td>136617.614577</td><td>660</td><td>33555.278842</td><td>188</td><td>1108</td><td>601</td><td>116872.977654</td><td>24754.388513</td><td>392</td><td>8840</td><td>290.148089</td><td>2.182535</td><td>280</td><td>3479</td><td>633.258286</td></tr><tr><td>&quot;2023-09&quot;</td><td>110111.501174</td><td>959</td><td>15990.213465</td><td>415</td><td>1975</td><td>1395</td><td>84633.082292</td><td>20148.99937</td><td>198</td><td>6028</td><td>325.310229</td><td>1.421977</td><td>239</td><td>3434</td><td>462.583676</td></tr><tr><td>&quot;2023-10&quot;</td><td>120807.25778</td><td>813</td><td>25427.033152</td><td>113</td><td>800</td><td>669</td><td>54839.926382</td><td>28157.521963</td><td>271</td><td>12385</td><td>378.206435</td><td>2.826138</td><td>274</td><td>2648</td><td>1068.863683</td></tr><tr><td>&quot;2023-11&quot;</td><td>52058.44943</td><td>521</td><td>27772.437066</td><td>341</td><td>2005</td><td>1215</td><td>56664.615513</td><td>21276.925638</td><td>459</td><td>5502</td><td>155.732582</td><td>1.873762</td><td>178</td><td>2317</td><td>291.805755</td></tr><tr><td>&quot;2023-12&quot;</td><td>146990.985216</td><td>752</td><td>11393.512382</td><td>364</td><td>1704</td><td>855</td><td>44874.024516</td><td>27873.991889</td><td>313</td><td>11910</td><td>341.766952</td><td>2.66604</td><td>170</td><td>3257</td><td>911.164293</td></tr></tbody></table></div>



## Product Development
You can use Product Development Metrics in two different ways:
* With Polars
* As a Single Value Function (SVF)

Metric Forge extends the Polars expression library; making it possible to perform row-wise-calculations for various metrics. In addition to mass calculations, you can also perform single value calculations that return just one value. 


```python
import polars as pl
data = pl.read_csv('datasets/customer-value.csv')
data
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (10, 3)</small><table border="1" class="dataframe"><thead><tr><th>feature_name</th><th>importance_score</th><th>satisfaction_score</th></tr><tr><td>str</td><td>i64</td><td>i64</td></tr></thead><tbody><tr><td>&quot;Feature1&quot;</td><td>8</td><td>7</td></tr><tr><td>&quot;Feature2&quot;</td><td>6</td><td>8</td></tr><tr><td>&quot;Feature3&quot;</td><td>7</td><td>9</td></tr><tr><td>&quot;Feature4&quot;</td><td>8</td><td>7</td></tr><tr><td>&quot;Feature5&quot;</td><td>6</td><td>6</td></tr><tr><td>&quot;Feature6&quot;</td><td>9</td><td>8</td></tr><tr><td>&quot;Feature7&quot;</td><td>7</td><td>9</td></tr><tr><td>&quot;Feature8&quot;</td><td>6</td><td>7</td></tr><tr><td>&quot;Feature9&quot;</td><td>9</td><td>8</td></tr><tr><td>&quot;Feature10&quot;</td><td>8</td><td>7</td></tr></tbody></table></div>



### Underserved Customer Needs


```python
from metric_forge.product_development import *


data.with_columns(pl.col('*').forge_product_dev.opportunity_score(importance_col='importance_score',satisfaction_col='satisfaction_score'))

```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (10, 4)</small><table border="1" class="dataframe"><thead><tr><th>feature_name</th><th>importance_score</th><th>satisfaction_score</th><th>opportunity_score</th></tr><tr><td>str</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;Feature1&quot;</td><td>8</td><td>7</td><td>9.0</td></tr><tr><td>&quot;Feature2&quot;</td><td>6</td><td>8</td><td>4.0</td></tr><tr><td>&quot;Feature3&quot;</td><td>7</td><td>9</td><td>5.0</td></tr><tr><td>&quot;Feature4&quot;</td><td>8</td><td>7</td><td>9.0</td></tr><tr><td>&quot;Feature5&quot;</td><td>6</td><td>6</td><td>6.0</td></tr><tr><td>&quot;Feature6&quot;</td><td>9</td><td>8</td><td>10.0</td></tr><tr><td>&quot;Feature7&quot;</td><td>7</td><td>9</td><td>5.0</td></tr><tr><td>&quot;Feature8&quot;</td><td>6</td><td>7</td><td>5.0</td></tr><tr><td>&quot;Feature9&quot;</td><td>9</td><td>8</td><td>10.0</td></tr><tr><td>&quot;Feature10&quot;</td><td>8</td><td>7</td><td>9.0</td></tr></tbody></table></div>




```python
data.with_columns(pl.col('*').forge_product_dev.customer_value_delivered(importance_col='importance_score',satisfaction_col='satisfaction_score'))

```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (10, 4)</small><table border="1" class="dataframe"><thead><tr><th>feature_name</th><th>importance_score</th><th>satisfaction_score</th><th>customer_value_delivered</th></tr><tr><td>str</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;Feature1&quot;</td><td>8</td><td>7</td><td>0.56</td></tr><tr><td>&quot;Feature2&quot;</td><td>6</td><td>8</td><td>0.48</td></tr><tr><td>&quot;Feature3&quot;</td><td>7</td><td>9</td><td>0.63</td></tr><tr><td>&quot;Feature4&quot;</td><td>8</td><td>7</td><td>0.56</td></tr><tr><td>&quot;Feature5&quot;</td><td>6</td><td>6</td><td>0.36</td></tr><tr><td>&quot;Feature6&quot;</td><td>9</td><td>8</td><td>0.72</td></tr><tr><td>&quot;Feature7&quot;</td><td>7</td><td>9</td><td>0.63</td></tr><tr><td>&quot;Feature8&quot;</td><td>6</td><td>7</td><td>0.42</td></tr><tr><td>&quot;Feature9&quot;</td><td>9</td><td>8</td><td>0.72</td></tr><tr><td>&quot;Feature10&quot;</td><td>8</td><td>7</td><td>0.56</td></tr></tbody></table></div>




```python
data.with_columns(pl.col('*').forge_product_dev.opportunity_to_add_value(importance_col='importance_score',satisfaction_col='satisfaction_score'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (10, 4)</small><table border="1" class="dataframe"><thead><tr><th>feature_name</th><th>importance_score</th><th>satisfaction_score</th><th>opp_to_add_value</th></tr><tr><td>str</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;Feature1&quot;</td><td>8</td><td>7</td><td>0.24</td></tr><tr><td>&quot;Feature2&quot;</td><td>6</td><td>8</td><td>0.12</td></tr><tr><td>&quot;Feature3&quot;</td><td>7</td><td>9</td><td>0.07</td></tr><tr><td>&quot;Feature4&quot;</td><td>8</td><td>7</td><td>0.24</td></tr><tr><td>&quot;Feature5&quot;</td><td>6</td><td>6</td><td>0.24</td></tr><tr><td>&quot;Feature6&quot;</td><td>9</td><td>8</td><td>0.18</td></tr><tr><td>&quot;Feature7&quot;</td><td>7</td><td>9</td><td>0.07</td></tr><tr><td>&quot;Feature8&quot;</td><td>6</td><td>7</td><td>0.18</td></tr><tr><td>&quot;Feature9&quot;</td><td>9</td><td>8</td><td>0.18</td></tr><tr><td>&quot;Feature10&quot;</td><td>8</td><td>7</td><td>0.24</td></tr></tbody></table></div>




```python
import polars as pl
data = pl.read_csv('datasets/customer-value-added.csv')
data
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (10, 4)</small><table border="1" class="dataframe"><thead><tr><th>feature_name</th><th>importance_score</th><th>satisfaction_score_before</th><th>satisfaction_score_after</th></tr><tr><td>str</td><td>i64</td><td>i64</td><td>i64</td></tr></thead><tbody><tr><td>&quot;Feature1&quot;</td><td>8</td><td>7</td><td>9</td></tr><tr><td>&quot;Feature2&quot;</td><td>9</td><td>8</td><td>9</td></tr><tr><td>&quot;Feature3&quot;</td><td>7</td><td>9</td><td>8</td></tr><tr><td>&quot;Feature4&quot;</td><td>8</td><td>7</td><td>8</td></tr><tr><td>&quot;Feature5&quot;</td><td>6</td><td>6</td><td>8</td></tr><tr><td>&quot;Feature6&quot;</td><td>9</td><td>8</td><td>9</td></tr><tr><td>&quot;Feature7&quot;</td><td>7</td><td>9</td><td>8</td></tr><tr><td>&quot;Feature8&quot;</td><td>6</td><td>7</td><td>6</td></tr><tr><td>&quot;Feature9&quot;</td><td>9</td><td>8</td><td>8</td></tr><tr><td>&quot;Feature10&quot;</td><td>8</td><td>7</td><td>7</td></tr></tbody></table></div>




```python
data.with_columns(pl.col('*').forge_product_dev.customer_value_created(importance_col='importance_score'
                       ,satisfaction_after_col='satisfaction_score_after'
                       ,satisfaction_before_col='satisfaction_score_before'))

```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (10, 5)</small><table border="1" class="dataframe"><thead><tr><th>feature_name</th><th>importance_score</th><th>satisfaction_score_before</th><th>satisfaction_score_after</th><th>customer_value_created</th></tr><tr><td>str</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;Feature1&quot;</td><td>8</td><td>7</td><td>9</td><td>0.16</td></tr><tr><td>&quot;Feature2&quot;</td><td>9</td><td>8</td><td>9</td><td>0.09</td></tr><tr><td>&quot;Feature3&quot;</td><td>7</td><td>9</td><td>8</td><td>-0.07</td></tr><tr><td>&quot;Feature4&quot;</td><td>8</td><td>7</td><td>8</td><td>0.08</td></tr><tr><td>&quot;Feature5&quot;</td><td>6</td><td>6</td><td>8</td><td>0.12</td></tr><tr><td>&quot;Feature6&quot;</td><td>9</td><td>8</td><td>9</td><td>0.09</td></tr><tr><td>&quot;Feature7&quot;</td><td>7</td><td>9</td><td>8</td><td>-0.07</td></tr><tr><td>&quot;Feature8&quot;</td><td>6</td><td>7</td><td>6</td><td>-0.06</td></tr><tr><td>&quot;Feature9&quot;</td><td>9</td><td>8</td><td>8</td><td>0.0</td></tr><tr><td>&quot;Feature10&quot;</td><td>8</td><td>7</td><td>7</td><td>0.0</td></tr></tbody></table></div>



## Finance

The Finance module contains financial statement objects that you can call certain methods off of to get key financial metrics. You need to define these objects prior to running calcuations. 

### Financial Statement Objects


```python
from metric_forge import *

fs = import_financials(ticker='MAR',engine='yfinance')
fs
```


<h2>Income Statement</h2>



<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (5, 49)</small><table border="1" class="dataframe"><thead><tr><th>date</th><th>Tax Effect Of Unusual Items</th><th>Tax Rate For Calcs</th><th>Normalized EBITDA</th><th>Total Unusual Items</th><th>Total Unusual Items Excluding Goodwill</th><th>Net Income From Continuing Operation Net Minority Interest</th><th>Reconciled Depreciation</th><th>Reconciled Cost Of Revenue</th><th>EBITDA</th><th>EBIT</th><th>Net Interest Income</th><th>Interest Expense</th><th>Interest Income</th><th>Normalized Income</th><th>Net Income From Continuing And Discontinued Operation</th><th>Total Expenses</th><th>Total Operating Income As Reported</th><th>Diluted Average Shares</th><th>Basic Average Shares</th><th>Diluted EPS</th><th>Basic EPS</th><th>Diluted NI Availto Com Stockholders</th><th>Net Income Common Stockholders</th><th>Net Income</th><th>Net Income Including Noncontrolling Interests</th><th>Net Income Continuous Operations</th><th>Tax Provision</th><th>Pretax Income</th><th>Other Income Expense</th><th>Other Non Operating Income Expenses</th><th>Special Income Charges</th><th>Other Special Charges</th><th>Restructuring And Mergern Acquisition</th><th>Earnings From Equity Interest</th><th>Net Non Operating Interest Income Expense</th><th>Interest Expense Non Operating</th><th>Interest Income Non Operating</th><th>Operating Income</th><th>Operating Expense</th><th>Depreciation Amortization Depletion Income Statement</th><th>Depreciation And Amortization In Income Statement</th><th>Selling General And Administration</th><th>General And Administrative Expense</th><th>Other Gand A</th><th>Gross Profit</th><th>Cost Of Revenue</th><th>Total Revenue</th><th>Operating Revenue</th></tr><tr><td>str</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-12-31 00:00:00&quot;</td><td>-5.22e6</td><td>0.087</td><td>4.2800e9</td><td>-6e7</td><td>-6e7</td><td>3.0830e9</td><td>2.77e8</td><td>1.8501e10</td><td>4.2200e9</td><td>3.9430e9</td><td>-5.3500e8</td><td>5.65e8</td><td>3e7</td><td>3.1378e9</td><td>3.0830e9</td><td>1.9789e10</td><td>3.8640e9</td><td>3.029e8</td><td>3.015e8</td><td>10.18</td><td>10.23</td><td>3.0830e9</td><td>3.0830e9</td><td>3.0830e9</td><td>3.0830e9</td><td>3.0830e9</td><td>2.95e8</td><td>3.3780e9</td><td>-1.1e7</td><td>4e7</td><td>-6e7</td><td>null</td><td>6e7</td><td>9e6</td><td>-5.3500e8</td><td>5.65e8</td><td>3e7</td><td>3.9240e9</td><td>1.2000e9</td><td>1.89e8</td><td>1.89e8</td><td>1.0110e9</td><td>1.0110e9</td><td>1.0110e9</td><td>5.1240e9</td><td>1.8589e10</td><td>2.3713e10</td><td>6.3880e9</td></tr><tr><td>&quot;2022-12-31 00:00:00&quot;</td><td>-2.916e6</td><td>0.243</td><td>3.8110e9</td><td>-1.2e7</td><td>-1.2e7</td><td>2.3580e9</td><td>2.82e8</td><td>1.6126e10</td><td>3.7990e9</td><td>3.5170e9</td><td>-3.7700e8</td><td>4.03e8</td><td>2.6e7</td><td>2.3671e9</td><td>2.3580e9</td><td>1.7299e10</td><td>3.4620e9</td><td>3.258e8</td><td>3.244e8</td><td>7.24</td><td>7.27</td><td>2.3580e9</td><td>2.3580e9</td><td>2.3580e9</td><td>2.3580e9</td><td>2.3580e9</td><td>7.56e8</td><td>3.1140e9</td><td>1.7e7</td><td>1.1e7</td><td>-1.2e7</td><td>null</td><td>1.2e7</td><td>1.8e7</td><td>-3.7700e8</td><td>4.03e8</td><td>2.6e7</td><td>3.4740e9</td><td>1.0840e9</td><td>1.93e8</td><td>1.93e8</td><td>8.91e8</td><td>8.91e8</td><td>8.91e8</td><td>4.5580e9</td><td>1.6215e10</td><td>2.0773e10</td><td>5.4450e9</td></tr><tr><td>&quot;2021-12-31 00:00:00&quot;</td><td>-1.1696e7</td><td>0.068</td><td>2.0670e9</td><td>-1.7200e8</td><td>-1.7200e8</td><td>1.0990e9</td><td>2.95e8</td><td>1.0981e10</td><td>1.8950e9</td><td>1.6000e9</td><td>-3.9200e8</td><td>4.2e8</td><td>2.8e7</td><td>1.2593e9</td><td>1.0990e9</td><td>1.2099e10</td><td>1.7500e9</td><td>3.293e8</td><td>3.272e8</td><td>3.34</td><td>3.36</td><td>1.0990e9</td><td>1.0990e9</td><td>1.0990e9</td><td>1.0990e9</td><td>1.0990e9</td><td>8.1e7</td><td>1.1800e9</td><td>-1.8600e8</td><td>1e7</td><td>-1.7200e8</td><td>1.64e8</td><td>8e6</td><td>-2.4e7</td><td>-3.9200e8</td><td>4.2e8</td><td>2.8e7</td><td>1.7580e9</td><td>1.0430e9</td><td>2.2e8</td><td>2.2e8</td><td>8.23e8</td><td>8.23e8</td><td>8.23e8</td><td>2.8010e9</td><td>1.1056e10</td><td>1.3857e10</td><td>3.4900e9</td></tr><tr><td>&quot;2020-12-31 00:00:00&quot;</td><td>-7.209e7</td><td>0.27</td><td>7.24e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>4.78e8</td><td>8.9800e9</td><td>4.57e8</td><td>-2.1e7</td><td>-4.1800e8</td><td>4.45e8</td><td>2.7e7</td><td>-7.209e7</td><td>-2.6700e8</td><td>1.0220e10</td><td>8.4e7</td><td>3.258e8</td><td>3.258e8</td><td>-0.82</td><td>-0.82</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-1.9900e8</td><td>-4.6600e8</td><td>-3.9900e8</td><td>9e6</td><td>-2.6700e8</td><td>null</td><td>2.67e8</td><td>-1.4100e8</td><td>-4.1800e8</td><td>4.45e8</td><td>2.7e7</td><td>3.51e8</td><td>1.1080e9</td><td>3.46e8</td><td>3.46e8</td><td>7.62e8</td><td>7.62e8</td><td>7.62e8</td><td>1.4590e9</td><td>9.1120e9</td><td>1.0571e10</td><td>2.1190e9</td></tr><tr><td>&quot;2019-12-31 00:00:00&quot;</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>-1.5400e8</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td></tr></tbody></table></div>



<h2>Balance Sheet</h2>



<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (5, 69)</small><table border="1" class="dataframe"><thead><tr><th>date</th><th>Ordinary Shares Number</th><th>Share Issued</th><th>Net Debt</th><th>Total Debt</th><th>Tangible Book Value</th><th>Invested Capital</th><th>Working Capital</th><th>Net Tangible Assets</th><th>Capital Lease Obligations</th><th>Common Stock Equity</th><th>Total Capitalization</th><th>Total Equity Gross Minority Interest</th><th>Stockholders Equity</th><th>Gains Losses Not Affecting Retained Earnings</th><th>Other Equity Adjustments</th><th>Treasury Stock</th><th>Retained Earnings</th><th>Additional Paid In Capital</th><th>Capital Stock</th><th>Common Stock</th><th>Total Liabilities Net Minority Interest</th><th>Total Non Current Liabilities Net Minority Interest</th><th>Other Non Current Liabilities</th><th>Non Current Deferred Liabilities</th><th>Non Current Deferred Revenue</th><th>Non Current Deferred Taxes Liabilities</th><th>Long Term Debt And Capital Lease Obligation</th><th>Long Term Capital Lease Obligation</th><th>Long Term Debt</th><th>Current Liabilities</th><th>Other Current Liabilities</th><th>Current Debt And Capital Lease Obligation</th><th>Current Debt</th><th>Payables And Accrued Expenses</th><th>Current Accrued Expenses</th><th>Payables</th><th>Accounts Payable</th><th>Total Assets</th><th>Total Non Current Assets</th><th>Other Non Current Assets</th><th>Non Current Deferred Assets</th><th>Non Current Deferred Taxes Assets</th><th>Non Current Note Receivables</th><th>Investments And Advances</th><th>Long Term Equity Investment</th><th>Goodwill And Other Intangible Assets</th><th>Other Intangible Assets</th><th>Goodwill</th><th>Net PPE</th><th>Accumulated Depreciation</th><th>Gross PPE</th><th>Construction In Progress</th><th>Other Properties</th><th>Machinery Furniture Equipment</th><th>Buildings And Improvements</th><th>Land And Improvements</th><th>Properties</th><th>Current Assets</th><th>Other Current Assets</th><th>Assets Held For Sale Current</th><th>Prepaid Assets</th><th>Receivables</th><th>Accounts Receivable</th><th>Allowance For Doubtful Accounts Receivable</th><th>Gross Accounts Receivable</th><th>Cash Cash Equivalents And Short Term Investments</th><th>Cash And Cash Equivalents</th><th>Cash Financial</th></tr><tr><td>str</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-12-31 00:00:00&quot;</td><td>2.90539975e8</td><td>2.90539975e8</td><td>1.1535e10</td><td>1.2760e10</td><td>-1.8758e10</td><td>1.1191e10</td><td>-4.4510e9</td><td>-1.8758e10</td><td>8.87e8</td><td>-6.8200e8</td><td>1.0638e10</td><td>-6.8200e8</td><td>-6.8200e8</td><td>-6.4700e8</td><td>-6.4700e8</td><td>2.0929e10</td><td>1.4838e10</td><td>6.0510e9</td><td>5e6</td><td>5e6</td><td>2.6356e10</td><td>1.8594e10</td><td>5.1600e9</td><td>1.2270e9</td><td>1.0180e9</td><td>2.09e8</td><td>1.2207e10</td><td>8.87e8</td><td>1.1320e10</td><td>7.7620e9</td><td>3.3280e9</td><td>5.53e8</td><td>5.53e8</td><td>3.8810e9</td><td>3.1430e9</td><td>7.38e8</td><td>7.38e8</td><td>2.5674e10</td><td>2.2363e10</td><td>6.58e8</td><td>6.73e8</td><td>6.73e8</td><td>1.38e8</td><td>3.08e8</td><td>3.08e8</td><td>1.8076e10</td><td>9.1900e9</td><td>8.8860e9</td><td>2.5100e9</td><td>-8.9000e8</td><td>3.4000e9</td><td>7.2e7</td><td>9.29e8</td><td>6.22e8</td><td>1.1080e9</td><td>6.69e8</td><td>0.0</td><td>3.3110e9</td><td>2.61e8</td><td>null</td><td>null</td><td>2.7120e9</td><td>2.7120e9</td><td>-1.9700e8</td><td>2.9090e9</td><td>3.38e8</td><td>3.38e8</td><td>null</td></tr><tr><td>&quot;2022-12-31 00:00:00&quot;</td><td>3.106e8</td><td>3.106e8</td><td>9.5570e9</td><td>1.1098e10</td><td>-1.7051e10</td><td>1.0632e10</td><td>-4.0260e9</td><td>-1.7051e10</td><td>1.0340e9</td><td>5.68e8</td><td>9.9480e9</td><td>5.68e8</td><td>5.68e8</td><td>-7.2900e8</td><td>-7.2900e8</td><td>1.7015e10</td><td>1.2342e10</td><td>5.9650e9</td><td>5e6</td><td>5e6</td><td>2.4247e10</td><td>1.6908e10</td><td>5.1220e9</td><td>1.3720e9</td><td>1.0590e9</td><td>3.13e8</td><td>1.0414e10</td><td>1.0340e9</td><td>9.3800e9</td><td>7.3390e9</td><td>3.3140e9</td><td>6.84e8</td><td>6.84e8</td><td>3.3410e9</td><td>2.5950e9</td><td>7.46e8</td><td>7.46e8</td><td>2.4815e10</td><td>2.1502e10</td><td>5.84e8</td><td>2.4e8</td><td>2.4e8</td><td>1.52e8</td><td>3.35e8</td><td>3.35e8</td><td>1.7619e10</td><td>8.7470e9</td><td>8.8720e9</td><td>2.5720e9</td><td>-8.7400e8</td><td>3.4460e9</td><td>3.6e7</td><td>9.87e8</td><td>6.49e8</td><td>1.0860e9</td><td>6.88e8</td><td>0.0</td><td>3.3130e9</td><td>2.35e8</td><td>null</td><td>null</td><td>2.5710e9</td><td>2.5710e9</td><td>-1.9100e8</td><td>2.7620e9</td><td>5.07e8</td><td>5.07e8</td><td>null</td></tr><tr><td>&quot;2021-12-31 00:00:00&quot;</td><td>3.273e8</td><td>3.273e8</td><td>8.7450e9</td><td>1.1236e10</td><td>-1.6585e10</td><td>1.1552e10</td><td>-2.7810e9</td><td>-1.6585e10</td><td>1.0980e9</td><td>1.4140e9</td><td>1.0747e10</td><td>1.4140e9</td><td>1.4140e9</td><td>-3.4200e8</td><td>-3.4200e8</td><td>1.4446e10</td><td>1.0305e10</td><td>5.8920e9</td><td>5e6</td><td>5e6</td><td>2.4139e10</td><td>1.7732e10</td><td>5.9510e9</td><td>1.3500e9</td><td>1.1810e9</td><td>1.69e8</td><td>1.0431e10</td><td>1.0980e9</td><td>9.3330e9</td><td>6.4070e9</td><td>2.5220e9</td><td>8.05e8</td><td>8.05e8</td><td>3.0800e9</td><td>2.3540e9</td><td>7.26e8</td><td>7.26e8</td><td>2.5553e10</td><td>2.1927e10</td><td>6.04e8</td><td>2.28e8</td><td>2.28e8</td><td>1.44e8</td><td>3.87e8</td><td>3.87e8</td><td>1.7999e10</td><td>8.9260e9</td><td>9.0730e9</td><td>2.5650e9</td><td>-8.5000e8</td><td>3.4150e9</td><td>1.37e8</td><td>1.0620e9</td><td>5.45e8</td><td>9.85e8</td><td>6.86e8</td><td>0.0</td><td>3.6260e9</td><td>2.51e8</td><td>null</td><td>2.51e8</td><td>1.9820e9</td><td>1.9820e9</td><td>-1.8700e8</td><td>2.1690e9</td><td>1.3930e9</td><td>1.3930e9</td><td>null</td></tr><tr><td>&quot;2020-12-31 00:00:00&quot;</td><td>3.244e8</td><td>3.244e8</td><td>9.4990e9</td><td>1.1199e10</td><td>-1.7734e10</td><td>1.0806e10</td><td>-2.9270e9</td><td>-1.7734e10</td><td>8.23e8</td><td>4.3e8</td><td>9.6330e9</td><td>4.3e8</td><td>4.3e8</td><td>-1.3500e8</td><td>-1.3500e8</td><td>1.4497e10</td><td>9.2060e9</td><td>5.8510e9</td><td>5e6</td><td>5e6</td><td>2.4271e10</td><td>1.8519e10</td><td>6.8680e9</td><td>1.6250e9</td><td>1.5420e9</td><td>8.3e7</td><td>1.0026e10</td><td>8.23e8</td><td>9.2030e9</td><td>5.7520e9</td><td>1.7690e9</td><td>1.1730e9</td><td>1.1730e9</td><td>2.8100e9</td><td>2.2830e9</td><td>5.27e8</td><td>5.27e8</td><td>2.4701e10</td><td>2.1876e10</td><td>6.16e8</td><td>2.49e8</td><td>2.49e8</td><td>1.59e8</td><td>4.22e8</td><td>null</td><td>1.8164e10</td><td>8.9890e9</td><td>9.1750e9</td><td>2.2660e9</td><td>-8.8800e8</td><td>3.1540e9</td><td>2.9e7</td><td>7.52e8</td><td>6.4e8</td><td>1.0450e9</td><td>6.88e8</td><td>0.0</td><td>2.8250e9</td><td>1.8e8</td><td>8e6</td><td>1.8e8</td><td>1.7680e9</td><td>1.7680e9</td><td>null</td><td>null</td><td>8.77e8</td><td>8.77e8</td><td>null</td></tr><tr><td>&quot;2019-12-31 00:00:00&quot;</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>2.55e8</td><td>2.52e8</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>2.25e8</td></tr></tbody></table></div>



<h2>Cash Flow</h2>



<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (5, 44)</small><table border="1" class="dataframe"><thead><tr><th>date</th><th>Free Cash Flow</th><th>Repurchase Of Capital Stock</th><th>Repayment Of Debt</th><th>Issuance Of Debt</th><th>Issuance Of Capital Stock</th><th>Capital Expenditure</th><th>End Cash Position</th><th>Beginning Cash Position</th><th>Changes In Cash</th><th>Financing Cash Flow</th><th>Cash Flow From Continuing Financing Activities</th><th>Net Other Financing Charges</th><th>Cash Dividends Paid</th><th>Common Stock Dividend Paid</th><th>Net Common Stock Issuance</th><th>Common Stock Payments</th><th>Common Stock Issuance</th><th>Net Issuance Payments Of Debt</th><th>Net Short Term Debt Issuance</th><th>Net Long Term Debt Issuance</th><th>Long Term Debt Payments</th><th>Long Term Debt Issuance</th><th>Investing Cash Flow</th><th>Cash Flow From Continuing Investing Activities</th><th>Net Other Investing Changes</th><th>Net Business Purchase And Sale</th><th>Sale Of Business</th><th>Purchase Of Business</th><th>Net PPE Purchase And Sale</th><th>Sale Of PPE</th><th>Capital Expenditure Reported</th><th>Operating Cash Flow</th><th>Cash Flow From Continuing Operating Activities</th><th>Change In Working Capital</th><th>Other Non Cash Items</th><th>Stock Based Compensation</th><th>Deferred Tax</th><th>Deferred Income Tax</th><th>Depreciation Amortization Depletion</th><th>Depreciation And Amortization</th><th>Depreciation</th><th>Operating Gains Losses</th><th>Net Income From Continuing Operations</th></tr><tr><td>str</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-12-31 00:00:00&quot;</td><td>2.7180e9</td><td>-3.9530e9</td><td>-6.8400e8</td><td>1.9180e9</td><td>2.9e7</td><td>-4.5200e8</td><td>3.66e8</td><td>5.25e8</td><td>-1.5900e8</td><td>-2.8640e9</td><td>-2.8640e9</td><td>-1.3300e8</td><td>-5.8700e8</td><td>-5.8700e8</td><td>-3.9240e9</td><td>-3.9530e9</td><td>2.9e7</td><td>1.7800e9</td><td>5.46e8</td><td>1.2340e9</td><td>-6.8400e8</td><td>1.9180e9</td><td>-4.6500e8</td><td>-4.6500e8</td><td>1.7e7</td><td>-1.0100e8</td><td>null</td><td>-1.0100e8</td><td>7.1e7</td><td>7.1e7</td><td>-4.5200e8</td><td>3.1700e9</td><td>3.1700e9</td><td>6.9e7</td><td>1.48e8</td><td>2.05e8</td><td>-6.1200e8</td><td>-6.1200e8</td><td>2.77e8</td><td>2.77e8</td><td>2.77e8</td><td>null</td><td>3.0830e9</td></tr><tr><td>&quot;2022-12-31 00:00:00&quot;</td><td>2.0310e9</td><td>-2.5660e9</td><td>-8.0400e8</td><td>9.83e8</td><td>0.0</td><td>-3.3200e8</td><td>5.25e8</td><td>1.4210e9</td><td>-8.9600e8</td><td>-2.9620e9</td><td>-2.9620e9</td><td>-7.2e7</td><td>-3.2100e8</td><td>-3.2100e8</td><td>-2.5660e9</td><td>-2.5660e9</td><td>0.0</td><td>-3e6</td><td>-1.8200e8</td><td>1.79e8</td><td>-8.0400e8</td><td>9.83e8</td><td>-2.9700e8</td><td>-2.9700e8</td><td>3.4e7</td><td>0.0</td><td>null</td><td>0.0</td><td>1e6</td><td>1e6</td><td>-3.3200e8</td><td>2.3630e9</td><td>2.3630e9</td><td>-5.4200e8</td><td>-2.0700e8</td><td>1.92e8</td><td>2.8e8</td><td>2.8e8</td><td>2.82e8</td><td>2.82e8</td><td>2.82e8</td><td>null</td><td>2.3580e9</td></tr><tr><td>&quot;2021-12-31 00:00:00&quot;</td><td>9.94e8</td><td>0.0</td><td>-2.1740e9</td><td>1.7930e9</td><td>2e6</td><td>-1.8300e8</td><td>1.4210e9</td><td>8.94e8</td><td>5.27e8</td><td>-4.6300e8</td><td>-4.6300e8</td><td>-2.3400e8</td><td>0.0</td><td>0.0</td><td>2e6</td><td>0.0</td><td>2e6</td><td>-2.3100e8</td><td>1.5e8</td><td>-3.8100e8</td><td>-2.1740e9</td><td>1.7930e9</td><td>-1.8700e8</td><td>-1.8700e8</td><td>-1.6e7</td><td>0.0</td><td>null</td><td>0.0</td><td>1.2e7</td><td>1.2e7</td><td>-1.8300e8</td><td>1.1770e9</td><td>1.1770e9</td><td>1.1e8</td><td>-3.9200e8</td><td>1.82e8</td><td>-2.8100e8</td><td>-2.8100e8</td><td>2.95e8</td><td>2.95e8</td><td>2.95e8</td><td>1.64e8</td><td>1.0990e9</td></tr><tr><td>&quot;2020-12-31 00:00:00&quot;</td><td>1.5040e9</td><td>-1.5000e8</td><td>-1.8870e9</td><td>3.5610e9</td><td>0.0</td><td>-1.3500e8</td><td>8.94e8</td><td>2.53e8</td><td>6.41e8</td><td>-1.0330e9</td><td>-1.0330e9</td><td>-1.1100e8</td><td>-1.5600e8</td><td>-1.5600e8</td><td>-1.5000e8</td><td>-1.5000e8</td><td>0.0</td><td>-6.1600e8</td><td>-2.2900e9</td><td>1.6740e9</td><td>-1.8870e9</td><td>3.5610e9</td><td>3.5e7</td><td>3.5e7</td><td>-9e7</td><td>2.6e8</td><td>2.6e8</td><td>null</td><td>2.6e8</td><td>2.6e8</td><td>-1.3500e8</td><td>1.6390e9</td><td>1.6390e9</td><td>-2.8e7</td><td>1.7300e9</td><td>2.01e8</td><td>-4.7800e8</td><td>-4.7800e8</td><td>4.78e8</td><td>4.78e8</td><td>4.78e8</td><td>3e6</td><td>-2.6700e8</td></tr><tr><td>&quot;2019-12-31 00:00:00&quot;</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>3.95e8</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>-1.4700e8</td><td>null</td></tr></tbody></table></div>





    FinancialStatements(ticker=MAR)



### Income Statement


```python
import polars as pl

fs.income_statement.with_columns(pl.col('*').forge_income_statement.gross_profit_margin(revenue_column='Total Revenue',cogs_column='Cost Of Revenue'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (5, 50)</small><table border="1" class="dataframe"><thead><tr><th>date</th><th>Tax Effect Of Unusual Items</th><th>Tax Rate For Calcs</th><th>Normalized EBITDA</th><th>Total Unusual Items</th><th>Total Unusual Items Excluding Goodwill</th><th>Net Income From Continuing Operation Net Minority Interest</th><th>Reconciled Depreciation</th><th>Reconciled Cost Of Revenue</th><th>EBITDA</th><th>EBIT</th><th>Net Interest Income</th><th>Interest Expense</th><th>Interest Income</th><th>Normalized Income</th><th>Net Income From Continuing And Discontinued Operation</th><th>Total Expenses</th><th>Total Operating Income As Reported</th><th>Diluted Average Shares</th><th>Basic Average Shares</th><th>Diluted EPS</th><th>Basic EPS</th><th>Diluted NI Availto Com Stockholders</th><th>Net Income Common Stockholders</th><th>Net Income</th><th>Net Income Including Noncontrolling Interests</th><th>Net Income Continuous Operations</th><th>Tax Provision</th><th>Pretax Income</th><th>Other Income Expense</th><th>Other Non Operating Income Expenses</th><th>Special Income Charges</th><th>Other Special Charges</th><th>Restructuring And Mergern Acquisition</th><th>Earnings From Equity Interest</th><th>Net Non Operating Interest Income Expense</th><th>Interest Expense Non Operating</th><th>Interest Income Non Operating</th><th>Operating Income</th><th>Operating Expense</th><th>Depreciation Amortization Depletion Income Statement</th><th>Depreciation And Amortization In Income Statement</th><th>Selling General And Administration</th><th>General And Administrative Expense</th><th>Other Gand A</th><th>Gross Profit</th><th>Cost Of Revenue</th><th>Total Revenue</th><th>Operating Revenue</th><th>gross_profit_margin</th></tr><tr><td>str</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-12-31 00:00:00&quot;</td><td>-5.22e6</td><td>0.087</td><td>4.2800e9</td><td>-6e7</td><td>-6e7</td><td>3.0830e9</td><td>2.77e8</td><td>1.8501e10</td><td>4.2200e9</td><td>3.9430e9</td><td>-5.3500e8</td><td>5.65e8</td><td>3e7</td><td>3.1378e9</td><td>3.0830e9</td><td>1.9789e10</td><td>3.8640e9</td><td>3.029e8</td><td>3.015e8</td><td>10.18</td><td>10.23</td><td>3.0830e9</td><td>3.0830e9</td><td>3.0830e9</td><td>3.0830e9</td><td>3.0830e9</td><td>2.95e8</td><td>3.3780e9</td><td>-1.1e7</td><td>4e7</td><td>-6e7</td><td>null</td><td>6e7</td><td>9e6</td><td>-5.3500e8</td><td>5.65e8</td><td>3e7</td><td>3.9240e9</td><td>1.2000e9</td><td>1.89e8</td><td>1.89e8</td><td>1.0110e9</td><td>1.0110e9</td><td>1.0110e9</td><td>5.1240e9</td><td>1.8589e10</td><td>2.3713e10</td><td>6.3880e9</td><td>0.216084</td></tr><tr><td>&quot;2022-12-31 00:00:00&quot;</td><td>-2.916e6</td><td>0.243</td><td>3.8110e9</td><td>-1.2e7</td><td>-1.2e7</td><td>2.3580e9</td><td>2.82e8</td><td>1.6126e10</td><td>3.7990e9</td><td>3.5170e9</td><td>-3.7700e8</td><td>4.03e8</td><td>2.6e7</td><td>2.3671e9</td><td>2.3580e9</td><td>1.7299e10</td><td>3.4620e9</td><td>3.258e8</td><td>3.244e8</td><td>7.24</td><td>7.27</td><td>2.3580e9</td><td>2.3580e9</td><td>2.3580e9</td><td>2.3580e9</td><td>2.3580e9</td><td>7.56e8</td><td>3.1140e9</td><td>1.7e7</td><td>1.1e7</td><td>-1.2e7</td><td>null</td><td>1.2e7</td><td>1.8e7</td><td>-3.7700e8</td><td>4.03e8</td><td>2.6e7</td><td>3.4740e9</td><td>1.0840e9</td><td>1.93e8</td><td>1.93e8</td><td>8.91e8</td><td>8.91e8</td><td>8.91e8</td><td>4.5580e9</td><td>1.6215e10</td><td>2.0773e10</td><td>5.4450e9</td><td>0.219419</td></tr><tr><td>&quot;2021-12-31 00:00:00&quot;</td><td>-1.1696e7</td><td>0.068</td><td>2.0670e9</td><td>-1.7200e8</td><td>-1.7200e8</td><td>1.0990e9</td><td>2.95e8</td><td>1.0981e10</td><td>1.8950e9</td><td>1.6000e9</td><td>-3.9200e8</td><td>4.2e8</td><td>2.8e7</td><td>1.2593e9</td><td>1.0990e9</td><td>1.2099e10</td><td>1.7500e9</td><td>3.293e8</td><td>3.272e8</td><td>3.34</td><td>3.36</td><td>1.0990e9</td><td>1.0990e9</td><td>1.0990e9</td><td>1.0990e9</td><td>1.0990e9</td><td>8.1e7</td><td>1.1800e9</td><td>-1.8600e8</td><td>1e7</td><td>-1.7200e8</td><td>1.64e8</td><td>8e6</td><td>-2.4e7</td><td>-3.9200e8</td><td>4.2e8</td><td>2.8e7</td><td>1.7580e9</td><td>1.0430e9</td><td>2.2e8</td><td>2.2e8</td><td>8.23e8</td><td>8.23e8</td><td>8.23e8</td><td>2.8010e9</td><td>1.1056e10</td><td>1.3857e10</td><td>3.4900e9</td><td>0.202136</td></tr><tr><td>&quot;2020-12-31 00:00:00&quot;</td><td>-7.209e7</td><td>0.27</td><td>7.24e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>4.78e8</td><td>8.9800e9</td><td>4.57e8</td><td>-2.1e7</td><td>-4.1800e8</td><td>4.45e8</td><td>2.7e7</td><td>-7.209e7</td><td>-2.6700e8</td><td>1.0220e10</td><td>8.4e7</td><td>3.258e8</td><td>3.258e8</td><td>-0.82</td><td>-0.82</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-1.9900e8</td><td>-4.6600e8</td><td>-3.9900e8</td><td>9e6</td><td>-2.6700e8</td><td>null</td><td>2.67e8</td><td>-1.4100e8</td><td>-4.1800e8</td><td>4.45e8</td><td>2.7e7</td><td>3.51e8</td><td>1.1080e9</td><td>3.46e8</td><td>3.46e8</td><td>7.62e8</td><td>7.62e8</td><td>7.62e8</td><td>1.4590e9</td><td>9.1120e9</td><td>1.0571e10</td><td>2.1190e9</td><td>0.138019</td></tr><tr><td>&quot;2019-12-31 00:00:00&quot;</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>-1.5400e8</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td></tr></tbody></table></div>




```python
fs.income_statement.with_columns(pl.col('*').forge_income_statement.net_profit_margin(revenue_column='Total Revenue',cogs_column='Cost Of Revenue',expenses_column='Total Expenses'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (5, 50)</small><table border="1" class="dataframe"><thead><tr><th>date</th><th>Tax Effect Of Unusual Items</th><th>Tax Rate For Calcs</th><th>Normalized EBITDA</th><th>Total Unusual Items</th><th>Total Unusual Items Excluding Goodwill</th><th>Net Income From Continuing Operation Net Minority Interest</th><th>Reconciled Depreciation</th><th>Reconciled Cost Of Revenue</th><th>EBITDA</th><th>EBIT</th><th>Net Interest Income</th><th>Interest Expense</th><th>Interest Income</th><th>Normalized Income</th><th>Net Income From Continuing And Discontinued Operation</th><th>Total Expenses</th><th>Total Operating Income As Reported</th><th>Diluted Average Shares</th><th>Basic Average Shares</th><th>Diluted EPS</th><th>Basic EPS</th><th>Diluted NI Availto Com Stockholders</th><th>Net Income Common Stockholders</th><th>Net Income</th><th>Net Income Including Noncontrolling Interests</th><th>Net Income Continuous Operations</th><th>Tax Provision</th><th>Pretax Income</th><th>Other Income Expense</th><th>Other Non Operating Income Expenses</th><th>Special Income Charges</th><th>Other Special Charges</th><th>Restructuring And Mergern Acquisition</th><th>Earnings From Equity Interest</th><th>Net Non Operating Interest Income Expense</th><th>Interest Expense Non Operating</th><th>Interest Income Non Operating</th><th>Operating Income</th><th>Operating Expense</th><th>Depreciation Amortization Depletion Income Statement</th><th>Depreciation And Amortization In Income Statement</th><th>Selling General And Administration</th><th>General And Administrative Expense</th><th>Other Gand A</th><th>Gross Profit</th><th>Cost Of Revenue</th><th>Total Revenue</th><th>Operating Revenue</th><th>net_profit_margin</th></tr><tr><td>str</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td></tr></thead><tbody><tr><td>&quot;2023-12-31 00:00:00&quot;</td><td>-5.22e6</td><td>0.087</td><td>4.2800e9</td><td>-6e7</td><td>-6e7</td><td>3.0830e9</td><td>2.77e8</td><td>1.8501e10</td><td>4.2200e9</td><td>3.9430e9</td><td>-5.3500e8</td><td>5.65e8</td><td>3e7</td><td>3.1378e9</td><td>3.0830e9</td><td>1.9789e10</td><td>3.8640e9</td><td>3.029e8</td><td>3.015e8</td><td>10.18</td><td>10.23</td><td>3.0830e9</td><td>3.0830e9</td><td>3.0830e9</td><td>3.0830e9</td><td>3.0830e9</td><td>2.95e8</td><td>3.3780e9</td><td>-1.1e7</td><td>4e7</td><td>-6e7</td><td>null</td><td>6e7</td><td>9e6</td><td>-5.3500e8</td><td>5.65e8</td><td>3e7</td><td>3.9240e9</td><td>1.2000e9</td><td>1.89e8</td><td>1.89e8</td><td>1.0110e9</td><td>1.0110e9</td><td>1.0110e9</td><td>5.1240e9</td><td>1.8589e10</td><td>2.3713e10</td><td>6.3880e9</td><td>-0.618437</td></tr><tr><td>&quot;2022-12-31 00:00:00&quot;</td><td>-2.916e6</td><td>0.243</td><td>3.8110e9</td><td>-1.2e7</td><td>-1.2e7</td><td>2.3580e9</td><td>2.82e8</td><td>1.6126e10</td><td>3.7990e9</td><td>3.5170e9</td><td>-3.7700e8</td><td>4.03e8</td><td>2.6e7</td><td>2.3671e9</td><td>2.3580e9</td><td>1.7299e10</td><td>3.4620e9</td><td>3.258e8</td><td>3.244e8</td><td>7.24</td><td>7.27</td><td>2.3580e9</td><td>2.3580e9</td><td>2.3580e9</td><td>2.3580e9</td><td>2.3580e9</td><td>7.56e8</td><td>3.1140e9</td><td>1.7e7</td><td>1.1e7</td><td>-1.2e7</td><td>null</td><td>1.2e7</td><td>1.8e7</td><td>-3.7700e8</td><td>4.03e8</td><td>2.6e7</td><td>3.4740e9</td><td>1.0840e9</td><td>1.93e8</td><td>1.93e8</td><td>8.91e8</td><td>8.91e8</td><td>8.91e8</td><td>4.5580e9</td><td>1.6215e10</td><td>2.0773e10</td><td>5.4450e9</td><td>-0.613344</td></tr><tr><td>&quot;2021-12-31 00:00:00&quot;</td><td>-1.1696e7</td><td>0.068</td><td>2.0670e9</td><td>-1.7200e8</td><td>-1.7200e8</td><td>1.0990e9</td><td>2.95e8</td><td>1.0981e10</td><td>1.8950e9</td><td>1.6000e9</td><td>-3.9200e8</td><td>4.2e8</td><td>2.8e7</td><td>1.2593e9</td><td>1.0990e9</td><td>1.2099e10</td><td>1.7500e9</td><td>3.293e8</td><td>3.272e8</td><td>3.34</td><td>3.36</td><td>1.0990e9</td><td>1.0990e9</td><td>1.0990e9</td><td>1.0990e9</td><td>1.0990e9</td><td>8.1e7</td><td>1.1800e9</td><td>-1.8600e8</td><td>1e7</td><td>-1.7200e8</td><td>1.64e8</td><td>8e6</td><td>-2.4e7</td><td>-3.9200e8</td><td>4.2e8</td><td>2.8e7</td><td>1.7580e9</td><td>1.0430e9</td><td>2.2e8</td><td>2.2e8</td><td>8.23e8</td><td>8.23e8</td><td>8.23e8</td><td>2.8010e9</td><td>1.1056e10</td><td>1.3857e10</td><td>3.4900e9</td><td>-0.670997</td></tr><tr><td>&quot;2020-12-31 00:00:00&quot;</td><td>-7.209e7</td><td>0.27</td><td>7.24e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>4.78e8</td><td>8.9800e9</td><td>4.57e8</td><td>-2.1e7</td><td>-4.1800e8</td><td>4.45e8</td><td>2.7e7</td><td>-7.209e7</td><td>-2.6700e8</td><td>1.0220e10</td><td>8.4e7</td><td>3.258e8</td><td>3.258e8</td><td>-0.82</td><td>-0.82</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-2.6700e8</td><td>-1.9900e8</td><td>-4.6600e8</td><td>-3.9900e8</td><td>9e6</td><td>-2.6700e8</td><td>null</td><td>2.67e8</td><td>-1.4100e8</td><td>-4.1800e8</td><td>4.45e8</td><td>2.7e7</td><td>3.51e8</td><td>1.1080e9</td><td>3.46e8</td><td>3.46e8</td><td>7.62e8</td><td>7.62e8</td><td>7.62e8</td><td>1.4590e9</td><td>9.1120e9</td><td>1.0571e10</td><td>2.1190e9</td><td>-0.828777</td></tr><tr><td>&quot;2019-12-31 00:00:00&quot;</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>-1.5400e8</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td></tr></tbody></table></div>



## Mortgage

The Mortgage module contains mortgage objects that you enable you to assess mortgage metrics. You need to define these objects prior to running calcuations. 


```python
from metric_forge.mortgage import *

mortgage = Mortgage(principal=390000,annual_interest_rate=5.75,start_date='2023-09-01',term_years=30,extra_principal_payment=200)
mortgage.calculate_monthly_payment()

```




    2275.934140129842




```python
mortgage.generate_amortization_schedule()
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (360, 6)</small><table border="1" class="dataframe"><thead><tr><th>payment_number</th><th>payment_date</th><th>payment</th><th>interest_payment</th><th>principal_payment</th><th>principal_remaining</th></tr><tr><td>i64</td><td>str</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td></tr></thead><tbody><tr><td>1</td><td>&quot;2023-10-01&quot;</td><td>2275.93414</td><td>1868.75</td><td>407.18414</td><td>389592.81586</td></tr><tr><td>2</td><td>&quot;2023-10-31&quot;</td><td>2275.93414</td><td>1866.798909</td><td>409.135231</td><td>389183.680629</td></tr><tr><td>3</td><td>&quot;2023-11-30&quot;</td><td>2275.93414</td><td>1864.83847</td><td>411.09567</td><td>388772.584959</td></tr><tr><td>4</td><td>&quot;2023-12-30&quot;</td><td>2275.93414</td><td>1862.868636</td><td>413.065504</td><td>388359.519455</td></tr><tr><td>5</td><td>&quot;2024-01-29&quot;</td><td>2275.93414</td><td>1860.889364</td><td>415.044776</td><td>387944.474679</td></tr><tr><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td></tr><tr><td>356</td><td>&quot;2052-11-27&quot;</td><td>2275.93414</td><td>53.752435</td><td>2222.181705</td><td>8995.717798</td></tr><tr><td>357</td><td>&quot;2052-12-27&quot;</td><td>2275.93414</td><td>43.104481</td><td>2232.829659</td><td>6762.888139</td></tr><tr><td>358</td><td>&quot;2053-01-26&quot;</td><td>2275.93414</td><td>32.405506</td><td>2243.528634</td><td>4519.359505</td></tr><tr><td>359</td><td>&quot;2053-02-25&quot;</td><td>2275.93414</td><td>21.655264</td><td>2254.278876</td><td>2265.080629</td></tr><tr><td>360</td><td>&quot;2053-03-27&quot;</td><td>2275.93414</td><td>10.853511</td><td>2265.080629</td><td>1.2655e-8</td></tr></tbody></table></div>




```python
mortgage.calculate_principal_only_payment()
```




    {'new_term_years': 24.502707600761994, 'time_saved_years': 5.497292399238006}




```python
mortgage.refinance_assessment(RefinanceOption(new_loan_amount=340000,new_annual_interest_rate=5.25,new_term_years=30,associated_costs=5000))

```




    {'Old Monthly Payment': 2275.934140129842,
     'New Monthly Payment': 1877.492587282451,
     'Monthly Savings': 398.441552847391,
     'Break-Even Point (months)': 12.548891962367875,
     'Total Savings (over the loan term)': 138438.95902506076,
     'Should Refinance': True}



## Web Traffic


```python
from metric_forge.web_traffic import *
import polars as pl

data = pl.read_csv('datasets/web_traffic.csv')
data
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (4, 8)</small><table border="1" class="dataframe"><thead><tr><th>total_duration</th><th>total_sessions</th><th>single_page_sessions</th><th>num_clicks</th><th>num_impressions</th><th>total_cost</th><th>exits</th><th>total_page_views</th></tr><tr><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td></tr></thead><tbody><tr><td>1200</td><td>10</td><td>2</td><td>100</td><td>1000</td><td>50</td><td>5</td><td>50</td></tr><tr><td>1500</td><td>15</td><td>3</td><td>150</td><td>1500</td><td>75</td><td>7</td><td>70</td></tr><tr><td>60</td><td>2</td><td>1</td><td>0</td><td>0</td><td>0</td><td>2</td><td>20</td></tr><tr><td>2500</td><td>25</td><td>5</td><td>200</td><td>2000</td><td>100</td><td>10</td><td>100</td></tr></tbody></table></div>



### Average Session Duration


```python
data.with_columns(pl.col('*').forge_web_traffic.average_session_duration(total_duration_col='total_duration', total_sessions_col='total_sessions'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (4, 9)</small><table border="1" class="dataframe"><thead><tr><th>total_duration</th><th>total_sessions</th><th>single_page_sessions</th><th>num_clicks</th><th>num_impressions</th><th>total_cost</th><th>exits</th><th>total_page_views</th><th>average_session_duration</th></tr><tr><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>1200</td><td>10</td><td>2</td><td>100</td><td>1000</td><td>50</td><td>5</td><td>50</td><td>120.0</td></tr><tr><td>1500</td><td>15</td><td>3</td><td>150</td><td>1500</td><td>75</td><td>7</td><td>70</td><td>100.0</td></tr><tr><td>60</td><td>2</td><td>1</td><td>0</td><td>0</td><td>0</td><td>2</td><td>20</td><td>30.0</td></tr><tr><td>2500</td><td>25</td><td>5</td><td>200</td><td>2000</td><td>100</td><td>10</td><td>100</td><td>100.0</td></tr></tbody></table></div>



### Bounce Rate


```python
data.with_columns(pl.col('*').forge_web_traffic.bounce_rate(single_page_sessions_col='single_page_sessions', total_sessions_col='total_sessions'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (4, 9)</small><table border="1" class="dataframe"><thead><tr><th>total_duration</th><th>total_sessions</th><th>single_page_sessions</th><th>num_clicks</th><th>num_impressions</th><th>total_cost</th><th>exits</th><th>total_page_views</th><th>bounce_rate</th></tr><tr><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>1200</td><td>10</td><td>2</td><td>100</td><td>1000</td><td>50</td><td>5</td><td>50</td><td>20.0</td></tr><tr><td>1500</td><td>15</td><td>3</td><td>150</td><td>1500</td><td>75</td><td>7</td><td>70</td><td>20.0</td></tr><tr><td>60</td><td>2</td><td>1</td><td>0</td><td>0</td><td>0</td><td>2</td><td>20</td><td>50.0</td></tr><tr><td>2500</td><td>25</td><td>5</td><td>200</td><td>2000</td><td>100</td><td>10</td><td>100</td><td>20.0</td></tr></tbody></table></div>



### Click Through Rate


```python
data.with_columns(pl.col('*').forge_web_traffic.click_through_rate(num_clicks_col='num_clicks', num_impressions_col='num_impressions'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (4, 9)</small><table border="1" class="dataframe"><thead><tr><th>total_duration</th><th>total_sessions</th><th>single_page_sessions</th><th>num_clicks</th><th>num_impressions</th><th>total_cost</th><th>exits</th><th>total_page_views</th><th>click_through_rate</th></tr><tr><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>1200</td><td>10</td><td>2</td><td>100</td><td>1000</td><td>50</td><td>5</td><td>50</td><td>10.0</td></tr><tr><td>1500</td><td>15</td><td>3</td><td>150</td><td>1500</td><td>75</td><td>7</td><td>70</td><td>10.0</td></tr><tr><td>60</td><td>2</td><td>1</td><td>0</td><td>0</td><td>0</td><td>2</td><td>20</td><td>NaN</td></tr><tr><td>2500</td><td>25</td><td>5</td><td>200</td><td>2000</td><td>100</td><td>10</td><td>100</td><td>10.0</td></tr></tbody></table></div>



### Cost Per Click


```python
data.with_columns(pl.col('*').forge_web_traffic.cost_per_click(total_cost_col='total_cost',num_clicks_col='num_clicks'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (4, 9)</small><table border="1" class="dataframe"><thead><tr><th>total_duration</th><th>total_sessions</th><th>single_page_sessions</th><th>num_clicks</th><th>num_impressions</th><th>total_cost</th><th>exits</th><th>total_page_views</th><th>cost_per_click</th></tr><tr><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>1200</td><td>10</td><td>2</td><td>100</td><td>1000</td><td>50</td><td>5</td><td>50</td><td>0.5</td></tr><tr><td>1500</td><td>15</td><td>3</td><td>150</td><td>1500</td><td>75</td><td>7</td><td>70</td><td>0.5</td></tr><tr><td>60</td><td>2</td><td>1</td><td>0</td><td>0</td><td>0</td><td>2</td><td>20</td><td>0.0</td></tr><tr><td>2500</td><td>25</td><td>5</td><td>200</td><td>2000</td><td>100</td><td>10</td><td>100</td><td>0.5</td></tr></tbody></table></div>



### Exit Rate


```python
data.with_columns(pl.col('*').forge_web_traffic.exit_rate(exits_col='exits',total_page_views_col='total_page_views'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (4, 9)</small><table border="1" class="dataframe"><thead><tr><th>total_duration</th><th>total_sessions</th><th>single_page_sessions</th><th>num_clicks</th><th>num_impressions</th><th>total_cost</th><th>exits</th><th>total_page_views</th><th>exit_rate</th></tr><tr><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>1200</td><td>10</td><td>2</td><td>100</td><td>1000</td><td>50</td><td>5</td><td>50</td><td>10.0</td></tr><tr><td>1500</td><td>15</td><td>3</td><td>150</td><td>1500</td><td>75</td><td>7</td><td>70</td><td>10.0</td></tr><tr><td>60</td><td>2</td><td>1</td><td>0</td><td>0</td><td>0</td><td>2</td><td>20</td><td>10.0</td></tr><tr><td>2500</td><td>25</td><td>5</td><td>200</td><td>2000</td><td>100</td><td>10</td><td>100</td><td>10.0</td></tr></tbody></table></div>



### Pages Per Session


```python
data.with_columns(pl.col('*').forge_web_traffic.pages_per_session(total_page_views_col='total_page_views',total_sessions_col='total_sessions'))
```




<div><style>
.dataframe > thead > tr,
.dataframe > tbody > tr {
  text-align: right;
  white-space: pre-wrap;
}
</style>
<small>shape: (4, 9)</small><table border="1" class="dataframe"><thead><tr><th>total_duration</th><th>total_sessions</th><th>single_page_sessions</th><th>num_clicks</th><th>num_impressions</th><th>total_cost</th><th>exits</th><th>total_page_views</th><th>pages_per_session</th></tr><tr><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>i64</td><td>f64</td></tr></thead><tbody><tr><td>1200</td><td>10</td><td>2</td><td>100</td><td>1000</td><td>50</td><td>5</td><td>50</td><td>5.0</td></tr><tr><td>1500</td><td>15</td><td>3</td><td>150</td><td>1500</td><td>75</td><td>7</td><td>70</td><td>4.666667</td></tr><tr><td>60</td><td>2</td><td>1</td><td>0</td><td>0</td><td>0</td><td>2</td><td>20</td><td>10.0</td></tr><tr><td>2500</td><td>25</td><td>5</td><td>200</td><td>2000</td><td>100</td><td>10</td><td>100</td><td>4.0</td></tr></tbody></table></div>




```python

```
