Untitled
unknown
python
a year ago
13 kB
5
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}, "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}, "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}, "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}, "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},}}, {"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}, "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 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": { "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}, "Sprzątanie": {"hourly_rate": 40, "sqm_rate": 40, "time_per_sqm": 1}, "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}, "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}, "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}, "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