0
votes

Calculez les passifs fiscaux basés sur un calendrier de taux d'imposition marginal

Calcul de l'impôt sur le revenu Python demande comment calculer les taxes attribuées à un calendrier de taux d'imposition marginal et Sa réponse fournit une fonction qui fonctionne (ci-dessous).

Cependant, cela ne fonctionne que pour une seule valeur de revenu. Comment l'adapterais-je au travail pour une liste de valeurs de revenu de liste / de pandas de liste / numpopie? C'est, comment puis-je vous vectoriser ce code? P>

from bisect import bisect

rates = [0, 10, 20, 30]   # 10%  20%  30%

brackets = [10000,        # first 10,000
            30000,        # next  20,000
            70000]        # next  40,000

base_tax = [0,            # 10,000 * 0%
            2000,         # 20,000 * 10%
            10000]        # 40,000 * 20% + 2,000

def tax(income):
    i = bisect(brackets, income)
    if not i:
        return 0
    rate = rates[i]
    bracket = brackets[i-1]
    income_in_bracket = income - bracket
    tax_in_bracket = income_in_bracket * rate / 100
    total_tax = base_tax[i-1] + tax_in_bracket
    return total_tax


0 commentaires

4 Réponses :


0
votes

Un moyen (probablement inefficace) est d'utiliser la compréhension de la liste: xxx


2 commentaires

Où voyez-vous des améliorations possibles de la performance? De toute façon, vous devez effectuer les calculs pour chaque revenu.


En général, la vectorisation est souvent beaucoup plus rapide que la compréhension de la liste.



1
votes

Deux cadres de données sont créés, un pour les paramètres fiscaux et un pour les revenus. Pour chaque revenu, nous obtenons les indices de ligne correspondants de la table des impôts, à l'aide de la méthode "SearchEd". Avec cet index, nous créons une nouvelle table (df_tax.loc [lignes]) et le concaténate avec le tableau de revenus, Puis calculez les taxes et déposez les colonnes inutiles.

df_tax["base_tax"]= df_tax.brackets   #edit2
                .sub(df_tax.brackets.shift(fill_value=0))
                .mul(df_tax.rates.shift(fill_value=0))
                .cumsum()


2 commentaires

Merci, bien que le calcul édition base_tax produit des NANS pour les lignes 4-6


Pardon. Il doit être df_tax ["base_tax"] et non df ["base_tax"]. Corrigée. Vous pouvez l'appliquer au début lors de la configuration du tableau DF_TAX, vous devez donc spécifier uniquement les supports et les tarifs explicitement.



0
votes

Adapter Kantal's Réponse Pour exécuter en fonction de la fonction: XXX xxx


0 commentaires

2
votes

Cette méthode met en œuvre les calculs de taxe marginalisés vectorisés à l'aide de NUMPY s'il est nécessaire. XXX

Pour utilisation, les bandes doivent inclure la limite supérieure - à mon avis, cela le rend plus explicite. xxx

sortie: xxx


3 commentaires

Merci, ravi d'éviter pandas . Cela donnerait-il à nan si le revenu est fourni au-delà de la limite supérieure? Pourriez-vous faire un test de temps sur certaines données volumineuses (par exemple avec %% TIMINIT dans Jupyter)? Heureux d'accepter ceci s'il est plus rapide, bien que si np.inf est toujours la valeur la plus à droite impliquée que je favoris de la laisser tomber comme dans la question.


Merci - voici un ordinateur portable avec des tests de vitesse: je reçois Légèrement (8%) des résultats plus rapides. L'infini était trivial à ajouter, il suffit de l'ajouter sur les bandes et les nans ne devraient pas faire une apparence (même si le groupe supérieur n'est pas explicitement infini) - car il calcule simplement le montant dans chaque bande.


Merci d'avoir fait le test de vitesse. Comme il est plus rapide, plus concis et utilise moins de dépendances, j'ai changé cela à la réponse acceptée.