Как условно bin значение, с python? - PullRequest
1 голос
/ 18 сентября 2019

Итак, основа этого заключается в том, что я пытаюсь, чтобы пользователь ввел свой годовой оклад, затем программа проверит его с помощью набора выражений if, затем вернет, в какой налоговой категории они находятся, вычтет сумму из годовой суммы.зарплату и возврат, каков будет их валовой доход.Основная проблема заключается в том, что он будет работать правильно для любых сумм от 0 до 9 525 долларов, но как только вы подпрыгнете до 12% и 22%, он не станет им.Например, если бы вы ввели 100 000 долларов, он бы вычел 12% из этого, тогда как он должен вычесть 24%.Вот код Python в его текущей форме:

#Takes someone's yearly salary
yearlySalary = eval(input("Please enter your yearly salary: "))

if(yearlySalary < 9525):
    tax = yearlySalary * .10
    yearlySalary = yearlySalary-tax

elif(yearlySalary > 9526 && yearlySalary < 38700):
    tax = yearlySalary * .12
    yearlySalary = yearlySalary-tax

elif(range (38701, 82500)):
    tax = yearlySalary * .22
    yearlySalary = yearlySalary-tax

elif(range (82501, 157500)):
    tax = yearlySalary * .24
    yearlySalary = yearlySalary-tax

elif(range(157501, 200000)):
    tax = yearlySalary * .32
    yearlySalary = yearlySalary-tax

elif(range(200001, 500000)):
    tax = yearlySalary * .35
    yearlySalary = yearlySalary-tax

elif(yearlySalary > 500001):
    tax = yearlySalary * .37
    yearlySalary = yearlySalary-tax

Ответы [ 4 ]

1 голос
/ 18 сентября 2019

Здесь есть несколько вопросов о том, как работают налоговые скобки;Квадратные скобки должны располагаться в обратном порядке, чтобы сначала получить скобки с наивысшим налогом, и только сумма сверх скобок должна облагаться налогом на эту сумму.

Также, для вашего примера, elif(range (82501, 157500)): не будет собирать year_salary =100000, потому что оператор else не утверждает, действительно ли year_salary находится в этом диапазоне.

Он перехватывается в 12%, потому что используется неправильный оператор "AND": используйте and вместо &&.

0 голосов
/ 19 сентября 2019

Здесь используется короткая программа для расчета налогов.

boundaries = [0, 9525, 38700, 82500, 157000, 200000, 500000]
percentages = [ .10, .12,  .22, .24, .32, .35, .37]
sal = salary = 142000
bot_top = zip(boundaries, boundaries[1:]+[salary])
sal_in_brkt = (top-bot if sal>top else max(sal-bot,0) for bot, top in bot_top)
taxes = sum(pct*inbrkt for pct, inbrkt in zip(percentages, sal_in_brkt))
print(salary, taxes, salary-taxes) # ⇒ 142000 28369.5 113630.5

bot_top создает кортежи с нижним и верхним крайностями каждой налоговой скобки (обратите внимание, что верхняя часть последней скобки принимается равнойк самой зарплате).
sal_in_brkt производит доли зарплаты, которые находятся между верхом и низом каждой скобки.
taxes является суммой произведенных в скобках долей зарплатыраз соответствующий процент.


Для обобщения процедуры ниже определена функция make_taxes, которая принимает в качестве необязательных аргументов список boundaries для налоговых скобок и список percentages, который применяется к доходу внутриконкретная налоговая скобка.

Список границ начинается с минимального дохода, к которому мы применяем налогообложение (в примере это 0), и заканчивается максимальным значением, при котором налогообложение является постоянным.Если у нас есть границы N , то число скобок, принимая во внимание, что значение больше максимального, равно N , поэтому мы утверждаем, что длины двух списков должны быть равны.

Функция make_taxes в конечном итоге возвращает функцию, которая возвращает налогообложение для данной зарплаты.

def make_taxes(boundaries=None, percentages=None):
    boundaries = boundaries or [0, 9525, 38700, 82500, 157000, 200000, 500000]
    percentages = percentages or [ .10, .12,  .22, .24, .32, .35, .37]
    assert len(boundaries) == len(percentages)
    def taxes(salary):
        s = salary
        pct_bot_top = zip(percentages, boundaries, boundaries[1:]+[s])
        return sum(p*(t-b if s>t else max(s-b, 0)) for p,b,t in pct_bot_top)
    return taxes

print(make_taxes()(142000)) # ⇒ 28369.5
0 голосов
/ 19 сентября 2019

Использование np.digitize:

  • Позволяет использовать более чистый код
  • yearlySalary с ячейками, без грязного кода, например:
    • yearlySalary > 9526 & yearlySalary < 38700
    • elif(yearlySalary in range (38701, 82500))
  • В случае следующего кода размеры бинов следующие:
    • 10% для 0 -9525
    • 12% для 9526 - 38700
    • 22% для 38701 - 82500
    • 24% для 82501 - 157500
    • 32% для 157501 - 200000
    • 35% для 200001 - 500000
    • 37% для 500001 и выше
  • .digitize работает путем нахождения индекса bins, в пределах которогоincome падает.Учитывая индекс, найдите соответствующее значение в tax_per.
  • bin_ используется в качестве переменной, потому что bin является внутренней функцией python, и мы не перезаписываем внутренние функции.
import numpy as np

def tax_bracket(income: float) -> float:
    tax_per = np.array([.10, .12, .22, .24, .32, .35, .37])
    bin_ = np.digitize(income, bins=[9526, 38701, 82501, 157501, 200001, 500001])
    return income - income*(tax_per[bin_])


yearlySalary = float(input("Please enter your yearly salary: "))
print(tax_bracket(yearlySalary))

Вывод:

Please enter your yearly salary:  37524
33021.12

Использование if - elif - else:

  • Упорядочить ячейки от наибольшего к наименьшему.
def old_way(yearlySalary):

    if yearlySalary > 500000:
        tax = yearlySalary * .37
        yearlySalary = yearlySalary-tax

    elif yearlySalary > 200000:
        tax = yearlySalary * .35
        yearlySalary = yearlySalary-tax

    elif yearlySalary > 157500:
        tax = yearlySalary * .32
        yearlySalary = yearlySalary-tax

    elif yearlySalary > 82500:
        tax = yearlySalary * .24
        yearlySalary = yearlySalary-tax

    elif yearlySalary > 38700:
        tax = yearlySalary * .22
        yearlySalary = yearlySalary-tax

    elif yearlySalary > 9525:
        tax = yearlySalary * .12
        yearlySalary = yearlySalary-tax

    else:
        tax = yearlySalary * .10
        yearlySalary = yearlySalary-tax

    return yearlySalary
0 голосов
/ 18 сентября 2019

Вы должны изменить свой elif следующим образом:

elif(yearlySalary in range (38701, 82500)):

, чтобы узнать, находится ли ваш годовой заработок в этом диапазоне

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...