dd/MDA/project/Main.ipynb

211 lines
87 KiB
Plaintext
Raw Normal View History

2025-02-13 11:06:03 +04:00
{
"metadata": {
"kernelspec": {
"name": "python",
"display_name": "Python (Pyodide)",
"language": "python"
},
"language_info": {
"codemirror_mode": {
"name": "python",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8"
}
},
"nbformat_minor": 5,
"nbformat": 4,
"cells": [
{
"id": "7669f948-8d8e-460f-a6b4-e4358db9ec58",
"cell_type": "code",
"source": "import matplotlib.pyplot as plt\nimport pandas as pd\nfrom sklearn.preprocessing import StandardScaler, MinMaxScaler\nfrom statsmodels.tsa.holtwinters import ExponentialSmoothing",
"metadata": {
"trusted": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": "Matplotlib is building the font cache; this may take a moment.\n"
}
],
"execution_count": 1
},
{
"id": "b0fa9e7b-c123-4b1e-8918-2397e77429c8",
"cell_type": "markdown",
"source": "Определим функцию сглаживания временного ряда, она понадобится позже\nНапример:\n1. Метод скользящего окна. Параметр window задает ширину окна усреднения значений.\n\n ``return ts.rolling(window=5).mean()``\n\n2. Метод экспоненциального сглаживания (метод Хольта-Уинтерса)\n\n\n варианты для параметра trend: \"add\", \"mul\", \"additive\", \"multiplicative\", None\n\n\n варианты для параметра seasonal: \"add\", \"mul\", \"additive\", \"multiplicative\", None\n\n\n seasonal_periods задает для модели предполагаемый интервал сезонности, когда ВР будет иметь похожие уровни и тенденции\n\n ``model = ExponentialSmoothing(ts, trend=\"additive\", seasonal=\"additive\", seasonal_periods=5)``\n ``return model.fit().fittedvalues``",
"metadata": {}
},
{
"id": "b1525171-5f8b-410e-8b04-599757b1afe1",
"cell_type": "code",
"source": "def smooth_time_series(ts):\n model = ExponentialSmoothing(ts, trend=\"additive\", seasonal=\"additive\", seasonal_periods=5)\n return model.fit().fittedvalues",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": 2
},
{
"id": "6e2859e5-739e-4b49-8999-4a54aeebb903",
"cell_type": "markdown",
"source": "Для чтения из файла необходимо взять временные ряды из предложенных наборов и сохранить в csv файл как показано в примере, сформировав датасет",
"metadata": {}
},
{
"id": "64bdc662-a64e-43be-a3d6-f4327b29f477",
"cell_type": "code",
"source": "dataset = pd.read_csv(\"ts2.csv\", delimiter=\";\")",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": 3
},
{
"id": "345981a3-8b6d-42dc-b5ab-aed2bdcce8d8",
"cell_type": "markdown",
"source": "после того как файл был прочтен, можно вывести содержимое временных рядов в консоль",
"metadata": {}
},
{
"id": "c228b5b9-5bfb-4786-887d-857d9b3409c7",
"cell_type": "code",
"source": "print(dataset)",
"metadata": {
"trusted": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": " first second third\n0 3 2.500000 1\n1 2 2.833333 2\n2 3 2.966667 3\n3 3 3.066667 4\n4 4 4.383333 5\n5 6 6.466667 6\n6 5 5.416667 7\n7 5 5.433333 8\n8 5 5.583333 9\n9 5 5.683333 10\n10 5 5.150000 11\n11 5 5.633333 12\n12 6 6.033333 13\n13 12 12.866667 14\n14 6 6.783333 15\n15 6 6.500000 16\n"
}
],
"execution_count": 4
},
{
"id": "e53b79b2-74e0-492d-bcab-5f3c47c25175",
"cell_type": "markdown",
"source": "Для выполнения первой части задания необходимо подобрать метод и параметры сглаживания временного ряда. Для этого выше реализован пример функции ``smooth_time_series``",
"metadata": {}
},
{
"id": "74674c95-9af6-4b5a-ab08-30fe89c4e05e",
"cell_type": "code",
"source": "sds = dataset.apply(smooth_time_series)\n\nplt.plot(sds)\nplt.plot(dataset)\nplt.legend(['sm first', 'sm second', 'sm third', 'first', 'second', 'third'])\nplt.show()",
"metadata": {
"trusted": true
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGdCAYAAACyzRGfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACxPElEQVR4nOzdd3hT1RvA8e/NTtNFSyd0sSmUoSgKypDtQHAguMCFW5aAiCKggCAIiDgAhZ8DRUEUFRBEkSVllr1podA96EjbNOP+/rg0UCnQQtu05Xyepw9pcnPvmwLNm3Pe8x5JlmUZQRAEQRCESqJydQCCIAiCINxYRPIhCIIgCEKlEsmHIAiCIAiVSiQfgiAIgiBUKpF8CIIgCIJQqUTyIQiCIAhCpRLJhyAIgiAIlUokH4IgCIIgVCqNqwP4L4fDQUJCAh4eHkiS5OpwBEEQBEEoBVmWycnJITg4GJXqymMbVS75SEhIICQkxNVhCIIgCIJwDeLj46lbt+4Vj6lyyYeHhwegBO/p6eniaARBEARBKI3s7GxCQkKc7+NXUuWSj6KpFk9PT5F8CIIgCEI1U5qSCVFwKgiCIAhCpRLJhyAIgiAIlUokH4IgCIIgVKoqV/NRGrIsY7PZsNvtrg5FqEBqtRqNRiOWXAuCINQw1S75KCwsJDExkby8PFeHIlQCNzc3goKC0Ol0rg5FEARBKCfVKvlwOBzExsaiVqsJDg5Gp9OJT8U1lCzLFBYWkpqaSmxsLA0bNrxq0xpBEASheqhWyUdhYSEOh4OQkBDc3NxcHY5QwYxGI1qtllOnTlFYWIjBYHB1SIIgCEI5qJYfJcUn4BuH+LsWBEGoecRvdkEQBEEQKlWZk48NGzZw3333ERwcjCRJ/Pzzz5ccc+jQIXr37o2Xlxcmk4lbbrmF06dPl0e8giAIgiBUc2VOPsxmMy1btmTu3LklPn7ixAnuuOMOmjRpwvr169m7dy9vv/22mK+vBLIsM3jwYHx8fJAkiZiYGDp16sTQoUNdHZogCIIgOJW54LRXr1706tXrso+PHTuWu+++m2nTpjnvq1+//rVFJ5TJ6tWrWbRoEevXr6devXrUrl2bn376Ca1We13nlSSJ5cuX06dPn/IJVBAEQbihlWvNh8Ph4Pfff6dRo0b06NEDf39/2rZtW+LUTBGLxUJ2dnaxL+HanDhxgqCgINq1a0dgYCAajQYfH58r7jBYWFhYiREKgiAIrmS1FTJr9hA+mjvcpXGUa/KRkpJCbm4u77//Pj179mTNmjX07duXBx54gH/++afE50yZMgUvLy/nV0hISJmuKcsyeYU2l3zJslzqOJcuXUpUVBRGoxFfX1+6du2K2WwGYNCgQfTp04fJkycTEBCAt7c3EydOxGazMXLkSHx8fKhbty4LFy687PkHDRrEq6++yunTp5EkifDwcIBLpl3Cw8N59913efLJJ/H09GTw4MEUFhbyyiuvEBQUhMFgICwsjClTpjiPB+jbt2+x8wqCIAjVS9zZI0wZ8Qj2LSewbDjCnsP/uiyWcu3z4XA4ALj//vsZNmwYAK1atWLLli189tlndOzY8ZLnjBkzhuHDL2Rg2dnZZUpA8q12Isf9cZ2RX5uDE3vgprv6jzAxMZEBAwYwbdo0+vbtS05ODhs3biyWvPz111/UrVuXDRs2sHnzZp555hm2bNlChw4diI6OZsmSJTz//PN069aNunXrXnKN2bNnU79+febNm8f27dtRq9WXjWf69OmMGzeOd955B4CPPvqIFStW8MMPPxAaGkp8fDzx8fEAbN++HX9/fxYuXEjPnj2veF5BEAShavp93dfsWfQdpkIVVrWDsId60LLJ7S6Lp1yTj9q1a6PRaIiMjCx2f9OmTdm0aVOJz9Hr9ej1+vIMo8pJTEzEZrPxwAMPEBYWBkBUVFSxY3x8fPjoo49QqVQ0btyYadOmkZeXx5tvvgkoSdr777/Ppk2b6N+//yXX8PLywsPDA7VaTWBg4BXjueuuuxgxYoTz+9OnT9OwYUPuuOMOJElyxgjg5+cHgLe391XPKwiCIFQthVYLH88ZgRwdhx4V5loSfYe/Q1Sjti6Nq1yTD51Oxy233MKRI0eK3X/06NFib2jlyahVc3Bijwo5d2muXRotW7akS5cuREVF0aNHD7p3785DDz1ErVq1nMc0a9asWEOtgIAAmjdv7vxerVbj6+tLSkrKdcfdpk2bYt8PGjSIbt260bhxY3r27Mm9995L9+7dr/s6giAIguuciD/It9PexJRiA8DWMoARw2ZhMl6+DrCylDn5yM3N5fjx487vY2NjiYmJwcfHh9DQUEaOHMkjjzxChw4d6Ny5M6tXr+bXX39l/fr15Rm3kyRJpZr6cCW1Ws3atWvZsmULa9asYc6cOYwdO5bo6GgiIiIALlmRIklSifcVTW1dD5PJVOz7m266idjYWFatWsWff/5Jv3796Nq1K0uXLr3uawmCIAiV75c/vuTg10sxWVVYNQ7qPXI3/Xq/4uqwnMpccLpjxw5at25N69atARg+fDitW7dm3LhxgFKY+NlnnzFt2jSioqJYsGABy5Yt44477ijfyKsZSZJo3749EyZMYPfu3eh0OpYvX+7qsJw8PT155JFHmD9/PkuWLGHZsmVkZGQASmJkt9tdHKEgCIJwNQWWPKZ/8ALHv/wJnVWF2UfF/RPeq1KJB1zDyEenTp2uusrj6aef5umnn77moGqa6Oho1q1bR/fu3fH39yc6OprU1FSaNm3q6tAA+PDDDwkKCqJ169aoVCp+/PFHAgMD8fb2BpQVL+vWraN9+/bo9fpi00WCIAhC1XAkbg9LPhiHKU35sOi4KZiRQ2ZiNJiu8szKV7XnK2oIT09PNmzYwKxZs8jOziYsLIwZM2ZcsVlbZfLw8GDatGkcO3YMtVrNLbfcwsqVK501KDNmzGD48OHMnz+fOnXqEBcX59qABUEQhGKWrfyco4t/wWRVUah10OjR+3nw7uddHdZlSXJZmlVUguzsbLy8vMjKysLT07PYYwUFBcTGxhIRESHatd8gxN+5IAjC5eUXmJkzayjq3YkAmGureWTkRBqHt6z0WK70/v1fYuRDEARBEKqhQ8d38eOM8ZgylIUIcpu6jHrtQwx6NxdHdnUi+RAEQRCEauaHFR9zcslKTDZlmiXyiYe4v0f1qbUUyYcgCIIgVBPm/Bw+/nAomr3JaFFh9tfw2KjJ1A+JvPqTqxCRfAiCIAhCNbDvaDTLP3wPU6ZSqindFs6olz/AoDO6OLKyE8mHIAiCIFRxi3+ayemlazHZVVh0DloOGsA9XZ5wdVjXTCQfgiAIglBFZZvPMXfGUHQH0pRplkAtT456n/A6jV0d2nURyYcgCIIgVEExh7awYuZkTFkgI6Np14A3XpqGTlv9N2MVyYcgCIIgVDFf//ABCT+vx2SXKNA7uOmpx+nV+VFXh1Vuyry3iyCUp/Xr1yNJEufOnXN1KIIgCC6XlZPB5HeeIGXZP2jsEuZgHU9O/ahGJR4gRj4EQRAEoUrYuX8Dv8+ehikbHMjoOzRmzPPvo9XoXB1auRPJhyAIgiC4kMPh4Kvvp5L86yZMDokCg4Nbn3uKbnc87OrQKoyYdqkkS5cuJSoqCqPRiK+vL127dsVsNgMwaNAg+vTpw+TJkwkICMDb25uJEydis9kYOXIkPj4+1K1bl4ULF17zNQAWLFhA06ZNMRgMNGnShE8++aTY88+cOcOAAQPw8fHBZDLRpk0boqOjnY9/+umn1K9fH51OR+PGjfn666+LPV+SJBYsWEDfvn1xc3OjYcOGrFixotgxK1eupFGjRhiNRjp37iw2qRME4YaWmZ3GlHFPkP7LZjQOCXNdPQOnza3RiQfUhJEPWQZrnmuurXUDSbrqYYmJiQwYMIBp06bRt29fcnJy2LhxIxfv6ffXX39Rt25dNmzYwObNm3nmmWfYsmULHTp0IDo6miVLlvD888/TrVs36tatW+ZrfPvtt4wbN46PP/6Y1q1bs3v3bp577jlMJhMDBw4kNzeXjh07UqdOHVasWEFgYCC7du3C4VD2D
},
"metadata": {}
}
],
"execution_count": 19
},
{
"id": "01e366c4-d7c0-4a01-85b7-f24c4383766d",
"cell_type": "markdown",
"source": "Выполним нормализацию. Варианты: MinMaxScaler; MaxAbsScaler; RobustScaler; StandardScaler",
"metadata": {}
},
{
"id": "e609b470-19b7-4f52-af0d-b2643e926779",
"cell_type": "code",
"source": "df = pd.DataFrame(MinMaxScaler().fit_transform(sds), columns=sds.columns)\nprint(df)",
"metadata": {
"trusted": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": " first second third\n0 0.032607 0.000000 0.000000\n1 0.000000 0.057355 0.066665\n2 0.113045 0.085473 0.133331\n3 0.452163 0.447628 0.199999\n4 0.169570 0.209032 0.266668\n5 0.306525 0.276186 0.333334\n6 0.273918 0.333541 0.399998\n7 0.386963 0.361659 0.466664\n8 0.726082 0.723814 0.533332\n9 0.443488 0.485218 0.600001\n10 0.580444 0.552372 0.666667\n11 0.547837 0.609727 0.733331\n12 0.660882 0.637845 0.799997\n13 1.000000 1.000000 0.866665\n14 0.717407 0.761404 0.933334\n15 0.854362 0.828558 1.000000\n"
}
],
"execution_count": 6
},
{
"id": "8d7324a5-0610-4ac6-b270-1f0eedf00c2f",
"cell_type": "markdown",
"source": "Расчет степени корреляции между сглаженными временными рядами",
"metadata": {}
},
{
"id": "5e1850c7-17c7-49ae-9b71-594934054b03",
"cell_type": "code",
"source": "matrix = df.corr()\nprint(matrix)",
"metadata": {
"trusted": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": " first second third\nfirst 1.000000 0.992092 0.904237\nsecond 0.992092 1.000000 0.916556\nthird 0.904237 0.916556 1.000000\n"
}
],
"execution_count": 7
},
{
"id": "cbe8bb83-5958-4e9c-8963-ad04d5653eb8",
"cell_type": "markdown",
"source": "Для примера сравним корреляцию для несглаженных временных рядов",
"metadata": {}
},
{
"id": "07268810-4221-49b0-8c59-a07470f15a4e",
"cell_type": "code",
"source": "matrix2 = dataset.corr()\nprint(matrix2)",
"metadata": {
"trusted": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": " first second third\nfirst 1.000000 0.990651 0.704796\nsecond 0.990651 1.000000 0.722877\nthird 0.704796 0.722877 1.000000\n"
}
],
"execution_count": 8
},
{
"id": "4c5a24e1-0734-4aaa-9212-56eadadd273f",
"cell_type": "markdown",
"source": "Визуализация матрицы корреляции:",
"metadata": {}
},
{
"id": "d3e09b25-63ec-4c52-9013-19f4be727ffb",
"cell_type": "code",
"source": "plt.imshow(matrix, cmap='Blues')\nplt.colorbar()\nvariables = []\nfor i in matrix.columns:\n variables.append(i)\nplt.xticks(range(len(matrix)), variables, rotation=45, ha='right')\nplt.yticks(range(len(matrix)), variables)\nplt.show()",
"metadata": {
"trusted": true
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 640x480 with 2 Axes>",
"image/png": "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
},
"metadata": {}
}
],
"execution_count": 9
}
]
}