TovaHasi's picture
Update app.py
b9483ac
raw
history blame
16.4 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.set_page_config(
page_title="Ex-stream-ly Cool App",
page_icon="🧊",
layout="wide",
initial_sidebar_state="expanded",
menu_items={
'Get Help': 'https://www.extremelycoolapp.com/help',
'Report a bug': "https://www.extremelycoolapp.com/bug",
'About': "# This is a header. This is an *extremely* cool app!"
}
)
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)