Calcul de l'impôt sur le revenu Python demande comment calculer les taxes attribuées à un calendrier de taux d'imposition marginal et 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
4 Réponses :
Un moyen (probablement inefficace) est d'utiliser la compréhension de la liste:
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.
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()
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.
Adapter Kantal's Réponse Pour exécuter en fonction de la fonction:
Cette méthode met en œuvre les calculs de taxe marginalisés vectorisés à l'aide de NUMPY s'il est nécessaire. Pour utilisation, les bandes doivent inclure la limite supérieure - à mon avis, cela le rend plus explicite. p> sortie: p>
Merci, ravi d'éviter pandas code>. Cela donnerait-il à nan code> 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 CODE> dans Jupyter)? Heureux d'accepter ceci s'il est plus rapide, bien que si np.inf code> 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.