# opendea
[](LICENSE)
[](https://www.python.org/)
**Data Envelopment Analysis (DEA)** in Python — simple, robust, and extensible, built on **SciPy**.
Includes **CCR (CRS)** and **BCC (VRS)** models, **super-efficiency**, **additive model**,
as well as modules for **NDEA (two-stage networks)** and **Dynamic DEA with carry-overs**.
⚠️ **Note**: The **SBM (Slack-Based Measure, Tone 2001)** is **included in the code but inactive** in version `0.1.0`.
It will be available in a future release (`0.2.0`).
---
## 📦 Installation
### User (pip)
```bash
pip install opendea # core only
pip install opendea[viz] # core + plotting (matplotlib, seaborn)
pip install opendea[full] # everything: plotting + notebooks + dev tools
```
### Development
```bash
git clone https://github.com/yourusername/opendea.git
cd opendea
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev,viz]"
```
---
## ⚡ Quickstart
```python
import pandas as pd
from opendea import dea_ccr_input, dea_bcc_output
from opendea.plotting import plot_efficiency
df = pd.DataFrame({
"x1": [4, 2, 3, 5],
"x2": [2, 1, 1, 3],
"y1": [1, 1, 1, 2],
}, index=["A","B","C","D"])
# CCR (CRS) input-oriented
res_ccr_in = dea_ccr_input(df, inputs=["x1","x2"], outputs=["y1"])
print(res_ccr_in[["efficiency"]])
# BCC (VRS) output-oriented
res_bcc_out = dea_bcc_output(df, inputs=["x1","x2"], outputs=["y1"])
print(res_bcc_out[["phi"]])
# Plot efficiencies
plot_efficiency(res_ccr_in, title="CCR Efficiency")
```
---
## 🧰 Main API
### Classical models
- `dea_ccr_input(df, inputs, outputs)`
- `dea_bcc_input(df, inputs, outputs)`
- `dea_ccr_output(df, inputs, outputs)`
- `dea_bcc_output(df, inputs, outputs)`
### Extensions
- `super_eff_ccr_input(df, inputs, outputs)`
- `super_eff_ccr_output(df, inputs, outputs)`
- `dea_additive_ccr(df, inputs, outputs)`
- `dea_additive_bcc(df, inputs, outputs)`
- ~~`dea_sbm_input(df, inputs, outputs, vrs=True)`~~ 🚫 *inactive in v0.1.0*
### Advanced
- `ndea_two_stage_input(df, inputs_stage1, link_m, outputs_stage2, vrs=True)`
- `dynamic_dea_input(panels, inputs, outputs, carryovers, vrs=True)`
### Utilities
- `projections(df, inputs, outputs, result, orientation="input"|"output")`
- `peers_from_lambdas(result)`
---
## 🧠 Conventions (summary)
- **Input-oriented**: minimize θ
Projections: `x* = θ·x0 − s−` ; `y* = y0 + s+`
- **Output-oriented**: maximize φ
Projections: `x* = x0 − s−` ; `y* = φ·y0 + s+`
- **SBM (ρ)**: 0–1, average proportional reduction in inputs.
- **Results** return a `DataFrame` (or `DEAResult` in typed API) with columns:
- `efficiency` (θ) or `phi` (φ) or `rho` (SBM)
- `lambda_*` (intensities)
- `s_minus_*`, `s_plus_*` (slacks)
---
## 🔬 Advanced examples
### NDEA (two-stage in series)
```python
from opendea import ndea_two_stage_input
df_net = pd.DataFrame({
"x1":[4,2,3,5], "x2":[2,1,1,3],
"m1":[3,2,2,4], # link Stage1->Stage2
"y1":[1,1,1,2],
}, index=list("ABCD"))
res_net = ndea_two_stage_input(df_net, ["x1","x2"], ["m1"], ["y1"], vrs=True)
print(res_net[["efficiency"]])
```
### Dynamic DEA with carry-overs
```python
from opendea import dynamic_dea_input
panels = {
1: pd.DataFrame({"x1":[5,3,4], "y1":[1,1,2], "k1":[2,1,1]}, index=["A","B","C"]),
2: pd.DataFrame({"x1":[4,3,3], "y1":[2,1,2], "k1":[2,1,1]}, index=["A","B","C"]),
}
dyn = dynamic_dea_input(panels, inputs=["x1"], outputs=["y1"], carryovers=["k1"], vrs=True)
for t, df_t in dyn.items():
print(t, df_t[["efficiency"]])
```
---
## 🗺️ Roadmap
- Cross-efficiency (benevolent/aggressive)
- Window analysis (sliding windows)
- Malmquist TFP
- Multiplier (dual) models and Assurance Region I/II
- Extended NDEA / Dynamic (network-SBM, dynamic-SBM)
- Directional distance functions (DDF), robust/stochastic DEA, sensitivity analysis
---
## 🧪 Tests
```bash
pytest -q
```
---
## 🤝 Contributing
- PRs are welcome!
- Run `ruff` + `black` before submitting.
- Always add tests.
---
## 📄 License
MIT — see `LICENSE`.
Raw data
{
"_id": null,
"home_page": null,
"name": "opendea-allys",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "DEA, Data Envelopment Analysis, CCR, BCC, efici\u00eancia, benchmarking, produtividade",
"author": null,
"author_email": "Allyson Aires <allysonaires@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/e2/4e/4bca3c93f6d1393d422e88dab4d7139ad0ad4beb8689e64f3d66c63d0031/opendea_allys-0.1.1.tar.gz",
"platform": null,
"description": "# opendea\r\n\r\n[](LICENSE)\r\n[](https://www.python.org/)\r\n\r\n**Data Envelopment Analysis (DEA)** in Python \u2014 simple, robust, and extensible, built on **SciPy**. \r\nIncludes **CCR (CRS)** and **BCC (VRS)** models, **super-efficiency**, **additive model**, \r\nas well as modules for **NDEA (two-stage networks)** and **Dynamic DEA with carry-overs**. \r\n\r\n\u26a0\ufe0f **Note**: The **SBM (Slack-Based Measure, Tone 2001)** is **included in the code but inactive** in version `0.1.0`. \r\nIt will be available in a future release (`0.2.0`).\r\n\r\n---\r\n\r\n## \ud83d\udce6 Installation\r\n\r\n### User (pip)\r\n```bash\r\npip install opendea # core only\r\npip install opendea[viz] # core + plotting (matplotlib, seaborn)\r\npip install opendea[full] # everything: plotting + notebooks + dev tools\r\n\r\n```\r\n\r\n### Development\r\n```bash\r\ngit clone https://github.com/yourusername/opendea.git\r\ncd opendea\r\npython -m venv .venv && source .venv/bin/activate\r\npip install -e \".[dev,viz]\"\r\n\r\n```\r\n\r\n---\r\n\r\n## \u26a1 Quickstart\r\n\r\n```python\r\nimport pandas as pd\r\nfrom opendea import dea_ccr_input, dea_bcc_output\r\nfrom opendea.plotting import plot_efficiency\r\n\r\ndf = pd.DataFrame({\r\n \"x1\": [4, 2, 3, 5],\r\n \"x2\": [2, 1, 1, 3],\r\n \"y1\": [1, 1, 1, 2],\r\n}, index=[\"A\",\"B\",\"C\",\"D\"])\r\n\r\n# CCR (CRS) input-oriented\r\nres_ccr_in = dea_ccr_input(df, inputs=[\"x1\",\"x2\"], outputs=[\"y1\"])\r\nprint(res_ccr_in[[\"efficiency\"]])\r\n\r\n# BCC (VRS) output-oriented\r\nres_bcc_out = dea_bcc_output(df, inputs=[\"x1\",\"x2\"], outputs=[\"y1\"])\r\nprint(res_bcc_out[[\"phi\"]])\r\n\r\n# Plot efficiencies\r\nplot_efficiency(res_ccr_in, title=\"CCR Efficiency\")\r\n```\r\n\r\n---\r\n\r\n## \ud83e\uddf0 Main API\r\n\r\n### Classical models\r\n- `dea_ccr_input(df, inputs, outputs)`\r\n- `dea_bcc_input(df, inputs, outputs)`\r\n- `dea_ccr_output(df, inputs, outputs)`\r\n- `dea_bcc_output(df, inputs, outputs)`\r\n\r\n### Extensions\r\n- `super_eff_ccr_input(df, inputs, outputs)`\r\n- `super_eff_ccr_output(df, inputs, outputs)`\r\n- `dea_additive_ccr(df, inputs, outputs)`\r\n- `dea_additive_bcc(df, inputs, outputs)`\r\n- ~~`dea_sbm_input(df, inputs, outputs, vrs=True)`~~ \ud83d\udeab *inactive in v0.1.0*\r\n\r\n### Advanced\r\n- `ndea_two_stage_input(df, inputs_stage1, link_m, outputs_stage2, vrs=True)`\r\n- `dynamic_dea_input(panels, inputs, outputs, carryovers, vrs=True)`\r\n\r\n### Utilities\r\n- `projections(df, inputs, outputs, result, orientation=\"input\"|\"output\")`\r\n- `peers_from_lambdas(result)`\r\n\r\n---\r\n\r\n## \ud83e\udde0 Conventions (summary)\r\n\r\n- **Input-oriented**: minimize \u03b8 \r\n Projections: `x* = \u03b8\u00b7x0 \u2212 s\u2212` ; `y* = y0 + s+`\r\n- **Output-oriented**: maximize \u03c6 \r\n Projections: `x* = x0 \u2212 s\u2212` ; `y* = \u03c6\u00b7y0 + s+`\r\n- **SBM (\u03c1)**: 0\u20131, average proportional reduction in inputs.\r\n- **Results** return a `DataFrame` (or `DEAResult` in typed API) with columns:\r\n - `efficiency` (\u03b8) or `phi` (\u03c6) or `rho` (SBM) \r\n - `lambda_*` (intensities) \r\n - `s_minus_*`, `s_plus_*` (slacks)\r\n\r\n---\r\n\r\n## \ud83d\udd2c Advanced examples\r\n\r\n### NDEA (two-stage in series)\r\n```python\r\nfrom opendea import ndea_two_stage_input\r\ndf_net = pd.DataFrame({\r\n \"x1\":[4,2,3,5], \"x2\":[2,1,1,3],\r\n \"m1\":[3,2,2,4], # link Stage1->Stage2\r\n \"y1\":[1,1,1,2],\r\n}, index=list(\"ABCD\"))\r\nres_net = ndea_two_stage_input(df_net, [\"x1\",\"x2\"], [\"m1\"], [\"y1\"], vrs=True)\r\nprint(res_net[[\"efficiency\"]])\r\n```\r\n\r\n### Dynamic DEA with carry-overs\r\n```python\r\nfrom opendea import dynamic_dea_input\r\npanels = {\r\n 1: pd.DataFrame({\"x1\":[5,3,4], \"y1\":[1,1,2], \"k1\":[2,1,1]}, index=[\"A\",\"B\",\"C\"]),\r\n 2: pd.DataFrame({\"x1\":[4,3,3], \"y1\":[2,1,2], \"k1\":[2,1,1]}, index=[\"A\",\"B\",\"C\"]),\r\n}\r\ndyn = dynamic_dea_input(panels, inputs=[\"x1\"], outputs=[\"y1\"], carryovers=[\"k1\"], vrs=True)\r\nfor t, df_t in dyn.items():\r\n print(t, df_t[[\"efficiency\"]])\r\n```\r\n\r\n---\r\n\r\n## \ud83d\uddfa\ufe0f Roadmap\r\n\r\n- Cross-efficiency (benevolent/aggressive) \r\n- Window analysis (sliding windows) \r\n- Malmquist TFP \r\n- Multiplier (dual) models and Assurance Region I/II \r\n- Extended NDEA / Dynamic (network-SBM, dynamic-SBM) \r\n- Directional distance functions (DDF), robust/stochastic DEA, sensitivity analysis\r\n\r\n---\r\n\r\n## \ud83e\uddea Tests\r\n\r\n```bash\r\npytest -q\r\n```\r\n\r\n---\r\n\r\n## \ud83e\udd1d Contributing\r\n\r\n- PRs are welcome! \r\n- Run `ruff` + `black` before submitting. \r\n- Always add tests.\r\n\r\n---\r\n\r\n## \ud83d\udcc4 License\r\n\r\nMIT \u2014 see `LICENSE`.\r\n",
"bugtrack_url": null,
"license": null,
"summary": "An\u00e1lise Envolt\u00f3ria de Dados (DEA) simples, robusta e extens\u00edvel em Python.",
"version": "0.1.1",
"project_urls": {
"Homepage": "https://github.com/trojanorte/OpenDEA",
"Issues": "https://github.com/trojanorte/OpenDEA"
},
"split_keywords": [
"dea",
" data envelopment analysis",
" ccr",
" bcc",
" efici\u00eancia",
" benchmarking",
" produtividade"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "3053593a1dc8f8bb7b27fdff92147bdda41689c772dc20aeb38e0d7af39a3a88",
"md5": "1b26e9c1e28e29bfd6c84c230f5ca36f",
"sha256": "eba9f6e6c285cdcf28c3aec761812670f0161f800e58fe58c2fe3c1aedfd8bfa"
},
"downloads": -1,
"filename": "opendea_allys-0.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1b26e9c1e28e29bfd6c84c230f5ca36f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 23607,
"upload_time": "2025-08-27T04:20:53",
"upload_time_iso_8601": "2025-08-27T04:20:53.587612Z",
"url": "https://files.pythonhosted.org/packages/30/53/593a1dc8f8bb7b27fdff92147bdda41689c772dc20aeb38e0d7af39a3a88/opendea_allys-0.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e24e4bca3c93f6d1393d422e88dab4d7139ad0ad4beb8689e64f3d66c63d0031",
"md5": "07727c5f8c13d84a2a4735252129cd0e",
"sha256": "e80abab0f6b521771b44ffd17b8f25945708811f89a879e2d30b428b5ce3b1e6"
},
"downloads": -1,
"filename": "opendea_allys-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "07727c5f8c13d84a2a4735252129cd0e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 23401,
"upload_time": "2025-08-27T04:20:54",
"upload_time_iso_8601": "2025-08-27T04:20:54.815080Z",
"url": "https://files.pythonhosted.org/packages/e2/4e/4bca3c93f6d1393d422e88dab4d7139ad0ad4beb8689e64f3d66c63d0031/opendea_allys-0.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-27 04:20:54",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "trojanorte",
"github_project": "OpenDEA",
"github_not_found": true,
"lcname": "opendea-allys"
}