596 lines
335 KiB
Plaintext
Raw Normal View History

2025-02-08 21:28:06 +04:00
{
"cells": [
2025-02-08 21:28:30 +04:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Начало лабораторной\n",
"\n",
"Цены на кофе - https://www.kaggle.com/datasets/mayankanand2701/starbucks-stock-price-dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Выгрузка данных"
]
},
{
"cell_type": "code",
2025-02-13 21:31:43 +04:00
"execution_count": 35,
2025-02-08 21:28:30 +04:00
"metadata": {},
"outputs": [
{
2025-02-13 21:31:43 +04:00
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Date</th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Adj Close</th>\n",
" <th>Volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1992-06-26</td>\n",
" <td>0.328125</td>\n",
" <td>0.347656</td>\n",
" <td>0.320313</td>\n",
" <td>0.335938</td>\n",
" <td>0.260703</td>\n",
" <td>224358400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1992-06-29</td>\n",
" <td>0.339844</td>\n",
" <td>0.367188</td>\n",
" <td>0.332031</td>\n",
" <td>0.359375</td>\n",
" <td>0.278891</td>\n",
" <td>58732800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1992-06-30</td>\n",
" <td>0.367188</td>\n",
" <td>0.371094</td>\n",
" <td>0.343750</td>\n",
" <td>0.347656</td>\n",
" <td>0.269797</td>\n",
" <td>34777600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1992-07-01</td>\n",
" <td>0.351563</td>\n",
" <td>0.359375</td>\n",
" <td>0.339844</td>\n",
" <td>0.355469</td>\n",
" <td>0.275860</td>\n",
" <td>18316800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1992-07-02</td>\n",
" <td>0.359375</td>\n",
" <td>0.359375</td>\n",
" <td>0.347656</td>\n",
" <td>0.355469</td>\n",
" <td>0.275860</td>\n",
" <td>13996800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8031</th>\n",
" <td>2024-05-17</td>\n",
" <td>75.269997</td>\n",
" <td>78.000000</td>\n",
" <td>74.919998</td>\n",
" <td>77.849998</td>\n",
" <td>77.849998</td>\n",
" <td>14436500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8032</th>\n",
" <td>2024-05-20</td>\n",
" <td>77.680000</td>\n",
" <td>78.320000</td>\n",
" <td>76.709999</td>\n",
" <td>77.540001</td>\n",
" <td>77.540001</td>\n",
" <td>11183800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8033</th>\n",
" <td>2024-05-21</td>\n",
" <td>77.559998</td>\n",
" <td>78.220001</td>\n",
" <td>77.500000</td>\n",
" <td>77.720001</td>\n",
" <td>77.720001</td>\n",
" <td>8916600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8034</th>\n",
" <td>2024-05-22</td>\n",
" <td>77.699997</td>\n",
" <td>81.019997</td>\n",
" <td>77.440002</td>\n",
" <td>80.720001</td>\n",
" <td>80.720001</td>\n",
" <td>22063400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8035</th>\n",
" <td>2024-05-23</td>\n",
" <td>80.099998</td>\n",
" <td>80.699997</td>\n",
" <td>79.169998</td>\n",
" <td>79.260002</td>\n",
" <td>79.260002</td>\n",
" <td>4651418</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>8036 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" Date Open High Low Close Adj Close \\\n",
"0 1992-06-26 0.328125 0.347656 0.320313 0.335938 0.260703 \n",
"1 1992-06-29 0.339844 0.367188 0.332031 0.359375 0.278891 \n",
"2 1992-06-30 0.367188 0.371094 0.343750 0.347656 0.269797 \n",
"3 1992-07-01 0.351563 0.359375 0.339844 0.355469 0.275860 \n",
"4 1992-07-02 0.359375 0.359375 0.347656 0.355469 0.275860 \n",
"... ... ... ... ... ... ... \n",
"8031 2024-05-17 75.269997 78.000000 74.919998 77.849998 77.849998 \n",
"8032 2024-05-20 77.680000 78.320000 76.709999 77.540001 77.540001 \n",
"8033 2024-05-21 77.559998 78.220001 77.500000 77.720001 77.720001 \n",
"8034 2024-05-22 77.699997 81.019997 77.440002 80.720001 80.720001 \n",
"8035 2024-05-23 80.099998 80.699997 79.169998 79.260002 79.260002 \n",
"\n",
" Volume \n",
"0 224358400 \n",
"1 58732800 \n",
"2 34777600 \n",
"3 18316800 \n",
"4 13996800 \n",
"... ... \n",
"8031 14436500 \n",
"8032 11183800 \n",
"8033 8916600 \n",
"8034 22063400 \n",
"8035 4651418 \n",
"\n",
"[8036 rows x 7 columns]"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
2025-02-08 21:28:30 +04:00
}
],
"source": [
2025-02-13 21:31:35 +04:00
"import pandas as pd\n",
2025-02-08 21:28:30 +04:00
"df = pd.read_csv(\"./static/csv/Starbucks Dataset.csv\")\n",
2025-02-13 21:31:43 +04:00
"df"
2025-02-08 21:28:30 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Атрибуты\n",
"\n",
"Date — Дата\n",
"\n",
"Open — Цена открытия\n",
"\n",
"High — Макс. цена\n",
"\n",
"Low — Мин. цена\n",
"\n",
"Close — Цена закрытия\n",
"\n",
"Adj Close — Скорректированная цена закрытия\n",
"\n",
"Volume — Объем торгов"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Выбор входных и выходных переменных"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Входные переменные будут Open (цена открытия) и Volume (объем торгов)\n",
"\n",
"Выходная переменная - Close (цена закрытия)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Настройка параметров лингвистических переменных"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2025-02-13 21:31:43 +04:00
"Термы: Низкий (Low) Средний (Medium) Высокий (High)"
2025-02-08 21:28:30 +04:00
]
},
{
"cell_type": "code",
2025-02-13 21:31:43 +04:00
"execution_count": null,
2025-02-08 21:28:30 +04:00
"metadata": {},
"outputs": [
{
"data": {
2025-02-15 10:29:58 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIjCAYAAAA0vUuxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACZ4UlEQVR4nOzdd3hT5d8G8DtJ0920dA8KZZYisgVZArIEZLhFkCXgAkWU5WCICK+AooKgooI/QFBkKYgiWtkCAi5KmaXQ0tJB90qb8/5xSGxI2qZp2pOc3J/r6pXTkzO+6ZNC7j7PeY5CEAQBREREREREVCGl1AUQERERERHZOwYnIiIiIiKiKjA4ERERERERVYHBiYiIiIiIqAoMTkRERERERFVgcCIiIiIiIqoCgxMREREREVEVGJyIiIiIiIiq4CJ1AURERCRvRUVFyMzMhIuLC4KDg6Uuh4jIKuxxIiIiIpv7+eefMXToUPj5+cHDwwMRERF48cUXpS6LiMhq7HEiciJjx47Fli1bkJeXJ3UpRCRjH330EaZMmYLu3bvj/fffR0REBACgYcOGEldGRGQ9hSAIgtRFEFHtycjIwIYNG3DgwAHs378f6enp6NevH9q1a4dHH30U7dq1k7pEIpKR8+fP484778S4cePw0UcfQaFQSF0SEZFNMDgRydimTZswceJE5OXlISoqClqtFikpKWjXrh3+/PNPaLVajBkzBp988glcXV2lLpeIZGDKlCn47rvvcP78eajVaqnLISKyGV7jRCRThw4dwqhRoxAaGopDhw7h8uXL6Nu3L9zd3XH8+HEkJydjxIgRWLduHV566SUAgCAIiIqKwrBhw0yOV1RUBF9fXzz99NMAgNjYWCgUCmzZssVkW29vb4wdO9bw/dq1a6FQKJCQkGBY9++//6JevXq4//77UVpaarTdiRMnjI6Xnp4OhUKBefPmGa03t27JkiVQKBTo1auXYZ2+1tjYWKNtBw8ebPYYt9PvX9GXude6f/9+PP300wgICIBGo8Ho0aNx8+ZNo+NGRUUZ7QsA33zzDRQKBaKiogzrEhISoFAosHTpUpPaWrVqZfRaS0pKMGfOHHTo0AG+vr7w8vJCjx498Ouvv5p9bfp6b/8qf/7yKvoZlG9bAFi/fj06dOgADw8P+Pv74/HHH8fVq1eN6uzZsycaN26MtLQ0w/p58+aZ9FAsXboULi4u2L17t2Fdr1690KpVK5P6li5daraejz76CHfccQfc3NwQHh6O559/HllZWSb7//777xg0aBDq1asHLy8vtG7dGu+//z4AcahrZe+D8ue1tG0ro293S37e+p+JuW3Xrl1rtN2qVavQqlUreHp6Gm1n7nf5dqdOncLAgQOh0Wjg7e2NPn364OjRo0bbHD16FB06dMBzzz2HkJAQuLm5oVWrVvj0008N22RlZZnUae79fbusrCxMnToVkZGRcHNzQ9OmTfF///d/0Ol0Zn9u27dvN9q/qKgI9erVMznflStX8NxzzyE6OhoeHh4ICAjAI488YvbnXF5lbWTu34dLly7hkUcegb+/Pzw9PXH33Xdj165dRsfU/3uzefNmvPrqqwgNDYWXlxeGDh1q9DsEVNzmffv2NWxTWlqKBQsWoEmTJnBzc0NUVBReffVVFBcXGx0rKirKsL9SqURoaCgee+wxJCYmVvozIHImvMaJSKYWL14MnU6HTZs2oUOHDibPBwYG4ssvv8SZM2fw8ccfY+7cuQgODsaoUaPwzjvvIDMzE/7+/obtv/vuO+Tk5GDUqFE1ru3q1au477770KJFC3z99ddwcbHNP0VZWVlYtGiRRdvu37/f6IO4JV544QXcddddRusmTJhgdtvJkyfDz88P8+bNQ3x8PFatWoUrV64YPhSZU1paitdee61aNd0uJycHa9aswYgRIzBx4kTk5ubis88+w4ABA3Ds2DG0bdvW7H5vvvkmGjVqBABYtmyZScgr74EHHsCDDz4IADhw4AA++eQTo+cXLlyIN954A48++igmTJiAtLQ0fPjhh7jnnntw6tQp+Pn5wdXVFVu3bsXdd9+NBx54APv27YObm5vJuXbs2IGZM2di+fLlGDRokFU/k3nz5mH+/Pno27cvnn32WUN7HD9+HIcOHTL0iuzduxf3338/wsLC8OKLLyI0NBRxcXH4/vvv8eKLL+Lpp582+kD65JNPGv0sACAoKMhsDTVp2xEjRhhe++7du/HVV19VuG2LFi0M50lPTzf8UURv8+bNeO6559CrVy9MmTIFXl5eiIuLw9tvv11lHf/++y969OgBjUaDGTNmQK1W4+OPP0avXr3w22+/oXPnzgDE4cEnTpyAi4sLnn/+eTRp0gTbt2/HpEmTkJGRgVmzZsHLywv/+9//KqzTnIKCAvTs2RNJSUl4+umn0aBBAxw+fBizZ8/G9evXsXz5cqPt3d3d8cUXX2D48OGGdVu3bkVRUZHJsY8fP47Dhw/j8ccfR/369ZGQkIBVq1ahV69eOHPmDDw9Pc3WFBQUZHgd+uNv27bNaF2TJk0AAKmpqejatSsKCgrwwgsvICAgAOvWrcPQoUOxZcsWPPDAA0bHXrhwIRQKBWbOnIkbN25g+fLl6Nu3L06fPg0PDw/DdvXr1zf5dy8sLMywPGHCBKxbtw4PP/wwXn75Zfz+++9YtGgR4uLisG3bNqP9evTogUmTJkGn0+Gff/7B8uXLkZycjAMHDph9/URORyAiWfL39xcaNmxotG7MmDGCl5eX0bo33nhDACB89913giAIQnx8vABAWLVqldF2Q4cOFaKiogSdTicIgiD8+uuvAgDhm2++MTm3l5eXMGbMGMP3X3zxhQBAuHz5spCZmSm0bNlSiI6OFtLT04320293/Phxo/VpaWkCAGHu3LlG629fN2PGDCE4OFjo0KGD0LNnT8N6fa2//vqrYV3nzp2FgQMHmj3u7ax5rR06dBBKSkoM69955x0BgLBjxw7DuoYNGxrt+9FHHwlubm5C7969jdru8uXLAgBhyZIlJue/4447jF5raWmpUFxcbLTNzZs3hZCQEGH8+PEm+3/yyScCAOHEiROGdYMHDzZ57wiCIGi1WgGAMH/+fJPXe/nyZUEQBCEhIUFQqVTCwoULjfb9+++/BRcXF5P18fHxQr169YRRo0YJgiAIc+fOFfT/NZ06dUrw8vISnn/+eZNaevbsKdxxxx0m65csWWJUz40bNwRXV1ehf//+QllZmWG7FStWCACEzz//XBAE8efWqFEjoWHDhsLNmzeNjql/z9+usveOpW1bmXPnzgkAhKVLl1b4+srr1q2b0Lt3b8P3+vfNF198YVg3YsQIwc/PTygsLDSsq+z9Xd7w4cMFV1dX4eLFi4Z1ycnJgo+Pj3DPPfcY1jVs2FAAIKxdu9awrrS0VOjTp4/g5uZm8ntf2fu7vAULFgheXl7CuXPnjNbPmjVLUKlUQmJiotHxRowYIbi4uAgpKSmGbfv06SM88cQTJucrKCgwOd+RI0cEAMKXX35ZaV3llX//3m7q1KkCAOHAgQOGdbm5uUKjRo2EqKgow/tT3x4RERFCTk6OYduvv/5aACC8//77hnUV/R7onT59WgAgTJgwwWj9K6+8IgAQfvnlF8O629+zgiAITzzxhODp6Vn1CydyEhyqRyRTubm5Ft0vJSQkBIDYUwEAzZs3R+fOnbFhwwbDNpmZmfjhhx8wcuRIk96S3NxcpKenG31VpKioCEOHDkVaWhr27NmDgIAAa16aWUlJSfjwww/xxhtvwNvbu9Jtt27diuPHj2Px4sU2O//tJk2aZHR9x7PPPmsy3Ky8goICvPnmm5g8eTIaNGhQ4Ta3/6zLysqMtlGpVIbr1XQ6HTIzM1FaWoqOHTvi5MmTJsfU//Xd3d29ytdUUlICAGZ7hvS2bt0KnU6HRx991KjO0NBQNGvWzGTIYPPmzfHtt99iw4YNeOuttwzrr1+/jiFDhqBLly6GoXK3KysrM/l5FBQUGG3z888/o6SkBFOnToVS+d9/eRMnToRGozEMkzp16hQuX76MqVOnws/Pz+gYNZ3cwJK2Nac
2025-02-08 21:28:30 +04:00
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import skfuzzy as fuzz\n",
"\n",
"# Определяем диапазон значений для объема торгов\n",
2025-02-13 21:31:43 +04:00
"volume_range = np.arange(0, 585508801, 10000) \n",
2025-02-08 21:28:30 +04:00
"\n",
"# Определение функций принадлежности для термов\n",
2025-02-15 10:29:58 +04:00
"# Определение функций принадлежности для термов\n",
2025-02-13 21:31:43 +04:00
"low = fuzz.trapmf(volume_range, [0, 0, 30000000, 30000000]) \n",
2025-02-15 10:29:58 +04:00
"medium = fuzz.trimf(volume_range, [50000000, 150000000, 200000000]) \n",
"high = fuzz.trapmf(volume_range, [150000000, 200000000, 585508800, 585508800]) \n",
2025-02-08 21:28:30 +04:00
"\n",
"# Визуализация функций принадлежности\n",
"plt.figure(figsize=(10, 6))\n",
"plt.plot(volume_range, low, label='Низкий (Low)', color='blue')\n",
"plt.plot(volume_range, medium, label='Средний (Medium)', color='orange')\n",
"plt.plot(volume_range, high, label='Высокий (High)', color='green')\n",
"plt.title('Функции принадлежности для объема торгов')\n",
"plt.xlabel('Объем торгов')\n",
"plt.ylabel('Принадлежность')\n",
"plt.ylim(-0.1, 1.1)\n",
"plt.axhline(0, color='black', lw=0.5)\n",
"plt.axvline(0, color='black', lw=0.5)\n",
"plt.legend()\n",
"plt.grid()\n",
"\n",
"# Отображаем график\n",
2025-02-13 21:31:43 +04:00
"plt.show()"
2025-02-08 21:28:30 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Формирование базы нечетких правил"
]
},
{
"cell_type": "code",
2025-02-15 10:29:58 +04:00
"execution_count": 4,
2025-02-08 21:28:30 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Нечеткие правила:\n",
"Если Цена открытия Низкая И Объем Низкий, Тогда Цена закрытия Низкая.\n",
"Если Цена открытия Низкая И Объем Средний, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Низкая И Объем Высокий, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Средняя И Объем Низкий, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Средняя И Объем Средний, Тогда Цена закрытия Высокая.\n",
"Если Цена открытия Средняя И Объем Высокий, Тогда Цена закрытия Высокая.\n",
"Если Цена открытия Высокая И Объем Низкий, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Высокая И Объем Средний, Тогда Цена закрытия Высокая.\n",
"Если Цена открытия Высокая И Объем Высокий, Тогда Цена закрытия Высокая.\n"
]
},
{
"data": {
2025-02-15 10:29:58 +04:00
"image/png": "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
2025-02-08 21:28:30 +04:00
"text/plain": [
2025-02-13 21:31:43 +04:00
"<Figure size 1000x1200 with 3 Axes>"
2025-02-08 21:28:30 +04:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-02-13 21:31:43 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd5xcZb348c/znHOmbEtvQOi9FwURadKb7V4LeC+IiFeKInj1AiqIBVRE9CrgDxBQ6XARUIqEkAChQ+ihJNnd9GzfnT5zyvP7YwvZ7CbZ3ezsmZn9vl+vvF7ZmTPnfGf27Mx8z/M8368yxhiEEEIIIYQQQggx6nTYAQghhBBCCCGEEJVKkm4hhBBCCCGEEKJIJOkWQgghhBBCCCGKRJJuIYQQQgghhBCiSCTpFkIIIYQQQgghikSSbiGEEEIIIYQQokgk6RZCCCGEEEIIIYpEkm4hhBBCCCGEEKJIJOkWQgghhBBCCCGKRJJuIYQQQgghhBCiSCTpFkKIcei2225DKdXv3/Tp0znyyCN57LHHwg5PCCGEEKJi2GEHIIQQIjw//elP2W677TDG0NTUxG233caJJ57IP/7xD04++eSwwxNCCCGEKHuSdAshxDh2wgkn8LGPfazv57POOosZM2Zw1113SdIthBBCCDEKZHq5EEKIPhMnTiQej2PbH12TbWxsRCnFbbfd1m/b8847D6UUX/va1/pue+CBBzjwwAOZPHky8XicXXfdlV/96lcYYwCYN28eSin+/ve/Dzj2nXfeiVKKF154AYC33nqLr33ta2y//fbEYjFmzpzJ17/+ddra2gaNfdtttx0wZV4pxfz58/tts268APfddx9KKbbddtu+2z744AM+/elPM3PmTKLRKLNnz+Zb3/oW7e3tfdsUCgUuu+wyDjjgACZMmEB1dTWHHnoo8+bN67f/3tfvN7/5zYCY99xzT4444oh+tx1xxBEDbnvllVf6ns+6UqkU3/ve99h+++1xHKff825tbR30dVr3OHvuueeA23/zm9+glKKxsbHf7Y899hiHHnoo1dXV1NbWctJJJ/Huu+/222aw13f+/PkDfg8AL730EscffzwTJkygqqqKww8/nOeee67v/p/85CeD/j4H+90O9pr94he/QGvNnXfe2e85D+W1vfXWW1FKccstt/Tb9sorr0QpxaOPPjrgdVv/ddhY3OtSSnH++edzxx13sMsuuxCLxTjggAN45pln+m23bNkyzj33XHbZZRfi8ThTpkzhi1/84oDf0/pLR6qqqthrr724+eab+233ta99rd85D7BixQri8figv//e3+P6/9bfhxBCiIFkpFsIIcaxrq4uWltbMcbQ3NzMH/7wB1KpFP/xH/+x0cctWbKEm266acDtiUSCgw46iDPOOAPHcXj88ce5+OKLsW2b733vexxxxBHMnj2bO+64g89//vP9HnvHHXewww47cPDBBwMwZ84c6uvrOfPMM5k5cybvvvsuN954I++++y4vvvjigOQF4NBDD+Wb3/wmAO+99x5XXnnlRp+H53n88Ic/HHB7Op1mq6224pRTTqGuro533nmH6667jlWrVvGPf/yj77nefPPNnHrqqZx99tkkk0n+/Oc/c9xxx/Hyyy+z7777bvTYw/E///M/g97+/e9/nz/96U+cddZZHHLIITiOwwMPPDDoRY3N8be//Y0zzjiD4447jl/96ldkMhluuOEGPvWpT/H6668PO/F66qmnOOGEEzjggAO4/PLL0Vpz66238ulPf5pnn32WAw88kC984QvsuOOOfY+58MIL2W233fp+vwC77bbboPu/9dZb+dGPfsQ111zDaaedttFYBnttzzzzTB544AEuuugijjnmGGbPns3bb7/NFVdcwVlnncWJJ564yee477778r3vfa/fbX/961+ZM2fOgG2ffvpp7rnnHr7zne8QjUa5/vrrOf7443n55Zf7Loy88sorPP/883zlK19hq622orGxkRtuuIEjjjiCRYsWUVVV1W+f1157LVOnTiWRSHDLLbdw9tlns+2223L00UdvMObLLruMXC630ed16aWX9r3uN954I8uXL9/kayGEEOOeEUIIMe7ceuutBhjwLxqNmttuu63ftg0NDQYwt956a99tX/rSl8yee+5pZs+ebc4444yNHmv33Xc3J598ct/Pl1xyiYlGo6azs7PvtubmZmPbtrn88sv7bstkMgP2dddddxnAPPPMMwPu23LLLc2ZZ57Z9/O8efMMYObNm9d32zbbbNMv3uuvv95Eo1Fz5JFHmm222Wajz+Pcc881NTU1fT97nmfy+Xy/bTo6OsyMGTPM17/+9b7bel+/q6++esA+99hjD3P44Yf3u+3www/vd9ujjz5qAHP88ceb9T+2Z82aZY477rh+t11++eUGMC0tLRt9PocffrjZY489Btx+9dVXG8A0NDQYY4xJJpNm4sSJ5uyzz+633dq1a82ECRP63b7ddtuZ008/vd926/8egiAwO+20kznuuONMEAR922UyGbPddtuZY445ZtB41//drf9cel+zRx55xNi2bb73ve9tdDtjNv7arlmzxkyePNkcc8wxJp/Pm/32289svfXWpqura9AY1o/1pJNOGnD7eeedN+A4vX97r776at9ty5YtM7FYzHz+85/vu22wv4cXXnjBAOavf/1r3229f9u9vz9jjPnwww8NYH7961/33XbGGWf0O+ffeecdo7U2J5xwwoDHG2PMnDlzDGCefvrpDe5DCCHE4GR6uRBCjGPXXXcdc+bMYc6cOdx+++0ceeSRfOMb3+CBBx7Y4GNee+017rvvPq666iq0HvxjpLW1lZUrV3LbbbexZMkSDjvssL77Tj/9dPL5PPfff3/fbffccw+e5/UbYY/H433/z+VytLa28olPfAKAhQsXDjhmoVAgGo0O+blnMhl++tOfcv7557P11lsPuk1XVxdNTU3MnTuXRx55pN/zsCyLSCQCQBAEtLe343keH/vYxwaNbySMMVxyySX827/9GwcddNCA+5PJJFOmTBnx/n3fp7W1td+/TCbTb5s5c+bQ2dnJqaee2m87y7I46KCD+k2nnz59OitXrtzoMd944w0WL17MaaedRltbW9/+0uk0Rx11FM888wxBEIzo+bz88st86Utf4t/+7d+4+uqrN7rtpl7bmTNn9v19HHroobzxxhvccsst1NXVjSi2jTn44IM54IAD+n7eeuut+exnP8u//vUvfN8H+v89uK5LW1sbO+64IxMnThz0fOvo6KC1tZX6+nquvfZaLMvi8MMP32AMl1xyCfvvvz9f/OIXB72/UCgADOtvTAghRDeZXi6EEOPYgQce2K+Q2qmnnsp+++3H+eefz8knn9yXVK7r4osv5tBDD+Xkk0/m/PPPH3B/Lpdj2rRpQPd61UsvvZTvf//7fffvuuuufPzjH+eOO+7grLPOArqnln/iE5/oN524vb2dK664grvvvpvm5uZ+x+jq6hpw3K6uLmpqaob83H/729+Sy+W49NJLueiiiwbd5rjjjuOll14C4Pjjj+eee+7pd/9f/vIXrrnmGt5//31c1+27fbvtthtyHBtzxx138O6773Lvvff2W5vc6+CDD+bvf/87999/f9/08vWT5o15//33+35XG7J48WIAPv3pTw96/7pJ6Cc/+Un+93//l7vvvptPf/rTaK0H/K5693fGGWds8JhdXV1MmjRpSM+h16pVqzjppJNIp9O0tbUNuvxgXZt6bQG+8pWvcPvtt/PII4/wzW9+k6OOOmpYMQ3VTjvtNOC2nXfemUwmQ0tLCzNnziSbzXLVVVdx6623smrVqr46CTD438P+++/f9/9oNMof//hHDjzwwEGPv2DBAv7xj38wd+7cDU4X7+zsBBjW35gQQohuknQLIYToo7XmyCOP5Pe//z2LFy9mjz326Hf/E088wZNPPtlX7GwwkUiEOXPmkMlkePbZZ/nVr37F7Nmz+a//+q++bU4//XQuuOACVq5cST6f58UXX+SPf/xjv/186Utf4vnnn+f73/8+++67LzU1NQRBwPHHHz9gJLS
2025-02-08 21:28:30 +04:00
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"import matplotlib.pyplot as plt\n",
"\n",
2025-02-13 21:31:43 +04:00
"x_open = np.linspace(0, 126, 100) \n",
"x_volume = np.linspace(0, 585508800, 100) \n",
"x_close = np.linspace(0, 130, 100) \n",
2025-02-08 21:28:30 +04:00
"\n",
"# Определение функций принадлежности для цены открытия\n",
2025-02-13 21:31:43 +04:00
"low_open = fuzz.trapmf(x_open, [0, 0, 10, 40])\n",
"medium_open = fuzz.trimf(x_open, [35, 63, 90])\n",
"high_open = fuzz.trapmf(x_open, [85, 90, 126, 126])\n",
2025-02-08 21:28:30 +04:00
"\n",
"# Определение функций принадлежности для объема торгов\n",
2025-02-13 21:31:43 +04:00
"low_volume = fuzz.trapmf(x_volume, [0, 0, 30000000, 30000000])\n",
2025-02-15 10:29:58 +04:00
"medium_volume = fuzz.trimf(x_volume, [50000000, 150000000, 200000000])\n",
"high_volume = fuzz.trapmf(x_volume, [150000000, 200000000, 585508800, 585508800])\n",
2025-02-08 21:28:30 +04:00
"\n",
"# Определение функций принадлежности для цены закрытия\n",
2025-02-13 21:31:43 +04:00
"low_close = fuzz.trapmf(x_close, [0, 0, 10, 40])\n",
"medium_close = fuzz.trimf(x_close, [35, 80, 115])\n",
"high_close = fuzz.trapmf(x_close, [110, 120, 130, 130])\n",
2025-02-08 21:28:30 +04:00
"\n",
"# Определение нечетких правил\n",
"fuzzy_rules = [\n",
" (\"Низкая\", \"Низкий\", \"Низкая\"),\n",
" (\"Низкая\", \"Средний\", \"Средняя\"),\n",
" (\"Низкая\", \"Высокий\", \"Средняя\"),\n",
" (\"Средняя\", \"Низкий\", \"Средняя\"),\n",
" (\"Средняя\", \"Средний\", \"Высокая\"),\n",
" (\"Средняя\", \"Высокий\", \"Высокая\"),\n",
" (\"Высокая\", \"Низкий\", \"Средняя\"),\n",
" (\"Высокая\", \"Средний\", \"Высокая\"),\n",
" (\"Высокая\", \"Высокий\", \"Высокая\"),\n",
"]\n",
"\n",
"# Вывод правил\n",
"print(\"Нечеткие правила:\")\n",
"for rule in fuzzy_rules:\n",
" print(f\"Если Цена открытия {rule[0]} И Объем {rule[1]}, Тогда Цена закрытия {rule[2]}.\")\n",
"\n",
"# Визуализация функций принадлежности\n",
2025-02-13 21:31:43 +04:00
"fig, axs = plt.subplots(3, 1, figsize=(10, 12))\n",
2025-02-08 21:28:30 +04:00
"\n",
"# Цена открытия\n",
"axs[0].plot(x_open, low_open, label='Низкий (Low)', color='blue')\n",
"axs[0].plot(x_open, medium_open, label='Средний (Medium)', color='green')\n",
"axs[0].plot(x_open, high_open, label='Высокий (High)', color='red')\n",
"axs[0].set_title('Функции принадлежности для цены открытия')\n",
"axs[0].set_xlabel('Цена открытия')\n",
"axs[0].set_ylabel('Степень принадлежности')\n",
"axs[0].legend()\n",
"axs[0].grid()\n",
"\n",
"# Объем торгов\n",
"axs[1].plot(x_volume, low_volume, label='Низкий (Low)', color='blue')\n",
"axs[1].plot(x_volume, medium_volume, label='Средний (Medium)', color='orange')\n",
"axs[1].plot(x_volume, high_volume, label='Высокий (High)', color='green')\n",
"axs[1].set_title('Функции принадлежности для объема торгов')\n",
"axs[1].set_xlabel('Объем торгов')\n",
"axs[1].set_ylabel('Степень принадлежности')\n",
"axs[1].legend()\n",
"axs[1].grid()\n",
"\n",
"# Цена закрытия\n",
"axs[2].plot(x_close, low_close, label='Низкая', color='blue')\n",
"axs[2].plot(x_close, medium_close, label='Средняя', color='green')\n",
"axs[2].plot(x_close, high_close, label='Высокая', color='red')\n",
"axs[2].set_title('Функции принадлежности для цены закрытия')\n",
"axs[2].set_xlabel('Цена закрытия')\n",
"axs[2].set_ylabel('Степень принадлежности')\n",
"axs[2].legend()\n",
"axs[2].grid()\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
2025-02-13 21:31:43 +04:00
"# Визуализация нечетких правил (пример)\n",
2025-02-08 21:28:30 +04:00
"fig, ax = plt.subplots(figsize=(10, 6))\n",
2025-02-13 21:31:43 +04:00
"x_rule = np.linspace(0, 126, 100)\n",
2025-02-08 21:28:30 +04:00
"\n",
"# Пример нечеткого вывода для визуализации (примерные значения)\n",
"for rule in fuzzy_rules:\n",
" # Определение степени уверенности для каждого правила\n",
" if rule[0] == \"Низкая\" and rule[1] == \"Низкий\":\n",
" ax.fill_between(x_open, low_open, low_close, color='lightblue', alpha=0.5, label='Низкий #1')\n",
" elif rule[0] == \"Низкая\" and rule[1] == \"Средний\":\n",
" ax.fill_between(x_open, medium_open, medium_close, color='lightgreen', alpha=0.5, label='Средний #2')\n",
" elif rule[0] == \"Низкая\" and rule[1] == \"Высокий\":\n",
" ax.fill_between(x_open, low_open, medium_close, color='lightcoral', alpha=0.5, label='Высокий #3')\n",
" elif rule[0] == \"Средняя\" and rule[1] == \"Низкий\":\n",
" ax.fill_between(x_open, medium_open, medium_close, color='orange', alpha=0.5, label='Низкий #4')\n",
" elif rule[0] == \"Высокая\" and rule[1] == \"Высокий\":\n",
" ax.fill_between(x_open, high_open, high_close, color='salmon', alpha=0.5, label='Высокий #5')\n",
"\n",
"ax.set_title('Визуализация нечетких правил')\n",
"ax.set_xlabel('Цена открытия')\n",
"ax.set_ylabel('Цена закрытия')\n",
"ax.legend()\n",
"ax.grid()\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Оценка качества полученной нечеткой системы, используя метрики регрессии"
]
},
2025-02-08 21:28:06 +04:00
{
"cell_type": "code",
2025-02-15 10:29:58 +04:00
"execution_count": 7,
2025-02-08 21:28:06 +04:00
"metadata": {},
2025-02-08 21:28:30 +04:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Цена открытия | Объем торгов | Фактическая цена закрытия | Полученная цена закрытия \n",
"============================================================================================\n",
2025-02-13 21:31:43 +04:00
"50 | 150000000 | 60 | 41.07 \n",
2025-02-15 10:29:58 +04:00
"100 | 300000000 | 120 | 61.11 \n",
2025-02-13 21:31:43 +04:00
"85 | 450000000 | 110 | 5.24 \n",
"40 | 100000000 | 30 | 13.69 \n",
2025-02-08 21:28:30 +04:00
"\n",
2025-02-15 10:29:58 +04:00
"Средняя абсолютная ошибка (MAE): 49.72\n",
"Среднеквадратичная ошибка (RMSE): 61.38\n"
2025-02-08 21:28:30 +04:00
]
}
],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Определяем диапазоны значений для входных переменных\n",
2025-02-13 21:31:43 +04:00
"x_open = np.linspace(0, 126, 100) # Цена открытия\n",
"x_volume = np.linspace(0, 585508800, 100) # Объем торгов\n",
"x_close = np.linspace(0, 130, 100) # Цена закрытия\n",
2025-02-08 21:28:30 +04:00
"\n",
"# Определение функций принадлежности для цены открытия\n",
2025-02-13 21:31:43 +04:00
"low_open = fuzz.trapmf(x_open, [0, 0, 10, 40])\n",
"medium_open = fuzz.trimf(x_open, [35, 63, 90])\n",
"high_open = fuzz.trapmf(x_open, [85, 90, 126, 126])\n",
2025-02-08 21:28:30 +04:00
"\n",
"# Определение функций принадлежности для объема торгов\n",
2025-02-13 21:31:43 +04:00
"low_volume = fuzz.trapmf(x_volume, [0, 0, 30000000, 30000000])\n",
2025-02-15 10:29:58 +04:00
"medium_volume = fuzz.trimf(x_volume, [30000000, 150000000, 250000000])\n",
"high_volume = fuzz.trapmf(x_volume, [200000000, 400000000, 585508800, 585508800])\n",
2025-02-08 21:28:30 +04:00
"\n",
"# Определение функций принадлежности для цены закрытия\n",
2025-02-13 21:31:43 +04:00
"low_close = fuzz.trapmf(x_close, [0, 0, 10, 40])\n",
"medium_close = fuzz.trimf(x_close, [35, 80, 115])\n",
"high_close = fuzz.trapmf(x_close, [110, 120, 130, 130])\n",
2025-02-08 21:28:30 +04:00
"\n",
"# Создаем тестовые данные (цена открытия, объем, эталонная цена закрытия)\n",
"test_data = [\n",
2025-02-13 21:31:43 +04:00
" (50, 150000000, 60), # Низкая цена открытия, средний объем и цена закрытия\n",
" (100, 300000000, 120), # Высокая цена открытия, средний объем и высокая цена закрытия\n",
" (85, 450000000, 110), # Высокая цена открытия и высокая цена закрытия\n",
" (40, 100000000, 30) # Средняя цена открытия и низкий объем\n",
2025-02-08 21:28:30 +04:00
"]\n",
"\n",
"# Функция для вычисления нечеткой оценки\n",
"def fuzzy_inference(open_price, volume):\n",
" open_low = fuzz.interp_membership(x_open, low_open, open_price)\n",
" open_medium = fuzz.interp_membership(x_open, medium_open, open_price)\n",
" open_high = fuzz.interp_membership(x_open, high_open, open_price)\n",
"\n",
" volume_low = fuzz.interp_membership(x_volume, low_volume, volume)\n",
" volume_medium = fuzz.interp_membership(x_volume, medium_volume, volume)\n",
" volume_high = fuzz.interp_membership(x_volume, high_volume, volume)\n",
"\n",
" close_low = np.fmin(open_low, volume_low)\n",
" close_medium = np.fmin(open_medium, volume_medium)\n",
" close_high = np.fmin(open_high, volume_high)\n",
"\n",
2025-02-13 21:31:43 +04:00
" close0 = fuzz.defuzz(x_close, low_close, 'centroid') * close_low if close_low > 0 else 0\n",
" close1 = fuzz.defuzz(x_close, medium_close, 'centroid') * close_medium if close_medium > 0 else 0\n",
" close2 = fuzz.defuzz(x_close, high_close, 'centroid') * close_high if close_high > 0 else 0\n",
2025-02-08 21:28:30 +04:00
"\n",
" return max(close0, close1, close2)\n",
"\n",
"# Список для хранения результатов\n",
"results = []\n",
"\n",
"# Оценка системы на тестовом наборе данных\n",
"for open_price, volume, actual_close in test_data:\n",
" inferred_close = fuzzy_inference(open_price, volume)\n",
" results.append((open_price, volume, actual_close, inferred_close))\n",
"\n",
2025-02-13 21:31:43 +04:00
"# Вывод результатов\n",
2025-02-08 21:28:30 +04:00
"print(f\"{'Цена открытия':<18} | {'Объем торгов':<10} | {'Фактическая цена закрытия':<30} | {'Полученная цена закрытия':<30}\")\n",
2025-02-13 21:31:43 +04:00
"print(\"=\" * 92)\n",
2025-02-08 21:28:30 +04:00
"\n",
"for open_price, volume, actual_close, inferred_close in results:\n",
" print(f\"{open_price:<18} | {volume:<10} | {actual_close:<30} | {inferred_close:<30.2f}\")\n",
"\n",
"# Вычисление метрик качества\n",
"actual_closes = [actual for _, _, actual, _ in results]\n",
"inferred_closes = [inferred for _, _, _, inferred in results]\n",
"\n",
"mae = np.mean(np.abs(np.array(actual_closes) - np.array(inferred_closes)))\n",
"rmse = np.sqrt(np.mean((np.array(actual_closes) - np.array(inferred_closes)) ** 2))\n",
"\n",
"# Вывод метрик\n",
"print(f\"\\nСредняя абсолютная ошибка (MAE): {mae:.2f}\")\n",
2025-02-13 21:31:43 +04:00
"print(f\"Среднеквадратичная ошибка (RMSE): {rmse:.2f}\")"
2025-02-08 21:28:30 +04:00
]
2025-02-08 21:28:06 +04:00
}
],
"metadata": {
2025-02-08 21:28:30 +04:00
"kernelspec": {
"display_name": "aimenv",
"language": "python",
"name": "python3"
},
2025-02-08 21:28:06 +04:00
"language_info": {
2025-02-08 21:28:30 +04:00
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.6"
2025-02-08 21:28:06 +04:00
}
},
"nbformat": 4,
"nbformat_minor": 2
}