Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Corrige la comparaison entre un array et un nombre #1367

Merged
merged 2 commits into from
Aug 1, 2019
Merged

Corrige la comparaison entre un array et un nombre #1367

merged 2 commits into from
Aug 1, 2019

Conversation

cbenz
Copy link
Member

@cbenz cbenz commented Jul 22, 2019

  • Correction d'un crash
  • Zones impactées : openfisca_france/model/prelevements_obligatoires/taxe_habitation/taxe_habitation.py.

Avec le test suivant :

from openfisca_core import periods
from openfisca_core.simulation_builder import SimulationBuilder

from openfisca_france import FranceTaxBenefitSystem

tax_benefit_system = FranceTaxBenefitSystem()

COUNT = 100
MIN = 0
MAX = 100000
PERIOD = 2018


test_case = {
    "individus": {
        "Michel": {
            'date_naissance': {'ETERNITY': '1980-01-01'},
        },
    },
    "familles": {
        "famille_1": {
            "parents": ["Michel"]
        }
    },
    "foyers_fiscaux": {
        "foyer_fiscal_1": {
            "declarants": ["Michel"],
        },
    },
    "menages": {
        "menage_1": {
            "personne_de_reference": ["Michel"],
        }},
    "axes": [[
        {
            "name": 'salaire_de_base',
            "count": COUNT,
            "min": MIN,
            "max": MAX,
            "period": PERIOD,
        },
    ]],
}

simulation_builder = SimulationBuilder()
simulation = simulation_builder.build_from_entities(tax_benefit_system, test_case)

revenu_disponible = simulation.calculate("revenu_disponible", PERIOD)

print(revenu_disponible)

J'obtiens l'erreur suivante :

Traceback (most recent call last):
  File "test.py", line 48, in <module>
    revenu_disponible = simulation.calculate("revenu_disponible", PERIOD)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 111, in calculate
    result = self._calculate(variable_name, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 141, in _calculate
    array = self._run_formula(variable, population, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 247, in _run_formula
    array = formula(population, period, parameters_at)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_france/model/mesures.py", line 63, in formula
    impots_directs = menage('impots_directs', period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/populations.py", line 101, in __call__
    return self.simulation.calculate(variable_name, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 111, in calculate
    result = self._calculate(variable_name, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 141, in _calculate
    array = self._run_formula(variable, population, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 247, in _run_formula
    array = formula(population, period, parameters_at)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_france/model/mesures.py", line 599, in formula
    taxe_habitation = menage('taxe_habitation', period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/populations.py", line 101, in __call__
    return self.simulation.calculate(variable_name, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 111, in calculate
    result = self._calculate(variable_name, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 141, in _calculate
    array = self._run_formula(variable, population, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 245, in _run_formula
    array = formula(population, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_france/model/prelevements_obligatoires/taxe_habitation/taxe_habitation.py", line 405, in formula_2017_01_01
    taxe_habitation_commune_epci_apres_degrevement_plafonnement = menage('taxe_habitation_commune_epci_apres_degrevement_plafonnement', period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/populations.py", line 101, in __call__
    return self.simulation.calculate(variable_name, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 111, in calculate
    result = self._calculate(variable_name, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 141, in _calculate
    array = self._run_formula(variable, population, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 247, in _run_formula
    array = formula(population, period, parameters_at)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_france/model/prelevements_obligatoires/taxe_habitation/taxe_habitation.py", line 352, in formula_2017_01_01
    degrevement_plafonnement_taxe_habitation = menage('degrevement_plafonnement_taxe_habitation', period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/populations.py", line 101, in __call__
    return self.simulation.calculate(variable_name, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 111, in calculate
    result = self._calculate(variable_name, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 141, in _calculate
    array = self._run_formula(variable, population, period)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_core/simulations.py", line 247, in _run_formula
    array = formula(population, period, parameters_at)
  File "/home/cbenz/.local/share/virtualenvs/openfisca-dash-ui/lib/python3.7/site-packages/openfisca_france/model/prelevements_obligatoires/taxe_habitation/taxe_habitation.py", line 331, in formula_2017_01_01
    if taux_th_commune_2000 + taux_th_epci_2000 == 0:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Cette pull-request corrige le problème.

Je vous laisse vérifier que array == 0 corresponde bien à "tous les éléments == 0" (donc .all()).

Dernier point : je ne sais pas si c'est un cas unique. Après une recherche rapide il semblerait que d'autres endroits dans le code utilisent bien .all() mais que d'autres non. En profite-t-on pour tout corriger ?

@cbenz cbenz changed the title Fix comparaison between array and scalar Corrige la comparaison entre un array et un nombre Jul 24, 2019
@bonjourmauko
Copy link
Member

Merci @cbenz !

Juste une question, ne serait-il plus clair d'utiliser numpy.where pour ce type de conditionnels ? Par exemple ici :

reduction_degrevement = where(
    taux_th_commune_2000 + taux_th_epci_2000 == 0,
    0,
    reduction_degrevement,
    )

cc @benjello @guillett

@bonjourmauko bonjourmauko self-assigned this Jul 29, 2019
@benjello
Copy link
Member

@maukoquiroga : oui il me semble qu'il y a bien un bug dans la version de @bfabre01 et ta solution est la bonne.

@bonjourmauko
Copy link
Member

Depuis mes tests les résultats sont équivalents dans le deux cas (.all() et numpy.where).

@benjello
Copy link
Member

Oui mais cela passe par chance. On peut attendre le retour de @bfabre01 mais je pense que la solution avec where est la bonne.

@cbenz
Copy link
Member Author

cbenz commented Jul 31, 2019

En effet je suis d'accord avec np.where car il faut éviter d'utiliser un if dans une formule vectorielle.

Je propose une mise à jour.

Copy link
Member

@bonjourmauko bonjourmauko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merci @cbenz ! Si tu as déjà identifié d'autres cas similaires, n'hésite pas à soumettre d'autres PR.

@bonjourmauko bonjourmauko merged commit 5608316 into openfisca:master Aug 1, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants