Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -3,7 +3,6 @@ import matplotlib.pyplot as plt
|
|
3 |
import numpy as np
|
4 |
import pandas as pd
|
5 |
import math
|
6 |
-
import numpy_financial as np_fin
|
7 |
|
8 |
|
9 |
st.set_page_config(
|
@@ -18,269 +17,60 @@ st.title("Калькулятор Toyota 📦")
|
|
18 |
|
19 |
st.subheader('Toyota Material Handling')
|
20 |
st.write("""
|
21 |
-
|
22 |
-
Ричтраки-это вилочные погрузчики, которые обеспечивают высокую высоту подъёма и высокую маневренность в узких проходах благодаря конструкции. Ричтрак может выдвинуть собственную мачту, дотянувшись до груза, а затем вернуться в исходное положение. Данный принцип позволяет ричтраку достигать максимальной маневренности и компактности при работе на складе и в других ограниченных пространствах.
|
23 |
-
Toyota-ричтрак на протяжении многих лет лидирует в своем классе благодаря инновационным функциям.
|
24 |
-
Линейка автоматизированной техники собрала в себе модели для всех основных складских и производственных операций. Автопилот – это в первую очередь, не оборудование, а работоспособное решение. Поэтому мы всегда обеспечиваем полноценную поддержку Клиента на всех этапах: от разработки технического задания, до внедрения и сопровождения.
|
25 |
-
Данный калькулятор поможет Вам рассчитать NPV и IRR для автоматизированного и механизированного решений для Вашего склада, а также сравнить различные варианты, определив наилучший!
|
26 |
""")
|
27 |
|
28 |
-
genre = st.radio("Какой из вариантов", ("Покупка автоматизированного ричтрака", "Аренда автоматизированного ричтрака", "Покупка механизированного ричтрака"))
|
29 |
|
30 |
-
|
31 |
-
col1, col2 = st.columns(2)
|
32 |
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
Purchase_by = st.number_input('Покупка ПО, руб.', value=10000)
|
37 |
-
Introduction_of_autopilot = st.number_input('Внедрение автопилота, руб.', value=20000)
|
38 |
-
Maintenance = st.number_input('Обслуживание (месяц), руб.', value=100000)
|
39 |
-
The_cost_of_repairing_one_car = st.number_input('Стоимость ремонта одной машины, руб.', value=10000)
|
40 |
-
Monthly_salary_rate = 0 #st.number_input('Заработная ставка, руб. в месяц', value=40000)
|
41 |
-
Number_of_months = st.number_input('Количество месяцев', value=12)
|
42 |
-
Equipment_breakdown_rate = st.number_input('Коэффициент поломки оборудования', value=0.1)
|
43 |
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
discounting = st.number_input('Ставка дисконтирования в месяц', value=0.028)
|
55 |
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
with col1:
|
60 |
-
Rent_an_autopilot = st.number_input('Аренда автопилота, руб.', value = 20000)
|
61 |
-
Rent_of_peripheral_equipment = st.number_input('Аренда перефирийного оборудования, руб.', value = 4000)
|
62 |
-
Purchase_by = st.number_input('Покупка ПО, руб. ', value = 10000)
|
63 |
-
Introduction_of_autopilot = st.number_input('Внедрение автопилота, руб.', value = 20000)
|
64 |
-
Maintenance = st.number_input('Обслуживание (месяц), руб.', value = 100000)
|
65 |
-
The_cost_of_repairing_one_car = st.number_input('Стоимость ремонта одной машины, руб.', value = 10000)
|
66 |
-
Monthly_salary_rate = 0 #st.number_input('Заработная ставка в месяц, руб.', value = 40000)
|
67 |
-
Number_of_months = st.number_input('Срок аренды, месяц', value = 12)
|
68 |
-
|
69 |
-
with col2:
|
70 |
-
Equipment_breakdown_rate = st.number_input('Коэфициент поломки оборудования', value = 0.1)
|
71 |
-
Price_for_processing_ont_pallet = st.number_input('Цена за обработку 1 паллета, руб.', value = 300)
|
72 |
-
Cargo_flow = st.number_input('Грузопоток, шт в месяц ', value = 10000)
|
73 |
-
Efficiency = st.number_input('Производительность,шт в час', value = 5)
|
74 |
-
Number_of_working_hours = st.number_input('Количество рабочих часов', value = 8)
|
75 |
-
Shift_of_one_employee = 0 #st.number_input('Смена одного работника, часы', value = 8)
|
76 |
-
Number_of_working_days_month = st.number_input('Количество рабочих дней в месяц, дн.', value = 20)
|
77 |
-
Social_benefits_for_one_employee = 0 #st.number_input('Социальные выплаты одному сотруднику, руб.', value = 10000)
|
78 |
-
Income_tax_rate = st.number_input('Ставка налога на прибыль', value = 0.2)
|
79 |
-
Number_of_autopilots_serviced_by_one_employee = 0 #st.number_input('Количество автопилотов, обслуживаемых одним работником, шт.', value = 10)
|
80 |
-
discounting = st.number_input('Ставка дисконтирования в месяц', value = 0.028)
|
81 |
-
|
82 |
-
else:
|
83 |
-
col1, col2 = st.columns(2)
|
84 |
-
|
85 |
-
with col1:
|
86 |
-
Buying_a_richtruck = st.number_input('Покупка ричтрака, руб.', value=2000000)
|
87 |
-
Maintenance = st.number_input('Обслуживание (месяц), руб.', value=10000)
|
88 |
-
The_cost_of_repairing_one_car = st.number_input('Стоимость ремонта одной машины, руб.', value=1000)
|
89 |
-
Monthly_salary_rate = st.number_input('Заработная ставка, руб. в месяц', value=40000)
|
90 |
-
Number_of_months = st.number_input('Количество месяцев', value=12)
|
91 |
-
Equipment_breakdown_rate = st.number_input('Коэфициент поломки оборудования', value=0.3)
|
92 |
-
Price_for_processing_ont_pallet = st.number_input('Цена за обработку 1 паллета, руб.', value=300)
|
93 |
-
Cargo_flow = st.number_input('Грузопоток, шт/месяц всего', value=10000)
|
94 |
-
Efficiency = st.number_input('Производительность, шт в час', value=3)
|
95 |
-
with col2:
|
96 |
-
Number_of_working_hours = st.number_input('Количество рабочих часов', value=8)
|
97 |
-
Shift_of_one_employee = st.number_input('Смена 1 работника, ч.', value=8)
|
98 |
-
Number_of_working_days_month = st.number_input('Количество рабочих дней в месяц, дн.', value=20)
|
99 |
-
Social_benefits_for_one_employee = st.number_input('Социальные выплаты 1 сотруднику, руб.', value=10000)
|
100 |
-
Insurance_rate = st.number_input('Ставка страхования', value=0.005)
|
101 |
-
The_cost_of_demaged_goods = st.number_input('Стоимость поврежденного товара', value=1000)
|
102 |
-
Product_damage_rate= st.number_input('Коэфициент повреждения товара', value=0.005)
|
103 |
-
discounting = st.number_input('Ставка дисконтирования в месяц', value=0.028)
|
104 |
-
|
105 |
-
|
106 |
-
Rate_CPI = 1.05
|
107 |
-
Rate_employee_absences = 1.1
|
108 |
-
|
109 |
-
|
110 |
-
def get_number_pallets_and_machines_employees():
|
111 |
-
Number_pallets = Efficiency * Number_of_working_hours * Number_of_working_days_month
|
112 |
-
Number_machines = math.ceil(Cargo_flow / Number_pallets)
|
113 |
-
|
114 |
-
if genre == 'Покупка автоматизированного ричтрака':
|
115 |
-
Number_employees = 0
|
116 |
-
elif genre == 'Аренда автоматизированного ричтрака':
|
117 |
-
Number_employees = 0
|
118 |
-
else:
|
119 |
-
Number_employees = math.ceil(Rate_employee_absences * (Number_machines * Number_of_working_hours / Shift_of_one_employee))
|
120 |
|
121 |
-
return Number_pallets, Number_machines, Number_employees
|
122 |
-
|
123 |
-
|
124 |
-
def get_revenue(idx):
|
125 |
-
indexation = math.floor((idx - 1) / 12)
|
126 |
-
Price = Price_for_processing_ont_pallet * math.pow(Rate_CPI, indexation)
|
127 |
-
revenue = Number_machines * Number_pallets * Price
|
128 |
-
|
129 |
-
return revenue
|
130 |
-
|
131 |
-
|
132 |
-
def get_costs(idx):
|
133 |
-
indexation = math.floor(idx / 12)
|
134 |
-
start_year = ((idx - 1) % 12 == 0)
|
135 |
-
cost = 0
|
136 |
-
wage_fund_with_indexation = (Social_benefits_for_one_employee + Monthly_salary_rate) * math.pow(Rate_CPI, indexation)
|
137 |
|
138 |
-
|
139 |
-
|
140 |
-
Wage_Fund = Number_employees * wage_fund_with_indexation
|
141 |
-
|
142 |
-
if start_year:
|
143 |
-
The_cost_of_insurance = Number_machines * Insurance_rate * (Buying_an_autopilot + Purchase_of_peripheral_equipment)
|
144 |
-
cost += The_cost_of_insurance + Purchase_by
|
145 |
-
|
146 |
-
cost += Number_machines * Maintenance + Expected_repair_costs_per_month + Wage_Fund
|
147 |
-
|
148 |
-
elif genre == 'Аренда автоматизированного ричтрака':
|
149 |
-
Expected_repair_costs_per_month = Number_machines * Equipment_breakdown_rate * The_cost_of_repairing_one_car
|
150 |
-
Wage_Fund = Number_employees * wage_fund_with_indexation
|
151 |
-
Autopilot_rental = Number_machines * Rent_an_autopilot
|
152 |
-
|
153 |
-
if start_year:
|
154 |
-
cost += Purchase_by
|
155 |
-
|
156 |
-
cost += Autopilot_rental + Rent_of_peripheral_equipment + Purchase_by + Number_machines * Maintenance + Wage_Fund + Expected_repair_costs_per_month
|
157 |
-
|
158 |
-
else:
|
159 |
-
Expected_repair_costs_per_month = Number_machines * Equipment_breakdown_rate * The_cost_of_repairing_one_car
|
160 |
-
Wage_Fund = Number_employees * wage_fund_with_indexation
|
161 |
-
Expected_costs_for_the_purchase_of_damaged_goods = Efficiency * The_cost_of_demaged_goods * Product_damage_rate
|
162 |
-
|
163 |
-
if start_year:
|
164 |
-
The_cost_of_insurance = Number_machines * Insurance_rate * Buying_a_richtruck
|
165 |
-
cost += The_cost_of_insurance
|
166 |
-
|
167 |
-
cost += Number_machines * Maintenance + Expected_repair_costs_per_month + Wage_Fund + Expected_costs_for_the_purchase_of_damaged_goods
|
168 |
-
|
169 |
-
return cost
|
170 |
-
|
171 |
-
def get_profit(amortization, idx):
|
172 |
-
profit = get_revenue(idx) - get_costs(idx) - amortization
|
173 |
-
if profit > 0:
|
174 |
-
return profit
|
175 |
-
else:
|
176 |
-
return profit * 0.8
|
177 |
-
|
178 |
-
|
179 |
-
def get_PV(profit, discounting):
|
180 |
-
return profit * discounting
|
181 |
-
|
182 |
-
|
183 |
-
def get_array_discounting():
|
184 |
-
array_discounting = [1]
|
185 |
-
for idx in range(Number_of_months):
|
186 |
-
array_discounting.append(array_discounting[-1] / (1 + discounting))
|
187 |
-
return array_discounting
|
188 |
-
|
189 |
-
|
190 |
-
def get_amortization(value):
|
191 |
-
array_amortization = [0]
|
192 |
-
value = value / 60
|
193 |
-
for idx in range(Number_of_months):
|
194 |
-
if idx >= 61:
|
195 |
-
array_amortization.append(0)
|
196 |
-
else:
|
197 |
-
array_amortization.append(value)
|
198 |
-
return array_amortization
|
199 |
|
|
|
|
|
|
|
|
|
200 |
|
201 |
-
def
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
else:
|
209 |
-
I_0 = Buying_a_richtruck * Number_machines
|
210 |
-
amortizat = Buying_a_richtruck * Number_machines
|
211 |
-
|
212 |
-
array_discounting = get_array_discounting()
|
213 |
-
array_amortization = get_amortization(amortizat)
|
214 |
|
215 |
-
array_PV = [-I_0]
|
216 |
-
array_CF = [-I_0]
|
217 |
-
|
218 |
-
for idx in range(1, Number_of_months + 1, 1):
|
219 |
-
|
220 |
-
profit = get_profit(array_amortization[idx], idx)
|
221 |
-
|
222 |
-
array_CF.append(round(profit))
|
223 |
-
|
224 |
-
cur_PV = get_PV(profit, array_discounting[idx])
|
225 |
-
|
226 |
-
array_PV.append(round(cur_PV))
|
227 |
-
|
228 |
-
sale_price_mashine = 0
|
229 |
-
if genre == 'Покупка автоматизированного ричтрака':
|
230 |
-
sale_price_mashine = 0.7*(I_0 - np.sum(array_amortization))
|
231 |
-
elif genre == 'Покупка механизированного ричтрака':
|
232 |
-
sale_price_mashine = 0.7*(I_0 - np.sum(array_amortization))
|
233 |
-
|
234 |
-
array_PV.append(round(sale_price_mashine * array_discounting[-1] * 0.8))
|
235 |
-
array_CF.append(round(sale_price_mashine * 0.8))
|
236 |
-
|
237 |
-
return array_CF, array_PV, sale_price_mashine
|
238 |
-
|
239 |
-
|
240 |
-
def get_array_NPV():
|
241 |
-
array_NPV = [array_PV[0]]
|
242 |
-
for idx in range(1, len(array_PV), 1):
|
243 |
-
array_NPV.append(array_NPV[-1] + array_PV[idx])
|
244 |
-
return array_NPV
|
245 |
|
246 |
|
247 |
-
def
|
248 |
-
|
249 |
-
if npv > 0:
|
250 |
-
return idx
|
251 |
-
return len(array_NPV)
|
252 |
|
253 |
|
254 |
if st.button('Расчет эффективности'):
|
255 |
-
Number_pallets, Number_machines, Number_employees = get_number_pallets_and_machines_employees()
|
256 |
-
array_CF, array_PV, sale_price_mashine = get_array_CF_PV()
|
257 |
-
|
258 |
-
array_NPV = get_array_NPV()
|
259 |
-
|
260 |
-
IRR = np_fin.irr(array_CF)
|
261 |
-
|
262 |
-
st.write(f'Необходимое кол-во ричтраков {Number_machines}')
|
263 |
-
if genre == "Покупка механизированного ричтрака":
|
264 |
-
st.write(f'Необходимое кол-во сотрудников {Number_employees}')
|
265 |
-
|
266 |
-
if genre == 'Покупка автоматизированного ричтрака':
|
267 |
-
st.write(f'С учетом изнашивания машины можно продать за {round(sale_price_mashine)} в конце проекта')
|
268 |
-
elif genre == 'Покупка механизированного ричтрака':
|
269 |
-
st.write(f'С учетом изнашивания машины можно продать за {round(sale_price_mashine)} в конце проекта')
|
270 |
|
271 |
-
|
272 |
-
|
273 |
|
274 |
-
|
275 |
-
st.write(f'{Number_of_months} месяцев не хватает для окупаемости проекта')
|
276 |
-
else:
|
277 |
-
id_first_positive_NPV = get_id_first_positive_NPV(array_NPV)
|
278 |
-
st.write(f'Проект окупается на {id_first_positive_NPV} месяц')
|
279 |
-
|
280 |
|
281 |
-
|
282 |
-
chart_data['PV'] = array_PV
|
283 |
-
chart_data['NPV'] = array_NPV
|
284 |
|
285 |
-
st.bar_chart(chart_data)
|
286 |
|
|
|
3 |
import numpy as np
|
4 |
import pandas as pd
|
5 |
import math
|
|
|
6 |
|
7 |
|
8 |
st.set_page_config(
|
|
|
17 |
|
18 |
st.subheader('Toyota Material Handling')
|
19 |
st.write("""
|
20 |
+
тут информация про калькулятор
|
|
|
|
|
|
|
|
|
21 |
""")
|
22 |
|
|
|
23 |
|
24 |
+
col1, col2 = st.columns(2)
|
|
|
25 |
|
26 |
+
Number_of_incoming_pallets = st.number_input('Количество поступаемых паллет, паллет/месяц', value=40)
|
27 |
+
Number_of_pallets_shipped = st.number_input('Количество отгружаемых паллет, паллет/месяц', value=40)
|
28 |
+
The_average_cost_of_one_product = st.number_input('Средняя стоимость одного товара, руб.', value=3000)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
|
30 |
+
with col1:
|
31 |
+
The_cost_of_warehouse_maintenance_services = st.number_input('Стоимость услуг по обеспечению склада, руб./месяц', value=50000)
|
32 |
+
Average_salary = st.number_input('Средняя зарпала, сотрудник', value=50850)
|
33 |
+
Equipment_breakdown_rate_in_stock = st.number_input('Коэффициент поломки оборудования на складе, %', value=5)
|
34 |
+
The_cost_of_equipment_repair_in_the_warehouse = st.number_input('Стоимость ремонта оборудования на складе, руб./шт.', value=20000)
|
35 |
+
The_cost_of_warehouse_information_support = st.number_input('Стоимость информационной поддержки склада, руб./месяц', value=20000)
|
36 |
+
Spoilage_coefficient = st.number_input('Коэффициент порчи, %', value=0.1)
|
37 |
+
Number_of_working_hours_per_month = st.number_input('Количество рабочих часов в месяц, час', value=176)
|
38 |
+
Average_number_of_goods_per_pallet = st.number_input('Среднее количество товаров в одном паллете, шт./палелт', value=120)
|
39 |
+
Productivity_of_one_employee = st.number_input('Производительность одного сотрудника, паллетомест/час', value=0,2)
|
|
|
40 |
|
41 |
+
with col2:
|
42 |
+
Price_for_processing_ont_pallet = st.number_input('Цена за обработку 1 паллета, руб.', value=300)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
|
45 |
+
def get_average_number_of_damaged_goods():
|
46 |
+
return (Number_of_incoming_pallets + Number_of_pallets_shipped) * Spoilage_coefficient * Average_number_of_goods_per_pallet
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
|
48 |
+
def get_cnt_emplyes_and_equipment():
|
49 |
+
The_number_of_pallets_processed_by_one_employee = Productivity_of_one_employee * Number_of_working_hours_per_month
|
50 |
+
Number_of_employees = math.ceil((Number_of_incoming_pallets + Number_of_pallets_shipped) / The_number_of_pallets_processed_by_one_employee)
|
51 |
+
return Number_of_employees, Number_of_employees
|
52 |
|
53 |
+
def get_insource_cost():
|
54 |
+
The_cost_of_warehouse_maintenance_services = The_cost_of_warehouse_maintenance_services
|
55 |
+
Wage_fund = Number_of_employees * Average_salary
|
56 |
+
The_cost_of_repairing_broken_equipment = Number_of_equipment * The_cost_of_equipment_repair_in_the_warehouse * Equipment_breakdown_rate_in_stock / 100
|
57 |
+
The_cost_of_warehouse_information_support = The_cost_of_warehouse_information_support
|
58 |
+
Spoilage = Average_number_of_damaged_goods * The_average_cost_of_one_product
|
59 |
+
return The_cost_of_warehouse_maintenance_services + Wage_fund + The_cost_of_repairing_broken_equipment + The_cost_of_warehouse_information_support + Spoilage
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
|
62 |
|
63 |
+
def get_outsource_cost():
|
64 |
+
pass
|
|
|
|
|
|
|
65 |
|
66 |
|
67 |
if st.button('Расчет эффективности'):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
|
69 |
+
Number_of_employees, Number_of_equipment = get_cnt_emplyes_and_equipment()
|
70 |
+
Average_number_of_damaged_goods = get_average_number_of_damaged_goods()
|
71 |
|
72 |
+
insource_cost = get_insource_cost()
|
|
|
|
|
|
|
|
|
|
|
73 |
|
74 |
+
st.write(f'Затраты Insource склад {insource_cost}')
|
|
|
|
|
75 |
|
|
|
76 |
|