-
Notifications
You must be signed in to change notification settings - Fork 0
/
bruteforce_utils.py
160 lines (109 loc) · 4.46 KB
/
bruteforce_utils.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import csv
import os
import psutil
from itertools import combinations
from itertools import permutations
from time import time
def load_data(name_of_file):
"""load the shares data from a csv file with 4 or 20 shares"""
data_shares = []
with open(f"data/{name_of_file}.csv", "r") as file:
reader = csv.reader(file)
for row in reader:
data_shares.append(row)
# remove first list with header
data_shares = data_shares[1:]
data_shares = [(a, float(b), float(c)) for a, b, c in data_shares]
return data_shares
def generate_all_combinations(data_of_shares):
"""generates all possible combinations with `itertools.combinations`"""
all_possible_combinations = []
for i in range(len(data_of_shares) + 1):
combos = combinations(data_of_shares, i)
for combo in combos:
all_possible_combinations.append(combo)
return all_possible_combinations
def generate_all_combinations_permutations(data_of_shares):
"""generates all possible combinations with `itertools.permutations`"""
all_possible_combinations_permutations = []
for combo in permutations(data_of_shares, len(data_of_shares)):
all_possible_combinations_permutations.append(combo)
return all_possible_combinations_permutations
def combinations_budget(possible_combo, budget):
"""uses all possible combinations to check them and include the budget"""
budget_combinations = []
for combination in possible_combo:
current_combinations = []
remaining_budget = budget
for combo in combination:
if remaining_budget - combo[1] >= 0:
remaining_budget -= combo[1]
current_combinations.append(combo)
budget_combinations.append(current_combinations)
return budget_combinations
def calculate_profit(budget_combo):
"""calculate the profit of all combinations
(price * profit) + (price * profit)
"""
profit_combinations = []
for combination in budget_combo:
result_profit = 0
for i in range(0, len(combination)):
price = combination[i][1]
profit = combination[i][2]
result_profit += price * profit
total_profit = round(result_profit / 100, 2)
profit_combinations.append(total_profit)
return profit_combinations
def check_duplicate_profit(profit_combo):
"""check for same value of the profit inside the itertools.permutations combinations
get rid of the duplicates
"""
duplicate_free_profit_combo = []
double_profit = []
for combo in profit_combo:
profit = combo[3]
found_duplicat = False
for double in double_profit:
if profit == double:
found_duplicat = True
break
if not found_duplicat:
double_profit.append(profit)
duplicate_free_profit_combo.append(combo)
return duplicate_free_profit_combo
def bruteforce(budget_combo, profit_combo):
"""get the most profitable share combination"""
highest_profit = 0.0
highest_combo = {}
for i, profit in enumerate(profit_combo):
if profit > highest_profit:
highest_profit = profit
index = i
highest_combo["combo"] = budget_combo[index]
highest_combo["total_profit"] = highest_profit
return highest_combo
def print_results(combination, amount_of_shares, budget, start_time, name_of_file):
"""print the results of the bruteforce algorithm."""
costs = 0
print(" ---------------------------------------------------------------")
print(" ** RESULTS ** ", end="\n\n")
print(" The share-combination-result of the bruteforce algorythm: ", end="\n\n")
print(f" You have chosen: {name_of_file}.py")
print(f" The amount of shares are: {amount_of_shares}.")
print(f" The buying budget is: {budget} €.", end="\n\n")
for i, share in enumerate(combination["combo"]):
costs += share[1]
print(f" {i+1}. name: {share[0]}, price: {share[1]}, profit: {share[2]}")
print()
print(f" The costs for the shares are: {round(costs, 2)} €.")
print(
f" The total profit of this share-combination is: "
f"{combination['total_profit']} %.",
)
print(f" The process needed {round((time() - start_time), 6)} seconds.")
print(
f" RAM used by the program: "
f"{round((psutil.Process(os.getpid()).memory_info().rss / (1024 ** 2)), 3)} MB",
end="\n\n",
)