TovaHasi commited on
Commit
b898d29
1 Parent(s): 2a9d208

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -246
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
- Поток товаров связывает мир и обогащает жизнь людей и общества. Предоставляя разнообразное погрузочно-разгрузочное оборудование, такое как вилочные погрузчики, TMH поддерживает людей, работающих на переднем крае логистики и помогает улыбаться людям во всем мире. С 2000 года мы являемся мировым поставщиком погрузочно-разгрузочного оборудования №1.
22
- Ричтраки-это вилочные погрузчики, которые обеспечивают высокую высоту подъёма и высокую маневренность в узких проходах благодаря конструкции. Ричтрак может выдвинуть собственную мачту, дотянувшись до груза, а затем вернуться в исходное положение. Данный принцип позволяет ричтраку достигать максимальной маневренности и компактности при работе на складе и в других ограниченных пространствах.
23
- Toyota-ричтрак на протяжении многих лет лидирует в своем классе благодаря инновационным функциям.
24
- Линейка автоматизированной техники собрала в себе модели для всех основных складских и производственных операций. Автопилот – это в первую очередь, не оборудование, а работоспособное решение. Поэтому мы всегда обеспечиваем полноценную поддержку Клиента на всех этапах: от разработки технического задания, до внедрения и сопровождения.
25
- Данный калькулятор поможет Вам рассчитать NPV и IRR для автоматизированного и механизированного решений для Вашего склада, а также сравнить различные варианты, определив наилучший!
26
  """)
27
 
28
- genre = st.radio("Какой из вариантов", ("Покупка автоматизированного ричтрака", "Аренда автоматизированного ричтрака", "Покупка механизированного ричтрака"))
29
 
30
- if genre == 'Покупка автоматизированного ричтрака':
31
- col1, col2 = st.columns(2)
32
 
33
- with col1:
34
- Buying_an_autopilot = st.number_input('Покупка автопилота, руб.', value=2000000)
35
- Purchase_of_peripheral_equipment = st.number_input('Покупка перефирийного оборудования, руб.', value=40000)
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
- with col2:
45
- Price_for_processing_ont_pallet = st.number_input('Цена за обработку 1 паллета, руб.', value=300)
46
- Cargo_flow = st.number_input('Грузопоток, шт/месяц', value=10000)
47
- Efficiency = st.number_input('Производительность, шт в час', value=5)
48
- Number_of_working_hours = st.number_input('Количество рабочих часов', value=8)
49
- Shift_of_one_employee = 0 #st.number_input('Смена 1 работника, ч.', value=8)
50
- Number_of_working_days_month = st.number_input('Количество рабочих дней в месяц, дн.', value=20)
51
- Social_benefits_for_one_employee = 0 #st.number_input('Социальные выплаты 1 сотруднику, руб.', value=10000)
52
- Insurance_rate = st.number_input('Ставка страхования', value=0.005)
53
- Income_tax_rate = st.number_input('Ставка налога на прибыль', value=0.2)
54
- discounting = st.number_input('Ставка дисконтирования в месяц', value=0.028)
55
 
56
- elif genre == 'Аренда автоматизированного ричтрака':
57
- col1, col2 = st.columns(2)
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
- if genre == 'Покупка автоматизированного ричтрака':
139
- Expected_repair_costs_per_month = Number_machines * Equipment_breakdown_rate * The_cost_of_repairing_one_car
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 get_array_CF_PV():
202
- if genre == 'Покупка автоматизированного ричтрака':
203
- I_0 = (Buying_an_autopilot + Introduction_of_autopilot) * Number_machines + Purchase_of_peripheral_equipment
204
- amortizat = (Buying_an_autopilot + Introduction_of_autopilot) * Number_machines
205
- elif genre == 'Аренда автоматизированного ричтрака':
206
- I_0 = Rent_of_peripheral_equipment
207
- amortizat = 0
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 get_id_first_positive_NPV(array_NPV):
248
- for idx, npv in enumerate(array_NPV):
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
- st.write(f'NPV за {Number_of_months} месяцев: {array_NPV[-1]}')
272
- st.write(f'IRR на {Number_of_months} месяцев: {round(100 * IRR, 2)}%')
273
 
274
- if array_NPV[-1] < 0:
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
- chart_data = pd.DataFrame(columns=['PV', 'NPV'])
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