EasyMCDM - Quick Installation methods
Install with PyPI
Once you have created your Python environment (Python 3.6+) you can simply type:
pip3 install EasyMCDM
Install with GitHub
Once you have created your Python environment (Python 3.6+) you can simply type:
git clone https://github.com/qanastek/EasyMCDM.git
cd EasyMCDM
pip3 install -r requirements.txt
pip3 install --editable .
Any modification made to the EasyMCDM package will be automatically interpreted as we installed it with the --editable flag.
Setup with Anaconda
conda create --name EasyMCDM python=3.6 -y
conda activate EasyMCDM
More information on managing environments with Anaconda can be found in the conda cheat sheet.
Try It
Data in tests/data/donnees.csv :
alfa_156,23817,201,8,39.6,6,378,31.2
audi_a4,25771,195,5.7,35.8,7,440,33
cit_xantia,25496,195,7.9,37,2,480,34
Promethee
from EasyMCDM.models.Promethee import Promethee
data = pd.read_csv('tests/data/donnees.csv', header=None).to_numpy()
# or
data = {
"alfa_156": [23817.0, 201.0, 8.0, 39.6, 6.0, 378.0, 31.2],
"audi_a4": [25771.0, 195.0, 5.7, 35.8, 7.0, 440.0, 33.0],
"cit_xantia": [25496.0, 195.0, 7.9, 37.0, 2.0, 480.0, 34.0]
}
weights = [0.14,0.14,0.14,0.14,0.14,0.14,0.14]
prefs = ["min","max","min","min","min","max","min"]
p = Promethee(data=data, verbose=False)
res = p.solve(weights=weights, prefs=prefs)
print(res)
Output :
{
'phi_negative': [('rnlt_safrane', 2.381), ('vw_passat', 2.9404), ('bmw_320d', 3.3603), ('saab_tid', 3.921), ('audi_a4', 4.34), ('cit_xantia', 4.48), ('rnlt_laguna', 5.04), ('alfa_156', 5.32), ('peugeot_406', 5.461), ('cit_xsara', 5.741)],
'phi_positive': [('rnlt_safrane', 6.301), ('vw_passat', 5.462), ('bmw_320d', 5.18), ('saab_tid', 4.76), ('audi_a4', 4.0605), ('cit_xantia', 3.921), ('rnlt_laguna', 3.6406), ('alfa_156', 3.501), ('peugeot_406', 3.08), ('cit_xsara', 3.08)],
'phi': [('rnlt_safrane', 3.92), ('vw_passat', 2.5214), ('bmw_320d', 1.8194), ('saab_tid', 0.839), ('audi_a4', -0.27936), ('cit_xantia', -0.5596), ('rnlt_laguna', -1.3995), ('alfa_156', -1.8194), ('peugeot_406', -2.381), ('cit_xsara', -2.661)],
'matrix': '...'
}
Electre Iv / Is
from EasyMCDM.models.Electre import Electre
data = {
"A1" : [80, 90, 600, 5.4, 8, 5],
"A2" : [65, 58, 200, 9.7, 1, 1],
"A3" : [83, 60, 400, 7.2, 4, 7],
"A4" : [40, 80, 1000, 7.5, 7, 10],
"A5" : [52, 72, 600, 2.0, 3, 8],
"A6" : [94, 96, 700, 3.6, 5, 6],
}
weights = [0.1, 0.2, 0.2, 0.1, 0.2, 0.2]
prefs = ["min", "max", "min", "min", "min", "max"]
vetoes = [45, 29, 550, 6, 4.5, 4.5]
indifference_threshold = 0.6
preference_thresholds = [20, 10, 200, 4, 2, 2] # or None for Electre Iv
e = Electre(data=data, verbose=False)
results = e.solve(weights, prefs, vetoes, indifference_threshold, preference_thresholds)
Output :
{'kernels': ['A4', 'A5']}
Pareto
from EasyMCDM.models.Pareto import Pareto
data = 'tests/data/donnees.csv'
# or
data = {
"alfa_156": [23817.0, 201.0, 8.0, 39.6, 6.0, 378.0, 31.2],
"audi_a4": [25771.0, 195.0, 5.7, 35.8, 7.0, 440.0, 33.0],
"cit_xantia": [25496.0, 195.0, 7.9, 37.0, 2.0, 480.0, 34.0]
}
p = Pareto(data=data, verbose=False)
res = p.solve(indexes=[0,1,6], prefs=["min","max","min"])
print(res)
Output :
{
'alfa_156': {'Weakly-dominated-by': [], 'Dominated-by': []},
'audi_a4': {'Weakly-dominated-by': ['alfa_156'], 'Dominated-by': ['alfa_156']},
'cit_xantia': {'Weakly-dominated-by': ['alfa_156', 'vw_passat'], 'Dominated-by': ['alfa_156']},
'peugeot_406': {'Weakly-dominated-by': ['alfa_156', 'cit_xantia', 'rnlt_laguna', 'vw_passat'], 'Dominated-by': ['alfa_156', 'cit_xantia', 'rnlt_laguna', 'vw_passat']},
'saab_tid': {'Weakly-dominated-by': ['alfa_156'], 'Dominated-by': ['alfa_156']},
'rnlt_laguna': {'Weakly-dominated-by': ['vw_passat'], 'Dominated-by': ['vw_passat']},
'vw_passat': {'Weakly-dominated-by': [], 'Dominated-by': []},
'bmw_320d': {'Weakly-dominated-by': [], 'Dominated-by': []},
'cit_xsara': {'Weakly-dominated-by': [], 'Dominated-by': []},
'rnlt_safrane': {'Weakly-dominated-by': ['bmw_320d'], 'Dominated-by': ['bmw_320d']}
}
Weighted Sum
from EasyMCDM.models.WeightedSum import WeightedSum
data = 'tests/data/donnees.csv'
# or
data = {
"alfa_156": [23817.0, 201.0, 8.0, 39.6, 6.0, 378.0, 31.2],
"audi_a4": [25771.0, 195.0, 5.7, 35.8, 7.0, 440.0, 33.0],
"cit_xantia": [25496.0, 195.0, 7.9, 37.0, 2.0, 480.0, 34.0]
}
p = WeightedSum(data=data, verbose=False)
res = p.solve(pref_indexes=[0,1,6],prefs=["min","max","min"], weights=[0.001,2,3], target='min')
print(res)
Output :
[(1, 'bmw_320d', -299.04), (2, 'alfa_156', -284.58299999999997), (3, 'rnlt_safrane', -280.84), (4, 'saab_tid', -275.817), (5, 'vw_passat', -265.856), (6, 'audi_a4', -265.229), (7, 'rnlt_laguna', -262.93600000000004), (8, 'cit_xantia', -262.504), (9, 'peugeot_406', -252.551), (10, 'cit_xsara', -244.416)]
Instant-Runoff Multicriteria Optimization (IRMO)
Short description : Eliminate the worst individual for each criteria, until we reach the last one and select the best one.
from EasyMCDM.models.Irmo import Irmo
p = Irmo(data="data/donnees.csv", verbose=False)
res = p.solve(
indexes=[0,1,4,5], # price -> max_speed -> comfort -> trunk_space
prefs=["min","max","min","max"]
)
print(res)
Output :
{'best': 'saab_tid'}
List of methods available
- Promethee I
- Promethee II
- Electre Iv
- Electre Is
- Weighted Sum
- Pareto
- Instant-Runoff Multicriteria Optimization (IRMO)
Build PyPi package
Build: python setup.py sdist bdist_wheel
Upload: twine upload dist/*
Citation
If you want to cite the tool you can use this:
@misc{EasyMCDM,
title={EasyMCDM},
author={Yanis Labrak, Quentin Raymondaud, Philippe Turcotte},
publisher={GitHub},
journal={GitHub repository},
howpublished={\url{https://github.com/qanastek/EasyMCDM}},
year={2022}
}
Metadata
Release files for EasyMCDM 0.5.13
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| EasyMCDM-0.5.13.tar.gz | 11.5 kB | Without provenance | Details for EasyMCDM-0.5.13.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| EasyMCDM-0.5.13-py3-none-any.whl | Python 3 | none | any | Details for EasyMCDM-0.5.13-py3-none-any.whl |
Total release size: 26.6 kB
Release files / EasyMCDM-0.5.13.tar.gz
| Download URL | EasyMCDM-0.5.13.tar.gz |
|---|---|
| Size | 11.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7d1817a57e41c33211161ced53d9546f9220809f3405cf59bcff5c80b90e2cc3
|
|
BLAKE2b-256 checksum How to use checksums |
aa9c806661a205170864912d0a4765f0b78f39149530a6b00230a0bcb932bf4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.2.0 pkginfo/1.6.0 requests/2.22.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.8.10
|
Release files / EasyMCDM-0.5.13-py3-none-any.whl
| Download URL | EasyMCDM-0.5.13-py3-none-any.whl |
|---|---|
| Size | 15.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
85de4326ca429b8421f41d49fc73b469a15196e13d34523bf2d7021b5e3c6068
|
|
BLAKE2b-256 checksum How to use checksums |
6baa30f46416bb0c59c9b8a8328e6327d8aed87b1eab24166b3455b1bbbef08e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.2.0 pkginfo/1.6.0 requests/2.22.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.8.10
|
Security for EasyMCDM 0.5.13
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.