# regtabletotext: helpers to print regression output as text
## What is regtabletotext?
This package is a collection of helper functions to print regression output of the Python packages `statsmodels`, `linearmodels`, and `arch` as text strings. The helpers are particularly useful for users who want to render regression output in [Quarto](https://quarto.org/) to HTML and PDF.
If you want to export your results to LaTeX or HTML, please check out [stargazer](https://pypi.org/project/stargazer/).
## How to install regtabletotext?
The package is available on [pypi.org/project/regtabletotext](https://pypi.org/project/regtabletotext/):
```
pip install regtabletotext
```
## How to use regtabletotext?
Currently supported model types:
- `statsmodels.regression.linear_model.RegressionResultsWrapper`
- `linearmodels.panel.results.PanelEffectsResults`
- `arch.univariate.base.ARCHModelResult`
### For statsmodels regression output
The following code chunk
```
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
from regtabletotext import prettify_result
n = 100
data = pd.DataFrame({
'age': np.random.randint(18, 65, n),
'income': np.random.normal(50, 20, n) ,
'education': np.random.randint(12, 22, n),
'hours_worked': np.random.randint(20, 60, n),
'satisfaction': np.random.randint(1, 11, n)
})
mod = smf.ols(formula='income ~ age + education + hours_worked', data=data)
res = mod.fit()
prettify_result(res)
```
returns this text
```
OLS Model:
Lottery ~ Literacy + Wealth + Region
Coefficients:
Estimate Std. Error Statistic p-Value
Intercept 38.652 9.456 4.087 0.000
Region[T.E] -15.428 9.727 -1.586 0.117
Region[T.N] -10.017 9.260 -1.082 0.283
Region[T.S] -4.548 7.279 -0.625 0.534
Region[T.W] -10.091 7.196 -1.402 0.165
Literacy -0.186 0.210 -0.886 0.378
Wealth 0.452 0.103 4.390 0.000
Summary statistics:
- Number of observations: 85
- R-squared: 0.338, Adjusted R-squared: 0.287
- F-statistic: 6.636 on 6 and 78 DF, p-value: 0.000
```
### For linearmodels regression output
This code chunk
```
import pandas as pd
import numpy as np
from linearmodels import PanelOLS
from regtabletotext import prettify_result
np.random.seed(42)
n_entities = 100
n_time_periods = 5
data = {
'entity': np.repeat(np.arange(n_entities), n_time_periods),
'time': np.tile(np.arange(n_time_periods), n_entities),
'y': np.random.randn(n_entities * n_time_periods),
'x1': np.random.randn(n_entities * n_time_periods),
'x2': np.random.randn(n_entities * n_time_periods)
}
df = pd.DataFrame(data)
df.set_index(['entity', 'time'], inplace=True)
formula = 'y ~ x1 + x2 + EntityEffects + TimeEffects'
model = PanelOLS.from_formula(formula, df)
result = model.fit()
prettify_result(result, options={'digits':2, 'include_residuals': True})
```
produces this output
```
Panel OLS Model:
y ~ x1 + x2 + EntityEffects + TimeEffects
Covariance Type: Unadjusted
Residuals:
Mean Std Min 25% 50% 75% Max
0.0 0.87 -2.7 -0.62 0.0 0.58 3.16
Coefficients:
Estimate Std. Error t-Statistic p-Value
x1 -0.06 0.05 -1.12 0.26
x2 -0.04 0.05 -0.80 0.42
Included Fixed Effects:
Total
Entity 100.0
Time 5.0
Summary statistics:
- Number of observations: 500
- R-squared (incl. FE): 0.21, Within R-squared: 0.01
- F-statistic: 1.05, p-value: 0.35
```
For multiple models, you can also use `prettify_result`:
```
formula = 'y ~ x1 + x2'
model = PanelOLS.from_formula(formula, df)
result1 = model.fit()
formula = 'y ~ x2 + EntityEffects'
model = PanelOLS.from_formula(formula, df)
result2 = model.fit()
formula = 'y ~ x1 + x2 + EntityEffects + TimeEffects'
model = PanelOLS.from_formula(formula, df)
result3 = model.fit()
results = [result1, result2, result3]
prettify_result(results)
```
The result is:
```
Dependent var. y y y
x1 -0.072 (-1.59) -0.058 (-1.12)
x2 -0.049 (-1.14) -0.049 (-0.98) -0.041 (-0.8)
Fixed effects Entity Entity, Time
VCOV type Unadjusted Unadjusted Unadjusted
Observations 500 500 500
R2 (incl. FE) 0.008 0.198 0.208
Within R2 0.006 0.002 0.006
```
### For arch estimation output
For arch estimations like these:
```
import datetime as dt
import pandas_datareader.data as web
from arch import arch_model
import arch.data.sp500
from regtabletotext import prettify_result
start = dt.datetime(1988, 1, 1)
end = dt.datetime(2018, 1, 1)
data = arch.data.sp500.load()
returns = 100 * data['Adj Close'].pct_change().dropna()
am_fit = arch_model(returns).fit(update_freq=5)
prettify_result(am_fit)
```
you get:
```
Constant Mean - GARCH Model Results
Mean Coefficients:
Estimate Std. Error Statistic p-Value
mu 0.056 0.011 4.906 0.0
Coefficients for GARCH(p: 1, q: 1):
Estimate Std. Error Statistic p-Value
omega 0.018 0.005 3.738 0.0
alpha[1] 0.102 0.013 7.852 0.0
beta[1] 0.885 0.014 64.125 0.0
Summary statistics:
- Number of observations: 5,030
- Distribution: Normal distribution
- Multiple R-squared: 0.000, Adjusted R-squared: 0.000
- BIC: 13,907.530, AIC: 13,881.437
```
# Version 0.0.12
- Added note that table contains t-statistics
- `prettify_result()` now passes lists to `prettify_results()`
# Version 0.0.11
- Replaced reporting of F-statistic nan with "F-statistic not available"
# Version 0.0.10
- Increased default `max_width` from 64 to 80
# Version 0.0.9
- Added support for list of `linearmodels.panel.result.PanelEffectsresult` results
# Version 0.0.8
- Added support for 'arch.univariate.base.ARCHModelResult'
- Simplified and extended `calculate_residuals_statistics()`
- Added covariance type and fixed effects table to `linearmodels.panel.result.PanelEffectsresult` print result
- Moved default values to function definitions
- Updated required install to pandas only
- Added support for `arch.univariate.base.ARCHModelResult`
# Version 0.0.7
- Moved type checks to functions and globals
- Removed unnecessary whitespace from model formula
- Introduced `max_width` with default to 64 characters
# Version 0.0.6
- Introduced check if 't' column is present, otherwise use 'z' column to handle models with only one coefficient
# Version 0.0.5
- Replaced explicit options by flexible `**options` parameter
- Supported classes: `statsmodels.regression.linear_model.RegressionResultsWrapper` and `linearmodels.panel.result.PanelEffectsresult`
- Introduced `ALLOWED_OPTIONS` global
# Version 0.0.4
- First working version with statsmodels support
Raw data
{
"_id": null,
"home_page": "https://github.com/christophscheuch/regtabletotext",
"name": "regtabletotext",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "Regression,Table,Formatting,Quarto,Text",
"author": "Christoph Scheuch",
"author_email": "christoph.scheuch@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/81/b3/e84a07cd8182494d34fe24a9fc254fdc9578aba48f83db4199445b376fd7/regtabletotext-0.0.12.tar.gz",
"platform": null,
"description": "# regtabletotext: helpers to print regression output as text\n\n## What is regtabletotext?\n\nThis package is a collection of helper functions to print regression output of the Python packages `statsmodels`, `linearmodels`, and `arch` as text strings. The helpers are particularly useful for users who want to render regression output in [Quarto](https://quarto.org/) to HTML and PDF.\n\nIf you want to export your results to LaTeX or HTML, please check out [stargazer](https://pypi.org/project/stargazer/).\n\n## How to install regtabletotext?\n\nThe package is available on [pypi.org/project/regtabletotext](https://pypi.org/project/regtabletotext/):\n\n```\npip install regtabletotext\n```\n\n## How to use regtabletotext?\n\nCurrently supported model types:\n\n- `statsmodels.regression.linear_model.RegressionResultsWrapper`\n- `linearmodels.panel.results.PanelEffectsResults`\n- `arch.univariate.base.ARCHModelResult`\n\n### For statsmodels regression output\n\nThe following code chunk\n```\nimport pandas as pd\nimport numpy as np\nimport statsmodels.formula.api as smf\nfrom regtabletotext import prettify_result\n\nn = 100 \ndata = pd.DataFrame({\n 'age': np.random.randint(18, 65, n),\n 'income': np.random.normal(50, 20, n) ,\n 'education': np.random.randint(12, 22, n),\n 'hours_worked': np.random.randint(20, 60, n),\n 'satisfaction': np.random.randint(1, 11, n) \n})\n\nmod = smf.ols(formula='income ~ age + education + hours_worked', data=data)\nres = mod.fit()\n\nprettify_result(res)\n```\n\nreturns this text\n```\nOLS Model:\nLottery ~ Literacy + Wealth + Region\n\nCoefficients:\n Estimate Std. Error Statistic p-Value\nIntercept 38.652 9.456 4.087 0.000\nRegion[T.E] -15.428 9.727 -1.586 0.117\nRegion[T.N] -10.017 9.260 -1.082 0.283\nRegion[T.S] -4.548 7.279 -0.625 0.534\nRegion[T.W] -10.091 7.196 -1.402 0.165\nLiteracy -0.186 0.210 -0.886 0.378\nWealth 0.452 0.103 4.390 0.000\n\nSummary statistics:\n- Number of observations: 85\n- R-squared: 0.338, Adjusted R-squared: 0.287\n- F-statistic: 6.636 on 6 and 78 DF, p-value: 0.000\n```\n\n### For linearmodels regression output\n\nThis code chunk\n```\nimport pandas as pd\nimport numpy as np\nfrom linearmodels import PanelOLS\nfrom regtabletotext import prettify_result\n\nnp.random.seed(42)\nn_entities = 100\nn_time_periods = 5\n\ndata = {\n 'entity': np.repeat(np.arange(n_entities), n_time_periods),\n 'time': np.tile(np.arange(n_time_periods), n_entities),\n 'y': np.random.randn(n_entities * n_time_periods),\n 'x1': np.random.randn(n_entities * n_time_periods),\n 'x2': np.random.randn(n_entities * n_time_periods)\n}\n\ndf = pd.DataFrame(data)\ndf.set_index(['entity', 'time'], inplace=True)\n\nformula = 'y ~ x1 + x2 + EntityEffects + TimeEffects'\nmodel = PanelOLS.from_formula(formula, df)\nresult = model.fit()\n\nprettify_result(result, options={'digits':2, 'include_residuals': True})\n```\nproduces this output\n```\nPanel OLS Model:\ny ~ x1 + x2 + EntityEffects + TimeEffects\n\nCovariance Type: Unadjusted\n\nResiduals:\n Mean Std Min 25% 50% 75% Max\n 0.0 0.87 -2.7 -0.62 0.0 0.58 3.16\n\nCoefficients:\n Estimate Std. Error t-Statistic p-Value\n\nx1 -0.06 0.05 -1.12 0.26\nx2 -0.04 0.05 -0.80 0.42\n\nIncluded Fixed Effects:\n Total\nEntity 100.0\nTime 5.0\n\nSummary statistics:\n- Number of observations: 500\n- R-squared (incl. FE): 0.21, Within R-squared: 0.01\n- F-statistic: 1.05, p-value: 0.35\n```\nFor multiple models, you can also use `prettify_result`:\n```\nformula = 'y ~ x1 + x2'\nmodel = PanelOLS.from_formula(formula, df)\nresult1 = model.fit()\n\nformula = 'y ~ x2 + EntityEffects'\nmodel = PanelOLS.from_formula(formula, df)\nresult2 = model.fit()\n\nformula = 'y ~ x1 + x2 + EntityEffects + TimeEffects'\nmodel = PanelOLS.from_formula(formula, df)\nresult3 = model.fit()\n\nresults = [result1, result2, result3]\n\nprettify_result(results)\n```\nThe result is:\n```\nDependent var. y y y\n\nx1 -0.072 (-1.59) -0.058 (-1.12)\nx2 -0.049 (-1.14) -0.049 (-0.98) -0.041 (-0.8)\n\nFixed effects Entity Entity, Time\nVCOV type Unadjusted Unadjusted Unadjusted\nObservations 500 500 500\nR2 (incl. FE) 0.008 0.198 0.208\nWithin R2 0.006 0.002 0.006\n```\n\n### For arch estimation output\n\nFor arch estimations like these:\n```\nimport datetime as dt\nimport pandas_datareader.data as web\nfrom arch import arch_model\nimport arch.data.sp500\nfrom regtabletotext import prettify_result\n\nstart = dt.datetime(1988, 1, 1)\nend = dt.datetime(2018, 1, 1)\ndata = arch.data.sp500.load()\nreturns = 100 * data['Adj Close'].pct_change().dropna()\nam_fit = arch_model(returns).fit(update_freq=5)\n\nprettify_result(am_fit)\n```\nyou get:\n```\nConstant Mean - GARCH Model Results\n\nMean Coefficients:\n Estimate Std. Error Statistic p-Value\nmu 0.056 0.011 4.906 0.0\n\nCoefficients for GARCH(p: 1, q: 1):\n Estimate Std. Error Statistic p-Value\nomega 0.018 0.005 3.738 0.0\nalpha[1] 0.102 0.013 7.852 0.0\nbeta[1] 0.885 0.014 64.125 0.0\n\nSummary statistics:\n- Number of observations: 5,030\n- Distribution: Normal distribution\n- Multiple R-squared: 0.000, Adjusted R-squared: 0.000\n- BIC: 13,907.530, AIC: 13,881.437\n```\n\n# Version 0.0.12\n- Added note that table contains t-statistics\n- `prettify_result()` now passes lists to `prettify_results()`\n\n# Version 0.0.11\n- Replaced reporting of F-statistic nan with \"F-statistic not available\"\n\n# Version 0.0.10\n- Increased default `max_width` from 64 to 80\n\n# Version 0.0.9\n- Added support for list of `linearmodels.panel.result.PanelEffectsresult` results \n\n# Version 0.0.8\n- Added support for 'arch.univariate.base.ARCHModelResult'\n- Simplified and extended `calculate_residuals_statistics()`\n- Added covariance type and fixed effects table to `linearmodels.panel.result.PanelEffectsresult` print result\n- Moved default values to function definitions\n- Updated required install to pandas only\n- Added support for `arch.univariate.base.ARCHModelResult`\n\n# Version 0.0.7\n- Moved type checks to functions and globals\n- Removed unnecessary whitespace from model formula\n- Introduced `max_width` with default to 64 characters \n\n# Version 0.0.6\n- Introduced check if 't' column is present, otherwise use 'z' column to handle models with only one coefficient\n\n# Version 0.0.5\n- Replaced explicit options by flexible `**options` parameter\n- Supported classes: `statsmodels.regression.linear_model.RegressionResultsWrapper` and `linearmodels.panel.result.PanelEffectsresult`\n- Introduced `ALLOWED_OPTIONS` global\n\n# Version 0.0.4\n- First working version with statsmodels support\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Helpers to print regression output as well-formated text",
"version": "0.0.12",
"project_urls": {
"Download": "https://pypi.org/project/regtabletotext/",
"Homepage": "https://github.com/christophscheuch/regtabletotext"
},
"split_keywords": [
"regression",
"table",
"formatting",
"quarto",
"text"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "75138bbc22000d1b46553220fea0ff27b36cbbfdb9306fe6d40251e5e313cf71",
"md5": "ff26d10456204226ff40975f71569c6e",
"sha256": "b6f7ef3c2101cd4b2d150eada5de599f4f8764ac5e03224f11b64b46f432d44e"
},
"downloads": -1,
"filename": "regtabletotext-0.0.12-py3-none-any.whl",
"has_sig": false,
"md5_digest": "ff26d10456204226ff40975f71569c6e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 9895,
"upload_time": "2023-12-19T08:38:26",
"upload_time_iso_8601": "2023-12-19T08:38:26.291255Z",
"url": "https://files.pythonhosted.org/packages/75/13/8bbc22000d1b46553220fea0ff27b36cbbfdb9306fe6d40251e5e313cf71/regtabletotext-0.0.12-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "81b3e84a07cd8182494d34fe24a9fc254fdc9578aba48f83db4199445b376fd7",
"md5": "3e527c8898db6aff144b08926410aa18",
"sha256": "e02268ef40c7a00d790c11f7fb18be9ca5b232fe57b599b59b60883baadba0f0"
},
"downloads": -1,
"filename": "regtabletotext-0.0.12.tar.gz",
"has_sig": false,
"md5_digest": "3e527c8898db6aff144b08926410aa18",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 2216855,
"upload_time": "2023-12-19T08:38:33",
"upload_time_iso_8601": "2023-12-19T08:38:33.722098Z",
"url": "https://files.pythonhosted.org/packages/81/b3/e84a07cd8182494d34fe24a9fc254fdc9578aba48f83db4199445b376fd7/regtabletotext-0.0.12.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-12-19 08:38:33",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "christophscheuch",
"github_project": "regtabletotext",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "regtabletotext"
}