问题描述
所得税计算python 询问在给定边际税率表的情况下如何计算税收,以及提供了有效的功能(如下).
income tax calculation python asks how to calculate taxes given a marginal tax rate schedule, and its answer provides a function that works (below).
但是,它仅适用于单个收入值.我将如何调整它以使其适用于收入列表/numpy数组/熊猫系列?也就是说,如何矢量化此代码?
However, it works only for a single value of income. How would I adapt it to work for a list/numpy array/pandas Series of income values? That is, how do I vectorize this code?
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
推荐答案
创建了两个数据框,一个用于税收参数,一个用于收入.对于每个收入,我们使用"searchsorted"方法从税表中获取相应的行索引.使用该索引,我们创建一个新表(df_tax.loc [rows])并将其与收入表连接起来,然后计算税收,并删除不必要的列.
Two data frames are created, one for the tax parameters and one for the incomes.For each income, we get the corresponding row indexes from the tax table, using the "searchsorted" method.With that index we create a new table (df_tax.loc[rows]) and concatenate it with the income table,then calculate the taxes, and drop the unnecessary columns.
import numpy as np, pandas as pd
# Test data:
df=pd.DataFrame({"name":["Bob","Julie","Mary","John","Bill","George","Andie"], \
"income":[0, 9_000, 10_000, 11_000, 30_000, 69_999, 200_000]})
OUT:
name income
0 Bob 0
1 Julie 9000
2 Mary 10000
3 John 11000
4 Bill 30000
5 George 69999
6 Andie 200000
df_tax=pd.DataFrame({"brackets": [0, 10_000, 30_000, 70_000 ], # lower limits
"rates": [0, .10, .20, .30 ],
"base_tax": [0, 0, 2_000, 10_000 ]} )
rows= df_tax["brackets"].searchsorted(df["income"], side="right") - 1 # aka bisect()
OUT:
[0 0 1 1 2 2 3]
df= pd.concat([df,df_tax.loc[rows].reset_index(drop=True)], axis=1)
df["total_tax"]= df["income"].sub(df["brackets"]).mul(df["rates"]).add(df["base_tax"])
OUT:
name income brackets rates base_tax total_tax
0 Bob 0 0 0.0 0 0.0
1 Julie 9000 0 0.0 0 0.0
2 Mary 10000 10000 0.1 0 0.0
3 John 11000 10000 0.1 0 100.0
4 Bill 30000 30000 0.2 2000 2000.0
5 George 69999 30000 0.2 2000 9999.8
6 Andie 200000 70000 0.3 10000 49000.0
df=df.reindex(columns=["name","income","total_tax"])
OUT:
name income total_tax
0 Bob 0 0.0
1 Julie 9000 0.0
2 Mary 10000 0.0
3 John 11000 100.0
4 Bill 30000 2000.0
5 George 69999 9999.8
6 Andie 200000 49000.0
在开始时,您也可以计算base_tax:
At the beginning, you can calculate the base_tax, too:
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()
这篇关于根据边际税率表计算税收负债的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!