import os import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.metrics import r2_score def create_plot_jpg(df: pd.DataFrame, nameFile): # для сохранения диаграммы в конкретной папке script_dir = os.path.dirname(__file__) results_dir = os.path.join(script_dir, '../static/') if not os.path.isdir(results_dir): os.makedirs(results_dir) # набор атрибутов - независимых переменных - площадь X = df["Store_Area"].array # набор меток - зависимых переменных, значение которых требуется предсказать - выручка Y = df["Store_Sales"].array n = df.shape[0] # делим датафрейм на набор тренировочных данных и данных для тестов, test_size содержит определние соотношения этих наборов n_test = int(n * 0.01) n_train = n - n_test X_train, Y_train = X[:n_train], Y[:n_train] X_test, Y_test = X[n_train:], Y[n_train:] sumY_train = sum(Y_train) sumX_train = sum(X_train) sumXY_train = sum(X_train * Y_train) sumXX_train = sum(X_train * X_train) b1 = (sumXY_train - (sumY_train * sumX_train) / n_train) / (sumXX_train - sumX_train * sumX_train / n_train) b0 = (sumY_train - b1 * sumX_train) / n_train # Построение модели на обучающем наборе plt.scatter(X_train, Y_train, alpha=0.8) plt.axline(xy1=(0, b0), slope=b1, color='r', label=f'$y = {b1:.5f}x {b0:+.5f}$') # Оценка производительности модели на тестовом наборе Y_pred = b0 + b1 * X_test first_half = sum((Y_pred - Y_test.mean()) ** 2) second_half = sum((Y_test - Y_pred) ** 2) + first_half plt.scatter(X_test, Y_test, alpha=0.8, color='g') plt.legend() plt.savefig(results_dir + nameFile + '.jpg') r2 = r_squared(Y_test, Y_pred) listMessages = [f"Коэффициент по странной формуле (по википедии): {first_half/second_half}", f"Истинный коэффициент (по википедии): {r2}", f"Подсчёт по библиотеке: {r2_score(Y_test, Y_pred)}"] return listMessages def r_squared(y_true, y_pred): # Вычисляем среднее значение целевой переменной mean_y_true = np.mean(y_true) # Вычисляем сумму квадратов отклонений от среднего ss_total = np.sum((y_true - mean_y_true) ** 2) # Вычисляем сумму квадратов остатков ss_residual = np.sum((y_true - y_pred) ** 2) # Вычисляем коэффициент детерминации return 1 - (ss_residual / ss_total)