Untitled
unknown
python
2 years ago
16 kB
9
Indexable
import math
# Dane wejściowe
workers = [
{"name": "Zdzisław", "jobs": {"Murowanie": {"hourly_rate": 50, "sqm_rate": 100, "time_per_sqm": 3},
"Malowanie": {"hourly_rate": 50, "sqm_rate": 40, "time_per_sqm": 3},
"Prace ziemne": {"hourly_rate": 50, "sqm_rate": 50, "time_per_sqm": 2},
"Prace elektryczne": {"hourly_rate": 60, "sqm_rate": None, "time_per_sqm": None},
"Prace hydrauliczne": {"hourly_rate": 60, "sqm_rate": None, "time_per_sqm": None},
"Składanie mebli": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": 3},
"Sprzątanie": {"hourly_rate": 40, "sqm_rate": 30, "time_per_sqm": 1},
"Transport materiału": {"hourly_rate": 40, "sqm_rate": None, "time_per_sqm": 2},
"Rozkładanie rusztowania": {"hourly_rate": 50, "sqm_rate": 10, "time_per_sqm": 2},
"Układanie płytek": {"hourly_rate": 60, "sqm_rate": 50, "time_per_sqm": 4},
"Prace stolarskie": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": 3},
"Montaż elementów": {"hourly_rate": 50, "sqm_rate": None, "time_per_sqm": 3},
"Wylewanie betonu": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": 2}}},
{"name": "Andrzej", "jobs": {"Murowanie": {"hourly_rate": 50, "sqm_rate": 100, "time_per_sqm": 3},
"Malowanie": {"hourly_rate": 50, "sqm_rate": 40, "time_per_sqm": 3},
"Tapetowanie": {"hourly_rate": 50, "sqm_rate": 40, "time_per_sqm": 3},
"Prace elektryczne": {"hourly_rate": 60, "sqm_rate": None, "time_per_sqm": None},
"Prace hydrauliczne": {"hourly_rate": 60, "sqm_rate": None, "time_per_sqm": None},
"Składanie kuchni": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": 3},
"Sprzątanie": {"hourly_rate": 40, "sqm_rate": 30, "time_per_sqm": 1},
"Transport materiału": {"hourly_rate": 40, "sqm_rate": None, "time_per_sqm": None},
"Rozkładanie rusztowania": {"hourly_rate": 50, "sqm_rate": 10, "time_per_sqm": 2},
"Układanie płytek": {"hourly_rate": 60, "sqm_rate": 50, "time_per_sqm": 3},
"Prace stolarskie": {"hourly_rate": 50, "sqm_rate": None, "time_per_sqm": 2},
"Prace zewnętrzne": {"hourly_rate": 40, "sqm_rate": 40, "time_per_sqm": 4},
"Wylewanie betonu": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": 3},
"Odbiory łazienek": {"hourly_rate": 1000, "sqm_rate": None, "time_per_sqm": 1}}},
{"name": "Bartosz", "jobs": {"Murowanie": {"hourly_rate": 50, "sqm_rate": 100, "time_per_sqm": 3},
"wylewanie betonu": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": 3},
"Malowanie": {"hourly_rate": 50, "sqm_rate": 30, "time_per_sqm": 3},
"Składanie mebli": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": None},
"Specjalistyczne prace związane z rozbiórką i transportem": {"hourly_rate": 40,
"sqm_rate": 40,
"time_per_sqm": 3},
"Transport materiału": {"hourly_rate": 40, "sqm_rate": None, "time_per_sqm": None},
"Rozkładanie rusztowania": {"hourly_rate": 50, "sqm_rate": 50, "time_per_sqm": 3},
"Układanie płytek": {"hourly_rate": 60, "sqm_rate": 70, "time_per_sqm": 6},
"Prace stolarskie": {"hourly_rate": 50, "sqm_rate": None, "time_per_sqm": None}}},
{"name": "Bartłomiej", "jobs": {"Murowanie": {"hourly_rate": 50, "sqm_rate": 100, "time_per_sqm": 3},
"Prace ziemne": {"hourly_rate": 40, "sqm_rate": 40, "time_per_sqm": None},
"Składanie mebli": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": None},
"Sprzątanie": {"hourly_rate": 40, "sqm_rate": 30, "time_per_sqm": 1},
"Transport materiału": {"hourly_rate": 40, "sqm_rate": None,
"time_per_sqm": None},
"Rozkładanie rusztowania": {"hourly_rate": 50, "sqm_rate": 50,
"time_per_sqm": 3},
"Układanie płytek": {"hourly_rate": 60, "sqm_rate": 70, "time_per_sqm": 6},
"Prace stolarskie": {"hourly_rate": 50, "sqm_rate": None, "time_per_sqm": None},
"Montaż elementów": {"hourly_rate": 50, "sqm_rate": None, "time_per_sqm": None},
"Prace zewnętrzne": {"hourly_rate": 40, "sqm_rate": 40, "time_per_sqm": None},
"Wylewanie betonu": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": 6}}},
{"name": "Bogdan",
"jobs": {"Nadzór nad pracami budowlanymi": {"hourly_rate": 500, "sqm_rate": None, "time_per_sqm": None},
"Prace elektryczne": {"hourly_rate": 60, "sqm_rate": None, "time_per_sqm": None},
"Prace hydrauliczne": {"hourly_rate": 60, "sqm_rate": None, "time_per_sqm": None},
"Prace dachowe": {"hourly_rate": 50, "sqm_rate": 40, "time_per_sqm": 6}}},
{"name": "Kazimierz", "jobs": {"Murowanie": {"hourly_rate": 50, "sqm_rate": 100, "time_per_sqm": 6},
"Malowanie": {"hourly_rate": 50, "sqm_rate": 40, "time_per_sqm": 3},
"Składanie mebli": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": None},
"Sprzątanie": {"hourly_rate": 40, "sqm_rate": 40, "time_per_sqm": 1},
"Transport materiału": {"hourly_rate": 40, "sqm_rate": None,
"time_per_sqm": None},
"Rozkładanie rusztowania": {"hourly_rate": 50, "sqm_rate": 50,
"time_per_sqm": 3},
"Układanie płytek": {"hourly_rate": 60, "sqm_rate": 70, "time_per_sqm": 6},
"Prace stolarskie": {"hourly_rate": 50, "sqm_rate": None, "time_per_sqm": None},
"Montaż elementów": {"hourly_rate": 50, "sqm_rate": None, "time_per_sqm": None},
"Prace zewnętrzne": {"hourly_rate": 40, "sqm_rate": None, "time_per_sqm": None},
"Wylewanie betonu": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": 3}}},
{"name": "Cezary", "jobs": {"Murowanie": {"hourly_rate": 50, "sqm_rate": 100, "time_per_sqm": 3},
"Wylewanie betonu": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": 3},
"Malowanie": {"hourly_rate": 50, "sqm_rate": 30, "time_per_sqm": 3},
"Składanie mebli": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": None},
"Specjalistyczne prace związane z rozbiórką i transportem": {"hourly_rate": 40,
"sqm_rate": 40,
"time_per_sqm": 3},
"Specjalistyczne prace sprzątające": {"hourly_rate": 40, "sqm_rate": 40,
"time_per_sqm": None},
"Transport materiału": {"hourly_rate": 40, "sqm_rate": None, "time_per_sqm": None},
"Rozkładanie rusztowania": {"hourly_rate": 50, "sqm_rate": 50, "time_per_sqm": 3},
"Układanie płytek": {"hourly_rate": 60, "sqm_rate": 70, "time_per_sqm": 6},
"Prace stolarskie": {"hourly_rate": 50, "sqm_rate": None, "time_per_sqm": 3},
"Montaż elementów": {"hourly_rate": 50, "sqm_rate": None, "time_per_sqm": None},
"Wylewanie betonu": {"hourly_rate": 50, "sqm_rate": 70, "time_per_sqm": 6}}}
]
# Funkcja prepare_data przygotowuje dane dla pojedynczego pracownika. Dla każdej usługi pobiera
# stawkę godzinową, stawkę za metr kwadratowy i czas na metr kwadratowy, a następnie dodaje te
# wartości wraz z nazwą usługi do listy data.
def prepare_data(worker_jobs):
data = []
for job, details in worker_jobs.items():
hourly_rate = details["hourly_rate"]
sqm_rate = details["sqm_rate"] if details["sqm_rate"] else 0
time_per_sqm = details["time_per_sqm"] if details["time_per_sqm"] else 0
data.append([hourly_rate, sqm_rate, time_per_sqm, job])
return data
# Funkcja do wyświetlania listy dostępnych usług
def show_services(workers):
services = {}
for worker in workers:
for job, details in worker["jobs"].items():
if job not in services:
services[job] = details
services[job]["workers"] = [worker["name"]]
else:
services[job]["workers"].append(worker["name"])
print("Dostępne usługi:")
for service, details in services.items():
print(f"{service}:")
print(f" Stawka godzinowa: {details['hourly_rate']} zł/h")
if details["sqm_rate"]:
print(f" Stawka za m2: {details['sqm_rate']} zł/m2")
if details["time_per_sqm"]:
print(f" Czas na m2: {details['time_per_sqm']} h/m2")
print(f" Wykonawcy: {', '.join(details['workers'])}")
# Funkcja do obliczania średniej
def mean(values):
if len(values) == 0:
return 0
return sum(values) / len(values)
# Funkcja do obliczania wariancji
def variance(values, mean):
if len(values) <= 1:
return 0
squared_diff = [(x - mean) ** 2 for x in values]
return sum(squared_diff) / (len(values) - 1)
# Funkcja do obliczania kowariancji
def covariance(x, y, mean_x, mean_y):
if len(x) == 1:
return 0
covar = 0
for i in range(len(x)):
covar += (x[i] - mean_x) * (y[i] - mean_y)
return covar / (len(x) - 1)
# Funkcja linear_regression oblicza współczynniki regresji b0, b1, b2, b3 dla danego zbioru
# danych X i wartości y przy użyciu wzorów na regresję liniową wielorakową. Wykorzystuje
# wcześniej zaimplementowane funkcje mean, variance i covariance.
def linear_regression(X, y):
mean_x1 = mean([row[0] for row in X])
mean_x2 = mean([row[1] for row in X])
mean_x3 = mean([row[2] for row in X])
mean_y = mean(y)
covar_x1y = covariance([row[0] for row in X], y, mean_x1, mean_y)
covar_x2y = covariance([row[1] for row in X], y, mean_x2, mean_y)
covar_x3y = covariance([row[2] for row in X], y, mean_x3, mean_y)
var_x1 = variance([row[0] for row in X], mean_x1)
var_x2 = variance([row[1] for row in X], mean_x2)
var_x3 = variance([row[2] for row in X], mean_x3)
b1 = covar_x1y / var_x1 if var_x1 != 0 else 0
b2 = covar_x2y / var_x2 if var_x2 != 0 else 0
b3 = covar_x3y / var_x3 if var_x3 != 0 else 0
b0 = mean_y - (b1 * mean_x1) - (b2 * mean_x2) - (b3 * mean_x3)
return b0, b1, b2, b3
# Funkcja estimate_job służy do wyceny nowej usługi. Przyjmuje stawkę godzinową, stawkę za metr
# kwadratowy oraz czas na metr kwadratowy jako argumenty. Następnie wykorzystuje wytrenowane modele
# (współczynniki regresji) do przewidywania ceny i czasu wykonania usługi dla wykonawcy. Cena i czas
# dla klienta są obliczane przez pomnożenie wartości dla wykonawcy przez odpowiednie współczynniki
# (1.2 dla ceny i 1.1 dla czasu).
def estimate_job(hourly_rate, sqm_rate, time_per_sqm):
price_worker = b0_price + b1_price * hourly_rate + b2_price * sqm_rate + b3_price * time_per_sqm
time_worker = b0_time + b1_time * hourly_rate + b2_time * sqm_rate + b3_time * time_per_sqm
total_price_worker = price_worker * sqm_quantity
total_time_worker = time_worker * sqm_quantity
price_client = price_worker * 1.2 * sqm_quantity # 20% wyższa cena dla klienta
time_client = time_worker * 1.1 * sqm_quantity # 10% dłuższy czas dla klienta
return total_price_worker, price_client, total_time_worker, time_client
# Główna część programu
show_services(workers)
selected_service = input("Wybierz usługę: ")
sqm_quantity = float(input("Podaj ilość metrów kwadratowych: "))
# Znajdź pracowników, którzy mogą wykonać wybraną usługę
available_workers = []
for worker in workers:
if selected_service in worker["jobs"]:
available_workers.append(worker)
# Pobierz dane dla wybranej usługi
for worker in available_workers:
job_details = worker["jobs"][selected_service]
hourly_rate = job_details["hourly_rate"]
sqm_rate = job_details["sqm_rate"] if job_details["sqm_rate"] else 0
time_per_sqm = job_details["time_per_sqm"] if job_details["time_per_sqm"] else 0
print(f"Pracownik: {worker['name']}")
print(f"Stawka godzinowa: {hourly_rate} zł/h")
print(f"Stawka za m2: {sqm_rate} zł/m2")
print(f"Czas na m2: {time_per_sqm} h/m2")
print()
all_data = []
all_y_price = []
all_y_time = []
for worker in available_workers:
worker_data = prepare_data(worker["jobs"])
for row in worker_data:
hourly_rate, sqm_rate, time_per_sqm, job = row
if job == selected_service:
price = worker["jobs"][job]["hourly_rate"] * worker["jobs"][job]["time_per_sqm"] if worker["jobs"][job]["time_per_sqm"] else 0
time = worker["jobs"][job]["time_per_sqm"] if worker["jobs"][job]["time_per_sqm"] else 0
all_data.append([hourly_rate, sqm_rate, time_per_sqm])
all_y_price.append(price)
all_y_time.append(time)
# Trenowane są dwa modele regresji: jeden dla ceny (b0_price, b1_price, b2_price, b3_price) i drugi
# dla czasu (b0_time, b1_time, b2_time, b3_time). Funkcja linear_regression jest wywoływana dwa razy:
# raz z danymi all_data i all_y_price dla ceny, a drugi raz z danymi all_data i all_y_time dla czasu.
b0_price, b1_price, b2_price, b3_price = linear_regression(all_data, all_y_price)
b0_time, b1_time, b2_time, b3_time = linear_regression(all_data, all_y_time)
# Ta część kodu pokazuje przykładowe użycie funkcji estimate_job. Dla podanych wartości stawki godzinowej,
# stawki za metr kwadratowy i czasu na metr kwadratowy, wyświetlane są wyceny ceny i czasu usługi dla
# wykonawcy oraz klienta.
price_worker, price_client, time_worker, time_client = estimate_job(hourly_rate, sqm_rate, time_per_sqm)
print(f"Cena dla wykonawcy: {price_worker:.2f} zł")
print(f"Cena dla klienta: {price_client:.2f} zł")
print(f"Czas dla wykonawcy: {time_worker:.2f} godzin")
print(f"Czas dla klienta: {time_client:.2f} godzin")
Editor is loading...
Leave a Comment