Untitled

 avatar
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