Spaces:
Runtime error
Runtime error
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.set_page_config( | |
page_title="Ex-stream-ly Cool App", | |
page_icon="🧊", | |
layout="wide", | |
initial_sidebar_state="expanded" | |
) | |
st.title("Калькулятор Toyota 📦") | |
st.subheader('Toyota Material Handling') | |
st.write(""" | |
Поток товаров связывает мир и обогащает жизнь людей и общества. Предоставляя разнообразное погрузочно-разгрузочное оборудование, такое как вилочные погрузчики, TMH поддерживает людей, работающих на переднем крае логистики и помогает улыбаться людям во всем мире. С 2000 года мы являемся мировым поставщиком погрузочно-разгрузочного оборудования №1. | |
Ричтраки-это вилочные погрузчики, которые обеспечивают высокую высоту подъёма и высокую маневренность в узких проходах благодаря конструкции. Ричтрак может выдвинуть собственную мачту, дотянувшись до груза, а затем вернуться в исходное положение. Данный принцип позволяет ричтраку достигать максимальной маневренности и компактности при работе на складе и в других ограниченных пространствах. | |
Toyota-ричтрак на протяжении многих лет лидирует в своем классе благодаря инновационным функциям. | |
Линейка автоматизированной техники собрала в себе модели для всех основных складских и производственных операций. Автопилот – это в первую очередь, не оборудование, а работоспособное решение. Поэтому мы всегда обеспечиваем полноценную поддержку Клиента на всех этапах: от разработки технического задания, до внедрения и сопровождения. | |
Данный калькулятор поможет Вам рассчитать NPV и IRR для автоматизированного и механизированного решений для Вашего склада, а также сравнить различные варианты, определив наилучший! | |
""") | |
genre = st.radio("Какой из вариантов", ("Покупка автоматизированного ричтрака", "Аренда автоматизированного ричтрака", "Покупка механизированного ричтрака")) | |
if genre == 'Покупка автоматизированного ричтрака': | |
col1, col2 = st.columns(2) | |
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) | |
Price_for_processing_ont_pallet = st.number_input('Цена за обработку 1 паллета, руб.', value=300) | |
with col2: | |
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 == 'Аренда автоматизированного ричтрака': | |
col1, col2 = st.columns(2) | |
with col1: | |
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) | |
with col2: | |
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: | |
col1, col2 = st.columns(2) | |
with col1: | |
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) | |
with col2: | |
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) |