PIbd42NevaevaCourses/lec2.ipynb
2025-01-17 06:33:19 +04:00

80 KiB
Raw Blame History

Лабораторная 2

ДАТАСЕТ СПИСОК ФОРБС Объектами наблюдения в данном наборе данных являются миллиардеры, чье состояние оценивается и документируется в ежегодном рейтинге Forbes. Каждая запись в наборе данных представляет собой отдельного миллиардера с его оцененным состоянием. Атрибуты объектов

Атрибутами объектов (миллиардеров) являются: Имя: имя миллиардера. Страна: страна, в которой проживает миллиардер. Состояние: оцененное состояние миллиардера в долларах США. Источник богатства: источник, из которого миллиардер получил свое состояние (например, технологии, финансы, недвижимость и т.д.). Возраст: возраст миллиардера на момент публикации списка. Ранг: позиция миллиардера в рейтинге по сравнению с другими миллиардерами.

Связи между объектами могут быть определены через общие источники богатства или страны проживания. Например, миллиардеры из одной страны могут иметь схожие источники дохода, а также могут быть связаны через бизнес-партнерства или семейные связи.

Примеры бизнес-целей Привлечение инвестиций: Компании могут использовать данные о миллиардерах для целенаправленного маркетинга и привлечения инвестиций от состоятельных индивидуумов. Анализ рынка: Понимание источников богатства и распределения состояния может помочь в анализе рыночных трендов и потребительских предпочтений.

Эффект для бизнеса Эти бизнес-цели могут привести к увеличению инвестиций, улучшению репутации компании, расширению клиентской базы и повышению финансовой устойчивости организаций, работающих в различных секторах.

Примеры целей технического проекта Для привлечения инвестиций: Разработка платформы для анализа данных о миллиардерах, которая поможет компаниям находить потенциальных инвесторов на основе их интересов и источников богатства. Для анализа рынка: Создание аналитической панели, которая визуализирует данные о миллиардерах и их источниках богатства, позволяя компаниям лучше понимать рыночные тренды.

Входные данные: Данные о миллиардерах, включая имя, страну, состояние, источник богатства, возраст и ранг.

Целевой признак: Целевым признаком может быть состояние миллиардера, что позволит строить модели для прогнозирования изменений в состоянии или ранге в будущем.

In [27]:
import pandas as pd

df = pd.read_csv("data/forbes.csv", index_col="RankID")

df.info()

display(df.shape)

df.head()
<class 'pandas.core.frame.DataFrame'>
Index: 2600 entries, 1 to 2578
Data columns (total 6 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   Name      2600 non-null   object 
 1   Networth  2600 non-null   float64
 2   Age       2600 non-null   int64  
 3   Country   2600 non-null   object 
 4   Source    2600 non-null   object 
 5   Industry  2600 non-null   object 
dtypes: float64(1), int64(1), object(4)
memory usage: 142.2+ KB
(2600, 6)
Out[27]:
Name Networth Age Country Source Industry
RankID
1 Elon Musk 219.0 50 United States Tesla, SpaceX Automotive
2 Jeff Bezos 171.0 58 United States Amazon Technology
3 Bernard Arnault & family 158.0 73 France LVMH Fashion & Retail
4 Bill Gates 129.0 66 United States Microsoft Technology
5 Warren Buffett 118.0 91 United States Berkshire Hathaway Finance & Investments

Получение сведений о пропущенных данных

Типы пропущенных данных:

  • None - представление пустых данных в Python
  • NaN - представление пустых данных в Pandas
  • '' - пустая строка
In [28]:
# Количество пустых значений признаков
display(df.isnull().sum())
display()

# Есть ли пустые значения признаков
display(df.isnull().any())
display()

# Процент пустых значений признаков
for i in df.columns:
    null_rate = df[i].isnull().sum() / len(df) * 100
    if null_rate > 0:
        display(f"{i} процент пустых значений: %{null_rate:.2f}")
Name        0
Networth    0
Age         0
Country     0
Source      0
Industry    0
dtype: int64
Name        False
Networth    False
Age         False
Country     False
Source      False
Industry    False
dtype: bool

Для данного датасета количество пустых значений для каждого из признаков = 0 т.е. не пропущено одно значение -> заполнение и корректировка не нужны.

In [31]:
fillna_df = df.fillna(0)

display(fillna_df.shape)

display(fillna_df.isnull().any())

# Замена пустых данных на 0
df["AgeFillNA"] = df["Age"].fillna(0) 

# Замена пустых данных на медиану
df["AgeFillMedian"] = df["Age"].fillna(df["Age"].median())

df.tail()
(2600, 7)
Name             False
Networth         False
Age              False
Country          False
Source           False
Industry         False
AgeFillMedian    False
dtype: bool
Out[31]:
Name Networth Age Country Source Industry AgeFillMedian AgeFillNA
RankID
2578 Jorge Gallardo Ballart 1.0 80 Spain pharmaceuticals Healthcare 80 80
2578 Nari Genomal 1.0 82 Philippines apparel Fashion & Retail 82 82
2578 Ramesh Genomal 1.0 71 Philippines apparel Fashion & Retail 71 71
2578 Sunder Genomal 1.0 68 Philippines garments Fashion & Retail 68 68
2578 Horst-Otto Gerberding 1.0 69 Germany flavors and fragrances Food & Beverage 69 69
In [32]:
df["AgeCopy"] = df["Age"]

# Замена данных сразу в DataFrame без копирования
df.fillna({"AgeCopy": 0}, inplace=True)

df.tail()
Out[32]:
Name Networth Age Country Source Industry AgeFillMedian AgeFillNA AgeCopy
RankID
2578 Jorge Gallardo Ballart 1.0 80 Spain pharmaceuticals Healthcare 80 80 80
2578 Nari Genomal 1.0 82 Philippines apparel Fashion & Retail 82 82 82
2578 Ramesh Genomal 1.0 71 Philippines apparel Fashion & Retail 71 71 71
2578 Sunder Genomal 1.0 68 Philippines garments Fashion & Retail 68 68 68
2578 Horst-Otto Gerberding 1.0 69 Germany flavors and fragrances Food & Beverage 69 69 69

Удаление наблюдений с пропусками

In [33]:
dropna_df = df.dropna()

display(dropna_df.shape)

display(fillna_df.isnull().any())
(2600, 9)
Name             False
Networth         False
Age              False
Country          False
Source           False
Industry         False
AgeFillMedian    False
dtype: bool

Создание выборок данных

Библиотека scikit-learn

https://scikit-learn.org/stable/index.html

In [75]:
# Вывод распределения количества наблюдений по Индустрии
from src.utils import split_stratified_into_train_val_test


display(df.Industry.value_counts())
display()

data = df[["Networth", "Age", "Industry"]].copy()

df_train, df_val, df_test, y_train, y_val, y_test = split_stratified_into_train_val_test(
   data, stratify_colname="Industry", frac_train=0.60, frac_val=0.20, frac_test=0.20
)

display("Обучающая выборка: ", df_train.shape)
display(df_train.Industry.value_counts())

display("Контрольная выборка: ", df_val.shape)
display(df_val.Industry.value_counts())

display("Тестовая выборка: ", df_test.shape)
display(df_test.Industry.value_counts())
Industry
Finance & Investments          386
Technology                     329
Manufacturing                  322
Fashion & Retail               246
Healthcare                     212
Food & Beverage                201
Real Estate                    189
diversified                    178
Media & Entertainment           95
Energy                          93
Automotive                      69
Metals & Mining                 67
Service                         51
Construction & Engineering      43
Logistics                       35
Telecom                         35
Sports                          26
Gambling & Casinos              23
Name: count, dtype: int64
'Обучающая выборка: '
(1560, 3)
Industry
Finance & Investments          231
Technology                     197
Manufacturing                  193
Fashion & Retail               148
Healthcare                     127
Food & Beverage                121
Real Estate                    113
diversified                    107
Media & Entertainment           57
Energy                          56
Automotive                      41
Metals & Mining                 40
Service                         31
Construction & Engineering      26
Logistics                       21
Telecom                         21
Sports                          16
Gambling & Casinos              14
Name: count, dtype: int64
'Контрольная выборка: '
(520, 3)
Industry
Finance & Investments          77
Technology                     66
Manufacturing                  64
Fashion & Retail               49
Healthcare                     43
Food & Beverage                40
Real Estate                    38
diversified                    35
Media & Entertainment          19
Energy                         18
Automotive                     14
Metals & Mining                14
Service                        10
Construction & Engineering      9
Telecom                         7
Logistics                       7
Sports                          5
Gambling & Casinos              5
Name: count, dtype: int64
'Тестовая выборка: '
(520, 3)
Industry
Finance & Investments          78
Technology                     66
Manufacturing                  65
Fashion & Retail               49
Healthcare                     42
Food & Beverage                40
Real Estate                    38
diversified                    36
Media & Entertainment          19
Energy                         19
Automotive                     14
Metals & Mining                13
Service                        10
Construction & Engineering      8
Logistics                       7
Telecom                         7
Sports                          5
Gambling & Casinos              4
Name: count, dtype: int64
In [78]:
from imblearn.over_sampling import ADASYN

ada = ADASYN()

display("Обучающая выборка: ", df_train.shape)
display(df_train.Industry.value_counts())

X_resampled, y_resampled = ada.fit_resample(df_train, df_train["Industry"])  # type: ignore
df_train_adasyn = pd.DataFrame(X_resampled)

display("Обучающая выборка после oversampling: ", df_train_adasyn.shape)
display(df_train_adasyn.Industry.value_counts())

df_train_adasyn
'Обучающая выборка: '
(1560, 3)
Industry
Finance & Investments          231
Technology                     197
Manufacturing                  193
Fashion & Retail               148
Healthcare                     127
Food & Beverage                121
Real Estate                    113
diversified                    107
Media & Entertainment           57
Energy                          56
Automotive                      41
Metals & Mining                 40
Service                         31
Construction & Engineering      26
Logistics                       21
Telecom                         21
Sports                          16
Gambling & Casinos              14
Name: count, dtype: int64
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_1348\420769102.py in ?()
      4 
      5 display("Обучающая выборка: ", df_train.shape)
      6 display(df_train.Industry.value_counts())
      7 
----> 8 X_resampled, y_resampled = ada.fit_resample(df_train, df_train["Industry"])  # type: ignore
      9 df_train_adasyn = pd.DataFrame(X_resampled)
     10 
     11 display("Обучающая выборка после oversampling: ", df_train_adasyn.shape)

c:\Users\ateks\Courses\Courses\.venv\Lib\site-packages\imblearn\base.py in ?(self, X, y)
    204         y_resampled : array-like of shape (n_samples_new,)
    205             The corresponding label of `X_resampled`.
    206         """
    207         self._validate_params()
--> 208         return super().fit_resample(X, y)

c:\Users\ateks\Courses\Courses\.venv\Lib\site-packages\imblearn\base.py in ?(self, X, y)
    102             The corresponding label of `X_resampled`.
    103         """
    104         check_classification_targets(y)
    105         arrays_transformer = ArraysTransformer(X, y)
--> 106         X, y, binarize_y = self._check_X_y(X, y)
    107 
    108         self.sampling_strategy_ = check_sampling_strategy(
    109             self.sampling_strategy, y, self._sampling_type

c:\Users\ateks\Courses\Courses\.venv\Lib\site-packages\imblearn\base.py in ?(self, X, y, accept_sparse)
    157     def _check_X_y(self, X, y, accept_sparse=None):
    158         if accept_sparse is None:
    159             accept_sparse = ["csr", "csc"]
    160         y, binarize_y = check_target_type(y, indicate_one_vs_all=True)
--> 161         X, y = self._validate_data(X, y, reset=True, accept_sparse=accept_sparse)
    162         return X, y, binarize_y

c:\Users\ateks\Courses\Courses\.venv\Lib\site-packages\sklearn\base.py in ?(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)
    646                 if "estimator" not in check_y_params:
    647                     check_y_params = {**default_check_params, **check_y_params}
    648                 y = check_array(y, input_name="y", **check_y_params)
    649             else:
--> 650                 X, y = check_X_y(X, y, **check_params)
    651             out = X, y
    652 
    653         if not no_val_X and check_params.get("ensure_2d", True):

c:\Users\ateks\Courses\Courses\.venv\Lib\site-packages\sklearn\utils\validation.py in ?(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, estimator)
   1297         raise ValueError(
   1298             f"{estimator_name} requires y to be passed, but the target y is None"
   1299         )
   1300 
-> 1301     X = check_array(
   1302         X,
   1303         accept_sparse=accept_sparse,
   1304         accept_large_sparse=accept_large_sparse,

c:\Users\ateks\Courses\Courses\.venv\Lib\site-packages\sklearn\utils\validation.py in ?(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)
   1009                         )
   1010                     array = xp.astype(array, dtype, copy=False)
   1011                 else:
   1012                     array = _asarray_with_order(array, order=order, dtype=dtype, xp=xp)
-> 1013             except ComplexWarning as complex_warning:
   1014                 raise ValueError(
   1015                     "Complex data not supported\n{}\n".format(array)
   1016                 ) from complex_warning

c:\Users\ateks\Courses\Courses\.venv\Lib\site-packages\sklearn\utils\_array_api.py in ?(array, dtype, order, copy, xp, device)
    741         # Use NumPy API to support order
    742         if copy is True:
    743             array = numpy.array(array, order=order, dtype=dtype)
    744         else:
--> 745             array = numpy.asarray(array, order=order, dtype=dtype)
    746 
    747         # At this point array is a NumPy ndarray. We convert it to an array
    748         # container that is consistent with the input's namespace.

c:\Users\ateks\Courses\Courses\.venv\Lib\site-packages\pandas\core\generic.py in ?(self, dtype, copy)
   2149     def __array__(
   2150         self, dtype: npt.DTypeLike | None = None, copy: bool_t | None = None
   2151     ) -> np.ndarray:
   2152         values = self._values
-> 2153         arr = np.asarray(values, dtype=dtype)
   2154         if (
   2155             astype_is_view(values.dtype, arr.dtype)
   2156             and using_copy_on_write()

ValueError: could not convert string to float: 'Technology '

ДАТАСЕТ ЦЕНЫ НА ЗОЛОТО

Объектами наблюдения в данном наборе данных являются цены на золото, представленные через Gold ETF (Exchange-Traded Fund). Каждая запись в наборе данных соответствует отдельному дню торговли золотыми активами. Атрибуты объектов

Атрибутами объектов (цен на золото) являются: Дата: дата, когда происходила торговля. Цена открытия (Open): цена, по которой золото открывалось в начале торгового дня. Максимальная цена (High): наивысшая цена золота в течение дня. Минимальная цена (Low): наименьшая цена золота в течение дня. Цена закрытия (Close): цена, по которой золото закрылось в конце торгового дня. Скорректированная цена закрытия (Adjusted Close): цена закрытия, скорректированная с учетом факторов, таких как дивиденды и сплиты акций. Объем (Volume): количество золота, которое было куплено и продано в течение дня.

Связи между объектами могут быть определены через временные последовательности. Например, изменение цен на золото в один день может зависеть от цен в предыдущие дни, а также от внешних факторов, таких как цены на другие драгоценные металлы, цены на нефть, экономические условия и рыночные тренды.

Примеры бизнес-целей Оптимизация инвестиционных решений: Анализ исторических данных о ценах на золото может помочь инвесторам принимать более обоснованные решения о покупке или продаже золота. Управление рисками: Понимание факторов, влияющих на цены на золото, может помочь компаниям и инвесторам минимизировать риски, связанные с колебаниями цен.

Эффект для бизнеса Эти бизнес-цели могут привести к увеличению доходов, привлечению новых инвесторов и повышению общей финансовой устойчивости компаний, работающих с золотом.

Примеры целей технического проекта Для управления рисками: Создание системы мониторинга, которая будет отслеживать изменения цен на золото и другие факторы, влияющие на рынок, и предоставлять рекомендации по управлению рисками.

Входные данные: Данные о ценах на золото, включая дату, цену открытия, максимальную и минимальную цены, цену закрытия, скорректированную цену закрытия и объем торгов.

Целевой признак: Целевым признаком может быть скорректированная цена закрытия золота на следующий день, что позволит строить модели для прогнозирования будущих цен.

In [38]:
dfGold = pd.read_csv("data/gold.csv", index_col="Date")

dfGold.info()

display(dfGold.shape)

dfGold.head()
<class 'pandas.core.frame.DataFrame'>
Index: 1718 entries, 2011-12-15 to 2018-12-31
Data columns (total 80 columns):
 #   Column         Non-Null Count  Dtype  
---  ------         --------------  -----  
 0   Open           1718 non-null   float64
 1   High           1718 non-null   float64
 2   Low            1718 non-null   float64
 3   Close          1718 non-null   float64
 4   Adj Close      1718 non-null   float64
 5   Volume         1718 non-null   int64  
 6   SP_open        1718 non-null   float64
 7   SP_high        1718 non-null   float64
 8   SP_low         1718 non-null   float64
 9   SP_close       1718 non-null   float64
 10  SP_Ajclose     1718 non-null   float64
 11  SP_volume      1718 non-null   int64  
 12  DJ_open        1718 non-null   float64
 13  DJ_high        1718 non-null   float64
 14  DJ_low         1718 non-null   float64
 15  DJ_close       1718 non-null   float64
 16  DJ_Ajclose     1718 non-null   float64
 17  DJ_volume      1718 non-null   int64  
 18  EG_open        1718 non-null   float64
 19  EG_high        1718 non-null   float64
 20  EG_low         1718 non-null   float64
 21  EG_close       1718 non-null   float64
 22  EG_Ajclose     1718 non-null   float64
 23  EG_volume      1718 non-null   int64  
 24  EU_Price       1718 non-null   float64
 25  EU_open        1718 non-null   float64
 26  EU_high        1718 non-null   float64
 27  EU_low         1718 non-null   float64
 28  EU_Trend       1718 non-null   int64  
 29  OF_Price       1718 non-null   float64
 30  OF_Open        1718 non-null   float64
 31  OF_High        1718 non-null   float64
 32  OF_Low         1718 non-null   float64
 33  OF_Volume      1718 non-null   int64  
 34  OF_Trend       1718 non-null   int64  
 35  OS_Price       1718 non-null   float64
 36  OS_Open        1718 non-null   float64
 37  OS_High        1718 non-null   float64
 38  OS_Low         1718 non-null   float64
 39  OS_Trend       1718 non-null   int64  
 40  SF_Price       1718 non-null   int64  
 41  SF_Open        1718 non-null   int64  
 42  SF_High        1718 non-null   int64  
 43  SF_Low         1718 non-null   int64  
 44  SF_Volume      1718 non-null   int64  
 45  SF_Trend       1718 non-null   int64  
 46  USB_Price      1718 non-null   float64
 47  USB_Open       1718 non-null   float64
 48  USB_High       1718 non-null   float64
 49  USB_Low        1718 non-null   float64
 50  USB_Trend      1718 non-null   int64  
 51  PLT_Price      1718 non-null   float64
 52  PLT_Open       1718 non-null   float64
 53  PLT_High       1718 non-null   float64
 54  PLT_Low        1718 non-null   float64
 55  PLT_Trend      1718 non-null   int64  
 56  PLD_Price      1718 non-null   float64
 57  PLD_Open       1718 non-null   float64
 58  PLD_High       1718 non-null   float64
 59  PLD_Low        1718 non-null   float64
 60  PLD_Trend      1718 non-null   int64  
 61  RHO_PRICE      1718 non-null   int64  
 62  USDI_Price     1718 non-null   float64
 63  USDI_Open      1718 non-null   float64
 64  USDI_High      1718 non-null   float64
 65  USDI_Low       1718 non-null   float64
 66  USDI_Volume    1718 non-null   int64  
 67  USDI_Trend     1718 non-null   int64  
 68  GDX_Open       1718 non-null   float64
 69  GDX_High       1718 non-null   float64
 70  GDX_Low        1718 non-null   float64
 71  GDX_Close      1718 non-null   float64
 72  GDX_Adj Close  1718 non-null   float64
 73  GDX_Volume     1718 non-null   int64  
 74  USO_Open       1718 non-null   float64
 75  USO_High       1718 non-null   float64
 76  USO_Low        1718 non-null   float64
 77  USO_Close      1718 non-null   float64
 78  USO_Adj Close  1718 non-null   float64
 79  USO_Volume     1718 non-null   int64  
dtypes: float64(58), int64(22)
memory usage: 1.1+ MB
(1718, 80)
Out[38]:
Open High Low Close Adj Close Volume SP_open SP_high SP_low SP_close ... GDX_Low GDX_Close GDX_Adj Close GDX_Volume USO_Open USO_High USO_Low USO_Close USO_Adj Close USO_Volume
Date
2011-12-15 154.740005 154.949997 151.710007 152.330002 152.330002 21521900 123.029999 123.199997 121.989998 122.180000 ... 51.570000 51.680000 48.973877 20605600 36.900002 36.939999 36.049999 36.130001 36.130001 12616700
2011-12-16 154.309998 155.369995 153.899994 155.229996 155.229996 18124300 122.230003 122.949997 121.300003 121.589996 ... 52.040001 52.680000 49.921513 16285400 36.180000 36.500000 35.730000 36.270000 36.270000 12578800
2011-12-19 155.479996 155.860001 154.360001 154.869995 154.869995 12547200 122.059998 122.320000 120.029999 120.290001 ... 51.029999 51.169998 48.490578 15120200 36.389999 36.450001 35.930000 36.200001 36.200001 7418200
2011-12-20 156.820007 157.429993 156.580002 156.979996 156.979996 9136300 122.180000 124.139999 120.370003 123.930000 ... 52.369999 52.990002 50.215282 11644900 37.299999 37.610001 37.220001 37.560001 37.560001 10041600
2011-12-21 156.979996 157.529999 156.130005 157.160004 157.160004 11996100 123.930000 124.360001 122.750000 124.169998 ... 52.419998 52.959999 50.186852 8724300 37.669998 38.240002 37.520000 38.110001 38.110001 10728000

5 rows × 80 columns

Пустые значения

In [41]:
# Количество пустых значений признаков
display(dfGold.isnull().sum())
display()

# Есть ли пустые значения признаков
display(dfGold.isnull().any())
display()

# Процент пустых значений признаков
for i in dfGold.columns:
    null_rate = dfGold[i].isnull().sum() / len(dfGold) * 100
    if null_rate > 0:
        display(f"{i} процент пустых значений: %{null_rate:.2f}")
Open             0
High             0
Low              0
Close            0
Adj Close        0
                ..
USO_High         0
USO_Low          0
USO_Close        0
USO_Adj Close    0
USO_Volume       0
Length: 80, dtype: int64
Open             False
High             False
Low              False
Close            False
Adj Close        False
                 ...  
USO_High         False
USO_Low          False
USO_Close        False
USO_Adj Close    False
USO_Volume       False
Length: 80, dtype: bool

Заполение пустых значений для данного набора так же не требуется.

Создание выборок данных

In [67]:
# Вывод распределения количества наблюдений по меркам
from src.utils import split_stratified_into_train_val_test

display((dfGold.USB_Trend).value_counts())
display()

selected_columns = ["Open", "High", "Low", "USB_Trend"]
dfGold["USB_Trend"] = round(dfGold["USB_Trend"])
data = dfGold[selected_columns].copy()

# Создание выборок
dfGold_train, dfGold_val, dfGold_test, y_train, y_val, y_test = (
    split_stratified_into_train_val_test(
        data,
        stratify_colname="USB_Trend",
        frac_train=0.60,
        frac_val=0.20,
        frac_test=0.20,
    )
)

# Используем display для вывода информации о выборках
display("Обучающая выборка: ", dfGold_train.shape)
display(round(dfGold_train.USB_Trend).value_counts())

display("Контрольная выборка: ", dfGold_val.shape)
display(round(dfGold_val.USB_Trend).value_counts())

display("Тестовая выборка: ", dfGold_test.shape)
display(round(dfGold_test.USB_Trend).value_counts())
USB_Trend
0    876
1    842
Name: count, dtype: int64
'Обучающая выборка: '
(1030, 4)
USB_Trend
0    525
1    505
Name: count, dtype: int64
'Контрольная выборка: '
(344, 4)
USB_Trend
0    176
1    168
Name: count, dtype: int64
'Тестовая выборка: '
(344, 4)
USB_Trend
0    175
1    169
Name: count, dtype: int64
In [81]:
from imblearn.under_sampling import RandomUnderSampler

# Создание экземпляра RandomUnderSampler
rus = RandomUnderSampler(
    sampling_strategy="auto"
)  # 'auto' будет пытаться сбалансировать классы

display("Обучающая выборка: ", dfGold_train.shape)
display(dfGold_train.USB_Trend.value_counts())


# Разделение признаков и целевой переменной
X = dfGold_train.drop(columns=["USB_Trend"])
y = dfGold_train["USB_Trend"]

# Применение undersampling
X_resampled, y_resampled = rus.fit_resample(X, y)

# Создание нового DataFrame
dfGold_train_undersampled = pd.DataFrame(X_resampled)
dfGold_train_undersampled["USB_Trend"] = y_resampled

display("Обучающая выборка после undersampling: ", dfGold_train_undersampled.shape)
display(dfGold_train_undersampled.USB_Trend.value_counts())

dfGold_train_undersampled
'Обучающая выборка: '
(1030, 4)
USB_Trend
0    525
1    505
Name: count, dtype: int64
'Обучающая выборка после undersampling: '
(1010, 4)
USB_Trend
0    505
1    505
Name: count, dtype: int64
Out[81]:
Open High Low USB_Trend
Date
2016-04-27 118.970001 119.699997 118.430000 0
2017-02-16 117.930000 118.349998 117.830002 0
2016-11-15 116.459999 117.239998 116.290001 0
2016-11-07 122.660004 122.709999 121.879997 0
2018-04-30 124.410004 125.199997 124.190002 0
... ... ... ... ...
2012-07-13 153.449997 154.940002 153.440002 1
2016-05-25 116.589996 117.059998 116.320000 1
2016-03-02 118.339996 118.970001 118.070000 1
2013-08-05 126.510002 126.639999 125.339996 1
2013-06-20 125.220001 126.379997 123.330002 1

1010 rows × 4 columns

ДАТАСЕТ МАРКЕТИНГОВАЯ КОМПАНИЯ