TovaHasi's picture
Update app.py
670c918
raw
history blame
No virus
16 kB
import streamlit as st
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import math
import numpy_financial as np_fin
st.title("Калькулятор Toyota📄")
genre = st.radio("Какой из вариантов", ("Покупка автоматизированного ричтрака", "Аренда автоматизированного ричтрака", "Покупка механизированного ричтрака"))
if genre == 'Покупка автоматизированного ричтрака':
col1, col2, col3 = st.columns(3)
with col1:
Buying_an_autopilot = st.number_input('Покупка автопилота, руб.', value=2000000)
Purchase_of_peripheral_equipment = st.number_input('Покупка перефирийного оборудования, руб.', value=40000)
Purchase_by = st.number_input('Покупка ПО, руб.', value=10000)
Introduction_of_autopilot = st.number_input('Внедрение автопилота, руб.', value=20000)
Maintenance = st.number_input('Обслуживание (месяц), руб.', value=100000)
The_cost_of_repairing_one_car = st.number_input('Стоимость ремонта одной машины, руб.', value=10000)
Inflation_rate = st.number_input('Уровень инфляции', value=0.04)
Monthly_salary_rate = st.number_input('Заработная ставка, руб. в месяц', value=40000)
Number_of_months = st.number_input('Количество месяцев', value=12)
Equipment_breakdown_rate = st.number_input('Коэффициент поломки оборудования', value=0.1)
with col2:
Price_for_processing_ont_pallet = st.number_input('Цена за обработку 1 паллета, руб.', value=300)
Cargo_flow = st.number_input('Грузопоток, шт/месяц', value=10000)
Efficiency = st.number_input('Производительность, шт в час', value=5)
Number_of_working_hours = st.number_input('Количество рабочих часов', value=8)
Shift_of_one_employee = st.number_input('Смена 1 работника, ч.', value=8)
Number_of_working_days_month = st.number_input('Количество рабочих дней в месяц, дн.', value=20)
Social_benefits_for_one_employee = st.number_input('Социальные выплаты 1 сотруднику, руб.', value=10000)
Insurance_rate = st.number_input('Ставка страхования', value=0.005)
Income_tax_rate = st.number_input('Ставка налога на прибыль', value=0.2)
Number_of_autopilots_serviced_by_one_employee = st.number_input('Количество автопилотов, обслуживаемых 1 работником', value=10)
discounting = st.number_input('Ставка дисконтирования в месяц', value=0.028)
# Buying_an_autopilot = st.number_input('Покупка автопилота, руб.', value=2000000)
# Purchase_of_peripheral_equipment = st.number_input('Покупка перефирийного оборудования, руб.', value=40000)
# Purchase_by = st.number_input('Покупка ПО, руб.', value=10000)
# Introduction_of_autopilot = st.number_input('Внедрение автопилота, руб.', value=20000)
# Maintenance = st.number_input('Обслуживание (месяц), руб.', value=100000)
# The_cost_of_repairing_one_car = st.number_input('Стоимость ремонта одной машины, руб.', value=10000)
# Inflation_rate = st.number_input('Уровень инфляции', value=0.04)
# Monthly_salary_rate = st.number_input('Заработная ставка, руб. в месяц', value=40000)
# Number_of_months = st.number_input('Количество месяцев', value=12)
# Equipment_breakdown_rate = st.number_input('Коэффициент поломки оборудования', value=0.1)
# Price_for_processing_ont_pallet = st.number_input('Цена за обработку 1 паллета, руб.', value=300)
# Cargo_flow = st.number_input('Грузопоток, шт/месяц', value=10000)
# Efficiency = st.number_input('Производительность, шт в час', value=5)
# Number_of_working_hours = st.number_input('Количество рабочих часов', value=8)
# Shift_of_one_employee = st.number_input('Смена 1 работника, ч.', value=8)
# Number_of_working_days_month = st.number_input('Количество рабочих дней в месяц, дн.', value=20)
# Social_benefits_for_one_employee = st.number_input('Социальные выплаты 1 сотруднику, руб.', value=10000)
# Insurance_rate = st.number_input('Ставка страхования', value=0.005)
# Income_tax_rate = st.number_input('Ставка налога на прибыль', value=0.2)
# Number_of_autopilots_serviced_by_one_employee = st.number_input('Количество автопилотов, обслуживаемых 1 работником', value=10)
# discounting = st.number_input('Ставка дисконтирования в месяц', value=0.028)
elif genre == 'Аренда автоматизированного ричтрака':
Rent_an_autopilot = st.number_input('Аренда автопилота, руб.', value = 20000)
Rent_of_peripheral_equipment = st.number_input('Аренда перефирийного оборудования, руб.', value = 4000)
Purchase_by = st.number_input('Покупка ПО, руб. ', value = 10000)
Introduction_of_autopilot = st.number_input('Внедрение автопилота, руб.', value = 20000)
Maintenance = st.number_input('Обслуживание (месяц), руб.', value = 100000)
The_cost_of_repairing_one_car = st.number_input('Стоимость ремонта одной машины, руб.', value = 10000)
Monthly_salary_rate = st.number_input('Заработная ставка в месяц, руб.', value = 40000)
Number_of_months = st.number_input('Срок аренды, месяц', value = 12)
Equipment_breakdown_rate = st.number_input('Коэфициент поломки оборудования', value = 0.1)
Price_for_processing_ont_pallet = st.number_input('Цена за обработку 1 паллета, руб.', value = 300)
Cargo_flow = st.number_input('Грузопоток, шт в месяц ', value = 10000)
Efficiency = st.number_input('Производительность,шт в час', value = 5)
Number_of_working_hours = st.number_input('Количество рабочих часов', value = 8)
Shift_of_one_employee = st.number_input('Смена одного работника, часы', value = 8)
Number_of_working_days_month = st.number_input('Количество рабочих дней в месяц, дн.', value = 20)
Social_benefits_for_one_employee = st.number_input('Социальные выплаты одному сотруднику, руб.', value = 10000)
Income_tax_rate = st.number_input('Ставка налога на прибыль', value = 0.2)
Number_of_autopilots_serviced_by_one_employee = st.number_input('Количество автопилотов, обслуживаемых одним работником, шт.', value = 10)
discounting = st.number_input('Ставка дисконтирования в месяц', value = 0.028)
else:
Buying_a_richtruck = st.number_input('Покупка ричтрака, руб.', value=2000000)
Maintenance = st.number_input('Обслуживание (месяц), руб.', value=10000)
The_cost_of_repairing_one_car = st.number_input('Стоимость ремонта одной машины, руб.', value=1000)
Monthly_salary_rate = st.number_input('Заработная ставка, руб. в месяц', value=40000)
Number_of_months = st.number_input('Количество месяцев', value=12)
Equipment_breakdown_rate = st.number_input('Коэфициент поломки оборудования', value=0.3)
Price_for_processing_ont_pallet = st.number_input('Цена за обработку 1 паллета, руб.', value=300)
Cargo_flow = st.number_input('Грузопоток, шт/месяц всего', value=10000)
Efficiency = st.number_input('Производительность, шт в час', value=3)
Number_of_working_hours = st.number_input('Количество рабочих часов', value=8)
Shift_of_one_employee = st.number_input('Смена 1 работника, ч.', value=8)
Number_of_working_days_month = st.number_input('Количество рабочих дней в месяц, дн.', value=20)
Social_benefits_for_one_employee = st.number_input('Социальные выплаты 1 сотруднику, руб.', value=10000)
Insurance_rate = st.number_input('Ставка страхования', value=0.005)
The_cost_of_demaged_goods = st.number_input('Стоимость поврежденного товара', value=1000)
Product_damage_rate= st.number_input('Коэфициент повреждения товара', value=0.005)
discounting = st.number_input('Ставка дисконтирования в месяц', value=0.028)
Rate_CPI = 1.05
def get_number_pallets_and_machines_employees():
Number_pallets = Efficiency * Number_of_working_hours * Number_of_working_days_month
Number_machines = math.ceil(Cargo_flow / Number_pallets)
if genre == 'Покупка автоматизированного ричтрака':
Number_employees = math.ceil((Number_machines * Number_of_working_hours / Shift_of_one_employee) / Number_of_autopilots_serviced_by_one_employee)
elif genre == 'Аренда автоматизированного ричтрака':
Number_employees = math.ceil((Number_machines * Number_of_working_hours / Shift_of_one_employee) / Number_of_autopilots_serviced_by_one_employee)
else:
Number_employees = math.ceil((Number_machines * Number_of_working_hours / Shift_of_one_employee))
return Number_pallets, Number_machines, Number_employees
def get_revenue(idx):
indexation = math.floor(idx / 12)
Price = Price_for_processing_ont_pallet * math.pow(Rate_CPI, indexation)
revenue = Number_machines * Number_pallets * Price
return revenue
def get_costs(idx):
indexation = math.floor(idx / 12)
start_year = ((idx - 1) % 12 == 0)
cost = 0
wage_fund_with_indexation = (Social_benefits_for_one_employee + Monthly_salary_rate) * math.pow(Rate_CPI, indexation)
if genre == 'Покупка автоматизированного ричтрака':
Expected_repair_costs_per_month = Number_machines * Equipment_breakdown_rate * The_cost_of_repairing_one_car
Wage_Fund = Number_employees * wage_fund_with_indexation
if start_year:
The_cost_of_insurance = Number_machines * Insurance_rate * (Buying_an_autopilot + Purchase_of_peripheral_equipment)
cost += The_cost_of_insurance + Purchase_by
cost += Number_machines * Maintenance + Expected_repair_costs_per_month + Wage_Fund
elif genre == 'Аренда автоматизированного ричтрака':
Expected_repair_costs_per_month = Number_machines * Equipment_breakdown_rate * The_cost_of_repairing_one_car
Wage_Fund = Number_employees * wage_fund_with_indexation
Autopilot_rental = Number_machines * Rent_an_autopilot
if start_year:
cost += Purchase_by
cost += Autopilot_rental + Rent_of_peripheral_equipment + Purchase_by + Number_machines * Maintenance + Wage_Fund + Expected_repair_costs_per_month
else:
Expected_repair_costs_per_month = Number_machines * Equipment_breakdown_rate * The_cost_of_repairing_one_car
Wage_Fund = Number_employees * wage_fund_with_indexation
Expected_costs_for_the_purchase_of_damaged_goods = Efficiency * The_cost_of_demaged_goods * Product_damage_rate
if start_year:
The_cost_of_insurance = Number_machines * Insurance_rate * Buying_a_richtruck
cost += The_cost_of_insurance
cost += Number_machines * Maintenance + Expected_repair_costs_per_month + Wage_Fund + Expected_costs_for_the_purchase_of_damaged_goods
return cost
def get_profit(amortization, idx):
profit = get_revenue(idx) - get_costs(idx) - amortization
if profit > 0:
return profit
else:
return profit * 0.8
def get_PV(profit, discounting):
return profit * discounting
def get_array_discounting():
array_discounting = [1]
for idx in range(Number_of_months):
array_discounting.append(array_discounting[-1] / (1 + discounting))
return array_discounting
def get_amortization(value):
array_amortization = [0]
value = value / 60
for idx in range(Number_of_months):
array_amortization.append(value)
return array_amortization
def get_array_CF_PV():
if genre == 'Покупка автоматизированного ричтрака':
I_0 = Buying_an_autopilot * Number_machines + Purchase_of_peripheral_equipment + Introduction_of_autopilot * Number_machines
amortizat = Buying_an_autopilot * Number_machines + Introduction_of_autopilot * Number_machines
elif genre == 'Аренда автоматизированного ричтрака':
I_0 = Rent_of_peripheral_equipment
amortizat = 0
else:
I_0 = Buying_a_richtruck * Number_machines
amortizat = Buying_a_richtruck * Number_machines
array_discounting = get_array_discounting()
array_amortization = get_amortization(amortizat)
array_PV = [-I_0]
array_CF = [-I_0]
for idx in range(1, Number_of_months + 1, 1):
profit = get_profit(array_amortization[idx], idx)
array_CF.append(round(profit))
cur_PV = get_PV(profit, array_discounting[idx])
array_PV.append(round(cur_PV))
return array_CF, array_PV
def get_array_NPV():
array_NPV = [array_PV[0]]
for idx in range(1, Number_of_months + 1, 1):
array_NPV.append(array_NPV[-1] + array_PV[idx])
return array_NPV
def get_id_first_positive_NPV(array_NPV):
for idx, npv in enumerate(array_NPV):
if npv > 0:
return idx
return len(array_NPV)
if st.button('Расчет эффективности'):
Number_pallets, Number_machines, Number_employees = get_number_pallets_and_machines_employees()
array_CF, array_PV = get_array_CF_PV()
array_NPV = get_array_NPV()
IRR = np_fin.irr(array_CF)
st.write(f'Необходимое кол-во ричтраков {Number_machines}')
st.write(f'Необходимое кол-во сотрудников {Number_employees}')
st.write(f'NPV за {Number_of_months} месяцев:', array_NPV[-1])
st.write(f'IRR на {Number_of_months} месяцев: {round(100 * IRR, 2)}%')
if array_NPV[-1] < 0:
st.write(f'{Number_of_months} месяцев не хватает для окупаемости проекта')
else:
id_first_positive_NPV = get_id_first_positive_NPV(array_NPV)
st.write(f'Проект окупается на {id_first_positive_NPV} месяц')
chart_data = pd.DataFrame(columns=['PV', 'NPV'])
chart_data['PV'] = array_PV
chart_data['NPV'] = array_NPV
st.bar_chart(chart_data)