MII/mai/lab2.ipynb

573 lines
92 KiB
Plaintext
Raw Permalink Normal View History

2024-09-28 10:43:58 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Лабораторная работа 2\n",
"\n",
"Вариант - 9\n",
"\n",
"Датасеты - магазины\n",
"\n",
"1. Цены на кофе\thttps://www.kaggle.com/datasets/mayankanand2701/starbucks-stock-price-dataset\n",
"2. Цены на акции\thttps://www.kaggle.com/datasets/nancyalaswad90/yamana-gold-inc-stock-price\n",
"3. Цены на золото\thttps://www.kaggle.com/datasets/sid321axn/gold-price-prediction-dataset\n"
]
},
{
"cell_type": "code",
2024-09-28 14:38:22 +04:00
"execution_count": 7,
2024-09-28 10:43:58 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['id', 'carat', 'cut', 'color', 'clarity', 'depth', 'table', 'price',\n",
" 'x', 'y', 'z'],\n",
" dtype='object')\n",
"Зашумленные столбцы: []\n",
"Смещение: id 0.000000\n",
"carat 1.116705\n",
"cut -0.717161\n",
"color -0.189454\n",
"clarity 0.551503\n",
"depth -0.082187\n",
"table 0.796836\n",
"price 1.618476\n",
"x 0.378685\n",
"y 2.434233\n",
"z 1.522481\n",
"dtype: float64\n",
"Сильно смещенные столбцы: ['carat', 'price', 'y', 'z']\n",
"Данные 2022 года, возможна неактуальность\n",
"Выбросы в столбце 'carat':\n",
"12246 2.06\n",
"13002 2.14\n",
"13118 2.15\n",
"13757 2.22\n",
"13991 2.01\n",
" ... \n",
"27741 2.15\n",
"27742 2.04\n",
"27744 2.29\n",
"27746 2.07\n",
"27749 2.29\n",
"Name: carat, Length: 1889, dtype: float64\n",
"\n",
"Выбросы в столбце 'cut':\n",
"Series([], Name: cut, dtype: int64)\n",
"\n",
"Выбросы в столбце 'color':\n",
"Series([], Name: color, dtype: int64)\n",
"\n",
"Выбросы в столбце 'clarity':\n",
"Series([], Name: clarity, dtype: int64)\n",
"\n",
"Выбросы в столбце 'depth':\n",
"2 56.9\n",
"8 65.1\n",
"24 58.1\n",
"35 58.2\n",
"42 65.2\n",
" ... \n",
"53882 65.4\n",
"53886 58.0\n",
"53890 57.9\n",
"53895 57.8\n",
"53927 58.1\n",
"Name: depth, Length: 2545, dtype: float64\n",
"\n",
"Выбросы в столбце 'table':\n",
"2 65.0\n",
"91 69.0\n",
"145 64.0\n",
"219 64.0\n",
"227 67.0\n",
" ... \n",
"53695 65.0\n",
"53697 65.0\n",
"53756 64.0\n",
"53757 64.0\n",
"53785 65.0\n",
"Name: table, Length: 605, dtype: float64\n",
"\n",
"Выбросы в столбце 'price':\n",
"23820 11886\n",
"23821 11886\n",
"23822 11888\n",
"23823 11888\n",
"23824 11888\n",
" ... \n",
"27745 18803\n",
"27746 18804\n",
"27747 18806\n",
"27748 18818\n",
"27749 18823\n",
"Name: price, Length: 3540, dtype: int64\n",
"\n",
"Выбросы в столбце 'x':\n",
"11182 0.00\n",
"11963 0.00\n",
"15951 0.00\n",
"22741 9.54\n",
"22831 9.38\n",
"23644 9.53\n",
"24131 9.44\n",
"24297 9.49\n",
"24328 9.65\n",
"24520 0.00\n",
"24816 9.42\n",
"25460 9.44\n",
"25850 9.32\n",
"25998 10.14\n",
"25999 10.02\n",
"26243 0.00\n",
"26431 9.42\n",
"26444 10.01\n",
"26534 9.86\n",
"26932 9.30\n",
"27130 10.00\n",
"27415 10.74\n",
"27429 0.00\n",
"27514 9.36\n",
"27630 10.23\n",
"27638 9.51\n",
"27649 9.44\n",
"27679 9.66\n",
"27684 9.35\n",
"27685 9.41\n",
"49556 0.00\n",
"49557 0.00\n",
"Name: x, dtype: float64\n",
"\n",
"Выбросы в столбце 'y':\n",
"11963 0.00\n",
"15951 0.00\n",
"22741 9.38\n",
"22831 9.31\n",
"23644 9.48\n",
"24067 58.90\n",
"24131 9.40\n",
"24297 9.42\n",
"24328 9.59\n",
"24520 0.00\n",
"25460 9.37\n",
"25998 10.10\n",
"25999 9.94\n",
"26243 0.00\n",
"26431 9.34\n",
"26444 9.94\n",
"26534 9.81\n",
"27130 9.85\n",
"27415 10.54\n",
"27429 0.00\n",
"27514 9.31\n",
"27630 10.16\n",
"27638 9.46\n",
"27649 9.38\n",
"27679 9.63\n",
"27685 9.32\n",
"49189 31.80\n",
"49556 0.00\n",
"49557 0.00\n",
"Name: y, dtype: float64\n",
"\n",
"Выбросы в столбце 'z':\n",
"2207 0.00\n",
"2314 0.00\n",
"4791 0.00\n",
"5471 0.00\n",
"10167 0.00\n",
"11182 0.00\n",
"11963 0.00\n",
"13601 0.00\n",
"14635 1.07\n",
"15951 0.00\n",
"16283 5.77\n",
"17196 5.76\n",
"19346 5.97\n",
"21758 5.98\n",
"22540 5.91\n",
"23539 5.79\n",
"23644 6.38\n",
"24067 8.06\n",
"24131 5.85\n",
"24297 5.92\n",
"24328 6.03\n",
"24394 0.00\n",
"24520 0.00\n",
"25998 6.17\n",
"25999 6.24\n",
"26100 5.75\n",
"26123 0.00\n",
"26194 6.16\n",
"26243 0.00\n",
"26431 6.27\n",
"26444 6.31\n",
"26534 6.13\n",
"26744 5.86\n",
"27112 0.00\n",
"27130 6.43\n",
"27415 6.98\n",
"27429 0.00\n",
"27503 0.00\n",
"27515 5.90\n",
"27516 5.90\n",
"27517 5.77\n",
"27518 5.77\n",
"27630 6.72\n",
"27679 6.03\n",
"27739 0.00\n",
"48410 31.80\n",
"49556 0.00\n",
"49557 0.00\n",
"51506 0.00\n",
"Name: z, dtype: float64\n",
2024-09-28 14:38:22 +04:00
"\n"
]
},
{
"data": {
"image/png": "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MjJMdHS0adCggTlz5ox7+meffWYkmfHjx2fZpieffDJf6xs0aJCx2+0e63NxOp3GGGPOnj1rMjMzPZ7bt2+fCQ4ONpMmTXJP+/bbb40kU7NmTXP69GmP+fPbxvr1640kM3v27HzFDwAu5JPs+6M45ZOEhAST3cdBV6z79u1zT6tfv75p165dvtYNABcjH2TfH8UpHzz00ENGkvm///s/93NpaWkmLi7O1KhRw/29Yd++fVm+GzRu3NhER0ebP//80z3tp59+Mna73QwaNMg9zZVz7rzzznzFjZKPU/aQo2nTpmnFihVasWKF5s6dqw4dOmjYsGH69NNP3fN88cUXCggI0AMPPOCx7KOPPipjjMddMyZMmKD69etr8ODBGjlypNq1a5dlOZfRo0e7/2+z2TR69GhlZGToq6++ynb+zMxMLV++XL1791bNmjXd02NiYnTXXXfpu+++U2pqaqH6ITsbNmzQ0aNHNXLkSIWEhLind+/eXfHx8dke2jpixIg823U6nVq0aJF69uzpcX69i+u0iuDgYPc1oDIzM/Xnn38qLCxMdevW1aZNm7IsN3jwYIWGhnpMK2gbAFBY5JOc+TqfAICVyAc583U++OKLL9S8eXOPU+jCwsI0fPhw7d+/Xzt27Mi2/cOHDysxMVFDhgxR+fLl3dMbNmyom266SV988UWWZe67774840bpQEEKOWrevLk6deqkTp06acCAAfr888919dVXuwdvSTpw4IBiY2MVHh7usazrENUDBw64pzkcDr3zzjvat2+f0tLSNHv27Gw/ENvtdo9BX5Lq1KkjSTneSvXYsWM6ffq06tatm+W5evXqyel06vfff8//xufBtV3ZrS8+Pt5juyUpMDBQV155ZZ7tHjt2TKmpqWrQoEGu8zmdTr366quqXbu2goODVbFiRVWqVElbtmxRSkpKlvnj4uIuuw0AKCzySc58nU8AwErkg5z5Oh8cOHAgx229OL6CxF2vXj0dP35cp06d8pie3XcTlE4UpJBvdrtdHTp00OHDh7Vnz55CtfHll19KunCnt8K24Y8uPhrJG5577jk98sgjatu2rebOnasvv/xSK1asUP369eV0OrPMf+nRUYVpAwC8hXxSeN7OJzkdKeW6GDAAFCXyQeF5Ox9YKbvvJiid/PMdDJ85f/68JOnkyZOSpOrVq+vQoUNKS0vzmG/nzp3u5122bNmiSZMm6Z577lGTJk00bNiwbI/EcTqd+vXXXz2m7d69W5KyXBDPpVKlSipTpox27dqV5bmdO3fKbreratWqkrxzmoJru7Jb365duzy2uyAqVaqkiIgIbdu2Ldf5Pv74Y3Xo0EH//ve/dccdd6hz587q1KmTkpOT872u/LbBaR0AigL55AJf55Ny5cpJUpaxP7tfwskHAIoC+eACX+eD6tWr57itF8eX3XKuGLNbtmLFiipbtmxBw0YpQUEK+Xbu3DktX75cDofDfejmzTffrMzMTL3xxhse87766quy2Wzq1q2be9khQ4YoNjZWU6dO1Zw5c5SUlKSHH34423Vd3J4xRm+88YaCgoLUsWPHbOcPCAhQ586dtXjxYo/DbpOSkvT++++rTZs2ioiIkCT3gFiQ4s2lrrvuOkVHR2vGjBlKT093T1+6dKl+/vlnde/evVDt2u129e7dW0uWLNG
"text/plain": [
"<Figure size 1200x800 with 10 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
2024-09-28 10:43:58 +04:00
"Просачивание данных: Высокая корреляция (0.92) между столбцами 'carat' и 'price'\n",
"Просачивание данных: Высокая корреляция (0.98) между столбцами 'carat' и 'x'\n",
"Просачивание данных: Высокая корреляция (0.95) между столбцами 'carat' и 'y'\n",
"Просачивание данных: Высокая корреляция (0.95) между столбцами 'carat' и 'z'\n",
"Просачивание данных: Высокая корреляция (0.92) между столбцами 'price' и 'carat'\n",
"Просачивание данных: Высокая корреляция (0.98) между столбцами 'x' и 'carat'\n",
"Просачивание данных: Высокая корреляция (0.97) между столбцами 'x' и 'y'\n",
"Просачивание данных: Высокая корреляция (0.97) между столбцами 'x' и 'z'\n",
"Просачивание данных: Высокая корреляция (0.95) между столбцами 'y' и 'carat'\n",
"Просачивание данных: Высокая корреляция (0.97) между столбцами 'y' и 'x'\n",
"Просачивание данных: Высокая корреляция (0.95) между столбцами 'y' и 'z'\n",
"Просачивание данных: Высокая корреляция (0.95) между столбцами 'z' и 'carat'\n",
"Просачивание данных: Высокая корреляция (0.97) между столбцами 'z' и 'x'\n",
"Просачивание данных: Высокая корреляция (0.95) между столбцами 'z' и 'y'\n",
2024-09-28 14:38:22 +04:00
"Пример оценки информативности для целевой переменной 'price'\n",
"id 8.136888\n",
"carat 1.961910\n",
"log_carat 1.961630\n",
"y 1.494661\n",
"x 1.481508\n",
"z 1.431517\n",
"clarity 0.364394\n",
"color 0.286463\n",
"cut 0.104701\n",
"table 0.052611\n",
"depth 0.034731\n",
2024-09-28 10:43:58 +04:00
"dtype: float64\n",
"Index(['carat', 'price', 'cut'], dtype='object')\n",
"Обучающая выборка: (32365, 3)\n",
"carat\n",
2024-09-28 14:38:22 +04:00
"0.30 1503\n",
"1.01 1363\n",
"0.31 1326\n",
"0.70 1191\n",
"0.32 1136\n",
2024-09-28 10:43:58 +04:00
" ... \n",
2024-09-28 14:38:22 +04:00
"2.55 1\n",
"0.22 1\n",
2024-09-28 10:43:58 +04:00
"1.92 1\n",
2024-09-28 14:38:22 +04:00
"2.74 1\n",
"3.67 1\n",
"Name: count, Length: 265, dtype: int64\n",
2024-09-28 10:43:58 +04:00
"Контрольная выборка: (10789, 3)\n",
"carat\n",
2024-09-28 14:38:22 +04:00
"0.30 555\n",
"0.31 456\n",
"0.70 438\n",
"1.01 417\n",
"0.32 380\n",
2024-09-28 10:43:58 +04:00
" ... \n",
2024-09-28 14:38:22 +04:00
"1.68 1\n",
"2.57 1\n",
"2.53 1\n",
"1.93 1\n",
"2.66 1\n",
"Name: count, Length: 231, dtype: int64\n",
2024-09-28 10:43:58 +04:00
"Тестовая выборка: (10789, 3)\n",
"carat\n",
2024-09-28 14:38:22 +04:00
"0.30 546\n",
"0.31 467\n",
"1.01 462\n",
"0.70 353\n",
"0.32 324\n",
2024-09-28 10:43:58 +04:00
" ... \n",
2024-09-28 14:38:22 +04:00
"2.53 1\n",
"1.81 1\n",
"2.55 1\n",
"3.05 1\n",
"1.45 1\n",
"Name: count, Length: 232, dtype: int64\n",
"Обучающая выборка после oversampling: (64069, 3)\n",
2024-09-28 10:43:58 +04:00
"carat\n",
2024-09-28 14:38:22 +04:00
"1.010000 1837\n",
"0.700000 1834\n",
"0.300000 1589\n",
"1.000000 1417\n",
"0.310000 1385\n",
" ... \n",
"1.335296 1\n",
"1.183497 1\n",
"1.296552 1\n",
"2.003477 1\n",
"0.780485 1\n",
"Name: count, Length: 28027, dtype: int64\n"
2024-09-28 10:43:58 +04:00
]
}
],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"from sklearn.feature_selection import mutual_info_regression\n",
"from sklearn.model_selection import train_test_split\n",
"from imblearn.over_sampling import ADASYN\n",
2024-09-28 14:38:22 +04:00
"from imblearn.under_sampling import RandomUnderSampler\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
2024-09-28 10:43:58 +04:00
"\n",
"df = pd.read_csv(\"data/Diamonds.csv\")\n",
"print(df.columns)\n",
"\n",
"noisy_features = []\n",
"for col in df.columns:\n",
" if df[col].isnull().sum() / len(df) > 0.1: # Если более 10% пропусков\n",
" noisy_features.append(col)\n",
"print(f\"Зашумленные столбцы: {noisy_features}\")\n",
"\n",
"cut_mapping = {'Fair': 0, 'Good': 1, 'Very Good': 2, 'Premium': 3, 'Ideal': 4}\n",
"df['cut'] = df['cut'].map(cut_mapping)\n",
"\n",
"color_mapping = {'J': 0, 'I': 1, 'H': 2, 'G': 3, 'F': 4, 'E': 5, 'D': 6} \n",
"df['color'] = df['color'].map(color_mapping)\n",
"\n",
"clarity_mapping = {'I1': 0, 'SI2': 1, 'SI1': 2, 'VS2': 3, 'VS1': 4, 'VVS2': 5, 'VVS1': 6, 'IF': 7} \n",
"df['clarity'] = df['clarity'].map(clarity_mapping)\n",
"\n",
"skewness = df.skew()\n",
"print(f\"Смещение: {skewness}\")\n",
"\n",
"skewed_features = skewness[abs(skewness) > 1].index.tolist()\n",
"print(f\"Сильно смещенные столбцы: {skewed_features}\")\n",
"\n",
"for col in df.select_dtypes(include=['number']).columns:\n",
2024-09-28 14:38:22 +04:00
" if col == 'id':\n",
" continue\n",
2024-09-28 10:43:58 +04:00
" Q1 = df[col].quantile(0.25)\n",
" Q3 = df[col].quantile(0.75)\n",
" IQR = Q3 - Q1\n",
" lower_bound = Q1 - 1.5 * IQR\n",
" upper_bound = Q3 + 1.5 * IQR\n",
" outliers = df[col][(df[col] < lower_bound) | (df[col] > upper_bound)]\n",
" print(f\"Выбросы в столбце '{col}':\\n{outliers}\\n\")\n",
"\n",
2024-09-28 14:38:22 +04:00
"numeric_cols = df.select_dtypes(include=['number']).columns\n",
"numeric_cols = [col for col in numeric_cols if col != 'id']\n",
"\n",
"plt.figure(figsize=(12, 8))\n",
"\n",
"for i, col in enumerate(numeric_cols, 1):\n",
" plt.subplot(len(numeric_cols) // 3 + 1, 3, i) \n",
" sns.boxplot(data=df, x=col)\n",
" plt.title(f'Boxplot for {col}')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
2024-09-28 10:43:58 +04:00
"if len(df.columns) >= 2:\n",
" for col1 in df.columns:\n",
" for col2 in df.columns:\n",
" if col1 != col2:\n",
" correlation = df[col1].corr(df[col2])\n",
" if abs(correlation) > 0.9:\n",
" print(f\"Просачивание данных: Высокая корреляция ({correlation:.2f}) между столбцами '{col1}' и '{col2}'\")\n",
"\n",
"df['log_carat'] = np.log(df['carat'] + 1)\n",
"\n",
"df['cut'] = df['cut'].fillna('unknown')\n",
"\n",
"df['carat'] = df['carat'].fillna(df['carat'].mean())\n",
"\n",
"def split_stratified_into_train_val_test(\n",
" df_input,\n",
" stratify_colname=\"y\",\n",
" frac_train=0.6,\n",
" frac_val=0.15,\n",
" frac_test=0.25,\n",
" random_state=None,\n",
"):\n",
" if frac_train + frac_val + frac_test != 1.0:\n",
" raise ValueError(\n",
" \"fractions %f, %f, %f do not add up to 1.0\"\n",
" % (frac_train, frac_val, frac_test)\n",
" )\n",
"\n",
" if stratify_colname not in df_input.columns:\n",
" raise ValueError(\"%s is not a column in the dataframe\" % (stratify_colname))\n",
"\n",
2024-09-28 14:38:22 +04:00
" X = df_input \n",
2024-09-28 10:43:58 +04:00
" y = df_input[\n",
" [stratify_colname]\n",
2024-09-28 14:38:22 +04:00
" ] \n",
2024-09-28 10:43:58 +04:00
"\n",
" df_train, df_temp, y_train, y_temp = train_test_split(\n",
" X, y, stratify=y, test_size=(1.0 - frac_train), random_state=random_state\n",
" )\n",
"\n",
" relative_frac_test = frac_test / (frac_val + frac_test)\n",
" df_val, df_test, y_val, y_test = train_test_split(\n",
" df_temp,\n",
" y_temp,\n",
" stratify=y_temp,\n",
" test_size=relative_frac_test,\n",
" random_state=random_state,\n",
" )\n",
"\n",
" assert len(df_input) == len(df_train) + len(df_val) + len(df_test)\n",
"\n",
" return df_train, df_val, df_test\n",
"\n",
"data = df[[\"carat\", \"price\", \"cut\"]].copy()\n",
"\n",
"df_train, df_val, df_test = split_stratified_into_train_val_test(\n",
" data, stratify_colname=\"cut\", frac_train=0.60, frac_val=0.20, frac_test=0.20\n",
")\n",
" \n",
"print(df_train.columns) \n",
" \n",
"print(\"Обучающая выборка: \", df_train.shape)\n",
"print(df_train.carat.value_counts()) \n",
"\n",
"print(\"Контрольная выборка: \", df_val.shape)\n",
"print(df_val.carat.value_counts())\n",
"\n",
"print(\"Тестовая выборка: \", df_test.shape)\n",
"print(df_test.carat.value_counts())\n",
"\n",
"ada = ADASYN()\n",
"\n",
2024-09-28 14:38:22 +04:00
"X_resampled, y_resampled = ada.fit_resample(df_train, df_train[\"cut\"])\n",
2024-09-28 10:43:58 +04:00
"df_train_adasyn = pd.DataFrame(X_resampled)\n",
"\n",
"print(\"Обучающая выборка после oversampling: \", df_train_adasyn.shape)\n",
2024-09-28 14:38:22 +04:00
"print(df_train_adasyn.carat.value_counts())\n"
2024-09-28 10:43:58 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Датасет 1. Цены бриллиантов**\n",
"1. **carat**: Вес бриллианта в каратах\n",
"2. **cut**: Качество огранки.\n",
"3. **color**: Цвет бриллианта\n",
"4. **clarity**: Чистота бриллианта\n",
"5. **depth**: Процент глубины бриллианта\n",
"6. **table**: Процент ширины бриллианта\n",
"7. **price**: Цена бриллианта в долларах США\n",
"8. **x**: Длина бриллианта в миллиметрах\n",
"9. **y**: Ширина бриллианта в миллиметрах\n",
"10. **z**: Глубина бриллианта в миллиметрах\n",
"\n",
"**Объект наблюдения**: Каждый объект представляет собой отдельный бриллиант.\\\n",
"**Связи между объектами**: Внутри одного объекта есть взаимосвязь между характеристиками и его ценой. Например, вес, цвет, чистота и огранка могут влиять на цену.\\\n",
"**Бизнес-цель**: Оптимизация продаж бриллиантов, оценка цен в зависимости от характеристик.\\\n",
"**Эффект для бизнеса**: Более точная оценка стоимости бриллиантов может помочь ювелирам предлагать конкурентоспособные цены и максимизировать прибыль.\\\n",
"**Техническая цель**: Построение модели машинного обучения для прогнозирования цены бриллианта на основе его характеристик.\\\n",
"* **Вход**: Характеристики бриллианта (вес, огранка, цвет, чистота, размеры).\\\n",
"* **Целевой признак**: Цена бриллианта. \n",
"\n",
"**Информативность**: Высокая. Набор данных содержит важные характеристики бриллиантов, которые влияют на их цену: карат, огранка, цвет, чистота, размеры.\\\n",
"**Степень покрытия**: Высокая. В наборе данных представлено 53 940 бриллиантов, что является достаточно большим объемом для анализа. \\\n",
"**Соответствие реальным данным**: Высокая. Характеристики бриллиантов в наборе данных соответствуют реальным характеристикам бриллиантов, определяемым геммологами. \\\n",
"**Согласованность меток**: Высокая. В данном наборе данных нет проблем с несогласованностью меток, так как все данные соответствуют описанию в заголовках столбцов. \n",
"\n",
"**Датасет 2. Цены акций Starbucks**\n",
"1. **Date**: Дата торгов\n",
"2. **Open**: Цена открытия торгов\n",
"3. **High**: Максимальная цена акции за день\n",
"4. **Low**: Минимальная цена акции за день\n",
"5. **Close**: Цена закрытия торгов в данный день\n",
"6. **Adj Close**: Скоректированная цена закрытия.\n",
"7. **Volume**: Объем торгов акциями в данный день.\n",
"\n",
"**Объект наблюдения**: Объектом наблюдения является торговый день на рынке акций компании Starbucks.\\\n",
"**Связи между объектами**: Временная связь между днями торгов. Важна динамика изменений цен и объемов торгов в зависимости от времени.\\\n",
"**Бизнес-цель**: Прогнозирование цен акций для управления портфелем акций.\\\n",
"**Эффект для бизнеса**: Прогнозирование позволит трейдерам принимать более информированные решения, оптимизировать инвестиции и минимизировать риски.\\\n",
"**Техническая цель**: Прогнозирование цены закрытия акций на основе временных рядов.\\\n",
"* **Вход**: Временные ряды с историческими данными по ценам открытия, закрытия, объёмам.\\\n",
"* **Целевой признак**: Цена закрытия на следующий день.\n",
"\n",
"**Датасет 3. Цены на золото**\n",
"1. **Date**: Дата\n",
"2. **Open**: Цена открытия торгов\n",
"3. **High**: Максимальная цена за день\n",
"4. **Low**: Минимальная цена за день\n",
"5. **Close**: Цена закрытия торгов\n",
"6. **Adjusted Close**: Скоректированная цена закрытия\n",
"7. **Volume**: Объем торгов за день\n",
"\n",
"**Дополнительные столбцы (факторы, влияющие на цену золота):**\n",
"\n",
"8. **SP_open**, **SP_high**, **SP_low**, **SP_close**, **SP_Ajclose**, **SP_volume**: Данные индекса S&P 500.\n",
"9. **DJ_open**, **DJ_high**, **DJ_low**, **DJ_close**, **DJ_Ajclose**, **DJ_volume**: Данные индекса Dow Jones.\n",
"10. **EG_open**, **EG_high**, **EG_low**, **EG_close**, **EG_Ajclose**, **EG_volume**: Данные компании Eldorado Gold Corporation (EGO).\n",
"11. **EU_Price**, **EU_open**, **EU_high**, **EU_low**, **EU_Trend**: Курс валютной пары EUR/USD.\n",
"12. **OF_Price**, **OF_Open**, **OF_High**, **OF_Low**, **OF_Volume**, **OF_Trend**: Цена фьючерсов на нефть Brent.\n",
"13. **OS_Price**, **OS_Open**, **OS_High**, **OS_Low**, **OS_Trend**: Цена нефти WTI.\n",
"14. **SF_Price**, **SF_Open**, **SF_High**, **SF_Low**, **SF_Volume, SF_Trend**: Цена фьючерсов на серебро.\n",
"15. **USB_Price**, **USB_Open**, **USB_High**, **USB_Low**, **USB_Trend**: Ставка по облигациям США.\n",
"16. **PLT_Price**, **PLT_Open**, **PLT_High**, **PLT_Low**, **PLT_Trend**: Цена платины.\n",
"17. **PLD_Price**, **PLD_Open**, **PLD_High**, **PLD_Low**, **PLD_Trend**: Цена палладия.\n",
"18. **RHO_PRICE**: Цена родия.\n",
"19. **USDI_Price**, **USDI_Open**, **USDI_High**, **USDI_Low**, **USDI_Volume**, **USDI_Trend**: Индекс доллара США.\n",
"20. **GDX_Open**, **GDX_High**, **GDX_Low**, **GDX_Close**, **GDX_Adj Close**, **GDX_Volume**: Данные ETF на золотые шахты.\n",
"21. **USO_Open**, **USO_High**, **USO_Low**, **USO_Close**, **USO_Adj Close**, **USO_Volume**: Данные ETF на нефть USO.\n",
"\n",
"**Объект наблюдения**: Объектом наблюдения является торговый день для цены золота с дополнительными факторами влияния.\\\n",
"**Связи между объектами**: Взаимосвязь между движением цен на золото и другими экономическими показателями и активами (например, нефть, фондовые индексы). Золото часто коррелирует с другими активами в периоды нестабильности.\\\n",
"**Бизнес-цель**: Управление инвестициями в золото и связанные активы (нефть, индексы).\\\n",
"**Эффект для бизнеса**: Правильное прогнозирование цен на золото и связанных активов может помочь инвесторам защитить капитал.\\\n",
"**Техническая цель**: Построение модели для анализа взаимосвязи между ценами на золото и дополнительными факторами (нефть, фондовые индексы, валютные курсы).\n",
"* **Вход**: Данные по ценам на золото и дополнительным факторам (нефть, индексы, валюты).\\\n",
"* **Целевой признак**: Цена закрытия золота."
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}