69 lines
2.9 KiB
Python
69 lines
2.9 KiB
Python
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) |