-
Notifications
You must be signed in to change notification settings - Fork 0
/
food.py
112 lines (85 loc) · 3.94 KB
/
food.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from members import *
import numpy as np
import pandas as pd
import datetime
from collections import Counter
def food_planning(food, NBreakfast, NDinner, NLunch, NSnack, WomanFoodMaxWeight):
names_counter = Counter()
total_weight = 0.0
for m in Members.values():
m.food = []
tbl = []
for row in food:
one_portion_weight = float(row[1])
portion_weight = one_portion_weight * NMembers
times = float(row[2])
weight = portion_weight * times
total_weight += weight
assert len(row) == 3 or len(row) == 4
names_counter[row[0]] += 1
assert names_counter[row[0]] <= 1
if len(row) == 3:
tbl.append({'name': row[0],
'portion': portion_weight,
'times': times,
'weight': weight})
else:
if isinstance(row[3], Member):
member = row[3]
assert member.name in MembersList
member.food.append({'kind' : 'food', 'packing_weight': portion_weight,
'weight' : weight, 'name' : row[0]})
tbl.append({'name': row[0],
'portion': portion_weight,
'times': times,
'weight': weight, 'Кто несет': member.name})
else:
members, ks = row[3]
assert np.sum(ks) - times < 1e-9, print(np.sum(ks), times)
assert len(members) == len(ks)
assert len(members) > 1
for member, k in zip(members, ks):
assert member.name in MembersList
member.food.append({'kind' : 'food', 'packing_weight': portion_weight,
'weight' : portion_weight * k, 'name' : row[0]})
tbl.append({'name': row[0],
'portion': portion_weight,
'times': k,
'weight': portion_weight * k, 'Кто несет': member.name})
if np.sum(ks) < times - 1e-9:
# Есть нераспределенное снаряжение
tbl.append({'name': row[0],
'portion': portion_weight,
'times': times - np.sum(ks),
'weight': portion_weight * (times - np.sum(ks))})
print("Общий вес: {}".format(total_weight))
avg = (total_weight - WomanFoodMaxWeight * NWomans) / (NMembers - NWomans)
print("Средний вес на мужчину: {}".format(avg))
print("Средний вес на женщину: {}".format(WomanFoodMaxWeight))
print("Вес на человека в день: {}\n".format(total_weight / NMembers / ((NBreakfast + NDinner + NSnack + NLunch) / 4)))
cur_weight = 0.0
for name, member in sorted(Members.items()):
w = np.sum([r['weight'] for r in member.food])
cur_weight += w
if name in Womans:
d = WomanFoodMaxWeight - w
else:
d = avg - w
print("{}: {}".format(name, d))
print("\nОстаток: {}".format(total_weight - cur_weight))
table = pd.DataFrame(data=tbl)
return table
def group_by_members(table, fname=None):
for a, b in table.groupby(['Кто несет']):
print("Участник: {}, несет: {}".format(a, b['weight'].sum()))
print(str(b))
print("\n\n")
if fname is not None:
with open(fname, 'w') as f:
f.write("Дата создания: {}\n\n".format(datetime.datetime.now()))
for a, b in table.groupby(['Кто несет']):
f.write("Участник: {}, несет: {}\n".format(a, b['weight'].sum()))
f.write(str(b))
f.write("\n\n")
f.write("\nСводная таблица\n")
f.write(str(table))