Импорт необходимых модулей

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
import matplotlib.pyplot as plt
import joblib
from sklearn.preprocessing import LabelEncoder
import seaborn as sns
import pandas as pd
import numpy as np

Загрузка набора данных

df = pd.read_csv(“datasets/weatherHistory.csv”)
df.head(3)

Предварительная обработка данных

проверка типов данных каждого столбца

df.dtypes

Проверка нулевых значений во фрейме данных

df.isnull().sum()

Как мы видим, столбец «Precip Type» содержит 517 пустых строк, поэтому мы просто отбрасываем этот столбец. И мы даже отбрасываем некоторые другие столбцы, потому что они не имеют отношения к модели, которую мы хотим разработать.

df = df.drop([‘Precip Type’, ‘Formatted Date’, ‘Apparent Temperature ©’, ‘Daily Summary’], axis= 1)
df.head()

Визуализация данных

Мы строим тепловую карту, чтобы проверить связь между переменными или просто столбцами.

f,ax = plt.subplots(figsize=(8, 8))
sns.heatmap(df.corr(), annot=True,ax=ax)
plt.show()

df[‘Temperature ©’].hist()

df[‘Humidity’].hist()

df[‘Wind Speed (km/h)’].hist()

df['Loud Cover'].hist()

Как мы видим на приведенном выше графике, значение «Loud Cover» не меняется, поэтому мы опускаем этот столбец.

df = df.drop(['Loud Cover'], axis = 1)

теперь мы построим диаграмму давления

plt.boxplot(df['Pressure (millibars)'])

На приведенном выше графике мы видим, что значение давления равно «0», что недопустимо, поэтому давайте заменим его средним значением.

pressure_median = df['Pressure (millibars)'].median()
      
def pressure(x):
    if x==0:
        return x + pressure_median
    else:
        return x
        
df["Pressure (millibars)"] = df.apply(lambda row:pressure(row["Pressure (millibars)"]) , axis = 1)

Теперь давайте посмотрим на коробчатую диаграмму

plt.boxplot(df['Pressure (millibars)'])

df.head()

Значения во фрейме данных содержат много десятичных знаков, поэтому давайте округлим их.

df = df.round({"Temperature (C)" : 3, "Wind Speed (km/h)" : 0, "Pressure (millibars)" : 0, "Visibility (km)" : 0})
df.head()

Как мы знаем, модель принимает только числовые значения в качестве входных данных, но столбец «Сводка» не является числовым, поэтому позвольте метке кодировать столбец.

le = LabelEncoder()
df["Summary"] = le.fit_transform(df['Summary'])
df.head()

Разделение кадра данных

X = df.drop([‘Temperature ©’], axis=1)
y = df['Temperature (C)']
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=21)
X_test.head()

model = RandomForestRegressor()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
y_pred

Сохранение модели

joblib.dump(model,’model.pkl’)