{ "cells": [ { "cell_type": "markdown", "id": "iraqi-wound", "metadata": {}, "source": [ "## Dependencies" ] }, { "cell_type": "code", "execution_count": 1, "id": "legal-router", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: imbalanced-learn in /opt/conda/lib/python3.8/site-packages (0.8.0)\n", "Requirement already satisfied: scipy>=0.19.1 in /opt/conda/lib/python3.8/site-packages (from imbalanced-learn) (1.6.0)\n", "Requirement already satisfied: joblib>=0.11 in /opt/conda/lib/python3.8/site-packages (from imbalanced-learn) (1.0.0)\n", "Requirement already satisfied: numpy>=1.13.3 in /opt/conda/lib/python3.8/site-packages (from imbalanced-learn) (1.20.0)\n", "Requirement already satisfied: scikit-learn>=0.24 in /opt/conda/lib/python3.8/site-packages (from imbalanced-learn) (0.24.1)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from scikit-learn>=0.24->imbalanced-learn) (2.1.0)\n", "Requirement already satisfied: python-slugify in /opt/conda/lib/python3.8/site-packages (4.0.1)\n", "Requirement already satisfied: text-unidecode>=1.3 in /opt/conda/lib/python3.8/site-packages (from python-slugify) (1.3)\n" ] } ], "source": [ "import sys\n", "!{sys.executable} -m pip install -U imbalanced-learn\n", "!{sys.executable} -m pip install -U python-slugify" ] }, { "cell_type": "markdown", "id": "superior-clinton", "metadata": {}, "source": [ "## Dataset overview" ] }, { "cell_type": "code", "execution_count": 2, "id": "assumed-progress", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Bankrupt?ROA(C) before interest and depreciation before interestROA(A) before interest and % after taxROA(B) before interest and depreciation after taxOperating Gross MarginRealized Sales Gross MarginOperating Profit RatePre-tax net Interest RateAfter-tax net Interest RateNon-industry income and expenditure/revenue...Net Income to Total AssetsTotal assets to GNP priceNo-credit IntervalGross Profit to SalesNet Income to Stockholder's EquityLiability to EquityDegree of Financial Leverage (DFL)Interest Coverage Ratio (Interest expense to EBIT)Net Income FlagEquity to Liability
010.3705940.4243890.4057500.6014570.6014570.9989690.7968870.8088090.302646...0.7168450.0092190.6228790.6014530.8278900.2902020.0266010.56405010.016469
110.4642910.5382140.5167300.6102350.6102350.9989460.7973800.8093010.303556...0.7952970.0083230.6236520.6102370.8399690.2838460.2645770.57017510.020794
210.4260710.4990190.4722950.6014500.6013640.9988570.7964030.8083880.302035...0.7746700.0400030.6238410.6014490.8367740.2901890.0265550.56370610.016474
310.3998440.4512650.4577330.5835410.5835410.9987000.7969670.8089660.303350...0.7395550.0032520.6229290.5835380.8346970.2817210.0266970.56466310.023982
410.4650220.5384320.5222980.5987830.5987830.9989730.7973660.8093040.303475...0.7950160.0038780.6235210.5987820.8399730.2785140.0247520.57561710.035490
\n", "

5 rows × 96 columns

\n", "
" ], "text/plain": [ " Bankrupt? ROA(C) before interest and depreciation before interest \\\n", "0 1 0.370594 \n", "1 1 0.464291 \n", "2 1 0.426071 \n", "3 1 0.399844 \n", "4 1 0.465022 \n", "\n", " ROA(A) before interest and % after tax \\\n", "0 0.424389 \n", "1 0.538214 \n", "2 0.499019 \n", "3 0.451265 \n", "4 0.538432 \n", "\n", " ROA(B) before interest and depreciation after tax \\\n", "0 0.405750 \n", "1 0.516730 \n", "2 0.472295 \n", "3 0.457733 \n", "4 0.522298 \n", "\n", " Operating Gross Margin Realized Sales Gross Margin \\\n", "0 0.601457 0.601457 \n", "1 0.610235 0.610235 \n", "2 0.601450 0.601364 \n", "3 0.583541 0.583541 \n", "4 0.598783 0.598783 \n", "\n", " Operating Profit Rate Pre-tax net Interest Rate \\\n", "0 0.998969 0.796887 \n", "1 0.998946 0.797380 \n", "2 0.998857 0.796403 \n", "3 0.998700 0.796967 \n", "4 0.998973 0.797366 \n", "\n", " After-tax net Interest Rate Non-industry income and expenditure/revenue \\\n", "0 0.808809 0.302646 \n", "1 0.809301 0.303556 \n", "2 0.808388 0.302035 \n", "3 0.808966 0.303350 \n", "4 0.809304 0.303475 \n", "\n", " ... Net Income to Total Assets Total assets to GNP price \\\n", "0 ... 0.716845 0.009219 \n", "1 ... 0.795297 0.008323 \n", "2 ... 0.774670 0.040003 \n", "3 ... 0.739555 0.003252 \n", "4 ... 0.795016 0.003878 \n", "\n", " No-credit Interval Gross Profit to Sales \\\n", "0 0.622879 0.601453 \n", "1 0.623652 0.610237 \n", "2 0.623841 0.601449 \n", "3 0.622929 0.583538 \n", "4 0.623521 0.598782 \n", "\n", " Net Income to Stockholder's Equity Liability to Equity \\\n", "0 0.827890 0.290202 \n", "1 0.839969 0.283846 \n", "2 0.836774 0.290189 \n", "3 0.834697 0.281721 \n", "4 0.839973 0.278514 \n", "\n", " Degree of Financial Leverage (DFL) \\\n", "0 0.026601 \n", "1 0.264577 \n", "2 0.026555 \n", "3 0.026697 \n", "4 0.024752 \n", "\n", " Interest Coverage Ratio (Interest expense to EBIT) Net Income Flag \\\n", "0 0.564050 1 \n", "1 0.570175 1 \n", "2 0.563706 1 \n", "3 0.564663 1 \n", "4 0.575617 1 \n", "\n", " Equity to Liability \n", "0 0.016469 \n", "1 0.020794 \n", "2 0.016474 \n", "3 0.023982 \n", "4 0.035490 \n", "\n", "[5 rows x 96 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "df = pd.read_csv('company_bankrupcy.csv').dropna()\n", "df.head()" ] }, { "cell_type": "markdown", "id": "premier-lincoln", "metadata": {}, "source": [ "## Imbalance Analysis\n", "\n", "\n", "Is always helpful to know how imbalance the dataset is. Are there more positive samples than negatives ? How much ?" ] }, { "cell_type": "code", "execution_count": 3, "id": "cooked-april", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countpct
OK65990.967737
KO2200.032263
\n", "
" ], "text/plain": [ " count pct\n", "OK 6599 0.967737\n", "KO 220 0.032263" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "count = len(df)\n", "stats = df[['Bankrupt?', ' After-tax net Interest Rate']]\\\n", " .groupby(['Bankrupt?'])\\\n", " .agg(['count'])\\\n", " .reset_index(drop=True)\\\n", " .rename(index={0: \"OK\", 1: \"KO\"})\\\n", " .T.reset_index(drop=True, level=0).T\n", "\n", "stats['pct'] = stats['count'] / count\n", "stats" ] }, { "cell_type": "markdown", "id": "based-virtue", "metadata": {}, "source": [ "It seems this dataset is highly imbalanced. Most of the samples are negative target samples, whereas only 3% of the samples are of type positive." ] }, { "cell_type": "markdown", "id": "imperial-clinton", "metadata": {}, "source": [ "### Imbalanced: Resampling & Feature selection\n", "\n", "We need to narrow down the number of features that are really relevant for classifying the samples between bankrupcy and bussiness as usual. The steps I'm going to do are:\n", "\n", "- Correlation Matrix\n", "- Scatter Matrix\n", "- Lasso feature selection\n", "- SBKBest feature selection" ] }, { "cell_type": "markdown", "id": "sitting-posting", "metadata": {}, "source": [ "First I'm normalizing the **dataframe's columns names**" ] }, { "cell_type": "code", "execution_count": 4, "id": "delayed-velvet", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
bankruptroa-c-before-interest-and-depreciation-before-interestroa-a-before-interest-and-after-taxroa-b-before-interest-and-depreciation-after-taxoperating-gross-marginrealized-sales-gross-marginoperating-profit-ratepre-tax-net-interest-rateafter-tax-net-interest-ratenon-industry-income-and-expenditure-revenue...net-income-to-total-assetstotal-assets-to-gnp-priceno-credit-intervalgross-profit-to-salesnet-income-to-stockholder-s-equityliability-to-equitydegree-of-financial-leverage-dflinterest-coverage-ratio-interest-expense-to-ebitnet-income-flagequity-to-liability
010.3705940.4243890.4057500.6014570.6014570.9989690.7968870.8088090.302646...0.7168450.0092190.6228790.6014530.8278900.2902020.0266010.56405010.016469
110.4642910.5382140.5167300.6102350.6102350.9989460.7973800.8093010.303556...0.7952970.0083230.6236520.6102370.8399690.2838460.2645770.57017510.020794
210.4260710.4990190.4722950.6014500.6013640.9988570.7964030.8083880.302035...0.7746700.0400030.6238410.6014490.8367740.2901890.0265550.56370610.016474
310.3998440.4512650.4577330.5835410.5835410.9987000.7969670.8089660.303350...0.7395550.0032520.6229290.5835380.8346970.2817210.0266970.56466310.023982
410.4650220.5384320.5222980.5987830.5987830.9989730.7973660.8093040.303475...0.7950160.0038780.6235210.5987820.8399730.2785140.0247520.57561710.035490
\n", "

5 rows × 96 columns

\n", "
" ], "text/plain": [ " bankrupt roa-c-before-interest-and-depreciation-before-interest \\\n", "0 1 0.370594 \n", "1 1 0.464291 \n", "2 1 0.426071 \n", "3 1 0.399844 \n", "4 1 0.465022 \n", "\n", " roa-a-before-interest-and-after-tax \\\n", "0 0.424389 \n", "1 0.538214 \n", "2 0.499019 \n", "3 0.451265 \n", "4 0.538432 \n", "\n", " roa-b-before-interest-and-depreciation-after-tax operating-gross-margin \\\n", "0 0.405750 0.601457 \n", "1 0.516730 0.610235 \n", "2 0.472295 0.601450 \n", "3 0.457733 0.583541 \n", "4 0.522298 0.598783 \n", "\n", " realized-sales-gross-margin operating-profit-rate \\\n", "0 0.601457 0.998969 \n", "1 0.610235 0.998946 \n", "2 0.601364 0.998857 \n", "3 0.583541 0.998700 \n", "4 0.598783 0.998973 \n", "\n", " pre-tax-net-interest-rate after-tax-net-interest-rate \\\n", "0 0.796887 0.808809 \n", "1 0.797380 0.809301 \n", "2 0.796403 0.808388 \n", "3 0.796967 0.808966 \n", "4 0.797366 0.809304 \n", "\n", " non-industry-income-and-expenditure-revenue ... \\\n", "0 0.302646 ... \n", "1 0.303556 ... \n", "2 0.302035 ... \n", "3 0.303350 ... \n", "4 0.303475 ... \n", "\n", " net-income-to-total-assets total-assets-to-gnp-price no-credit-interval \\\n", "0 0.716845 0.009219 0.622879 \n", "1 0.795297 0.008323 0.623652 \n", "2 0.774670 0.040003 0.623841 \n", "3 0.739555 0.003252 0.622929 \n", "4 0.795016 0.003878 0.623521 \n", "\n", " gross-profit-to-sales net-income-to-stockholder-s-equity \\\n", "0 0.601453 0.827890 \n", "1 0.610237 0.839969 \n", "2 0.601449 0.836774 \n", "3 0.583538 0.834697 \n", "4 0.598782 0.839973 \n", "\n", " liability-to-equity degree-of-financial-leverage-dfl \\\n", "0 0.290202 0.026601 \n", "1 0.283846 0.264577 \n", "2 0.290189 0.026555 \n", "3 0.281721 0.026697 \n", "4 0.278514 0.024752 \n", "\n", " interest-coverage-ratio-interest-expense-to-ebit net-income-flag \\\n", "0 0.564050 1 \n", "1 0.570175 1 \n", "2 0.563706 1 \n", "3 0.564663 1 \n", "4 0.575617 1 \n", "\n", " equity-to-liability \n", "0 0.016469 \n", "1 0.020794 \n", "2 0.016474 \n", "3 0.023982 \n", "4 0.035490 \n", "\n", "[5 rows x 96 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from slugify import slugify\n", "\n", "columns = [slugify(name) for name in df.columns.values]\n", "df.columns = columns\n", "df.head()" ] }, { "cell_type": "markdown", "id": "interim-danger", "metadata": {}, "source": [ "Now I'm getting **target column** and the **rest of the columns** as features" ] }, { "cell_type": "code", "execution_count": 5, "id": "structural-probability", "metadata": {}, "outputs": [], "source": [ "target = 'bankrupt'\n", "features = [name for name in df.columns.values if name != 'bankrupt']" ] }, { "cell_type": "markdown", "id": "informational-popularity", "metadata": {}, "source": [ "## RESAMPLING" ] }, { "cell_type": "code", "execution_count": 6, "id": "joint-evidence", "metadata": {}, "outputs": [], "source": [ "from imblearn.over_sampling import SMOTE\n", "\n", "X = df[features]\n", "y = df[target]\n", "\n", "# RESAMPLING\n", "rnd = SMOTE()\n", "X, y = rnd.fit_resample(X, y)" ] }, { "cell_type": "markdown", "id": "raising-administrator", "metadata": {}, "source": [ "## SCALE" ] }, { "cell_type": "code", "execution_count": 7, "id": "sized-translator", "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler\n", "\n", "X_scaled = StandardScaler().fit_transform(X)" ] }, { "cell_type": "markdown", "id": "elegant-halloween", "metadata": {}, "source": [ "## FEATURE SELECTION" ] }, { "cell_type": "markdown", "id": "becoming-omaha", "metadata": {}, "source": [ "Creating initial target/features selection. I tried ALL but even a trivial matrix plot was taking forever. That's why I decided to do a top 10 feature selection directly." ] }, { "cell_type": "code", "execution_count": 8, "id": "adult-excellence", "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/lib/python3.8/site-packages/sklearn/feature_selection/_univariate_selection.py:114: UserWarning: Features [93] are constant.\n", " warnings.warn(\"Features %s are constant.\" % constant_features_idx,\n", "/opt/conda/lib/python3.8/site-packages/sklearn/feature_selection/_univariate_selection.py:116: RuntimeWarning: invalid value encountered in true_divide\n", " f = msb / msw\n" ] }, { "data": { "text/plain": [ "['roa-c-before-interest-and-depreciation-before-interest',\n", " 'roa-a-before-interest-and-after-tax',\n", " 'tax-rate-a',\n", " 'net-value-per-share-c',\n", " 'operating-profit-per-share-yuan-y',\n", " 'total-debt-total-net-worth',\n", " 'debt-ratio',\n", " 'operating-profit-paid-in-capital',\n", " 'liability-assets-flag']" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.feature_selection import SelectKBest\n", "from sklearn.feature_selection import f_classif\n", "\n", "fs = SelectKBest(f_classif, k=10)\n", "X_scaled = fs.fit_transform(X_scaled, y)\n", "cols = fs.get_support(indices=True)\n", "cols = [name for name in df.columns[cols] if name != 'bankrupt']\n", "cols" ] }, { "cell_type": "markdown", "id": "broad-rings", "metadata": {}, "source": [ "Now creating the scatter matrix to see feature distributions" ] }, { "cell_type": "markdown", "id": "electoral-transparency", "metadata": {}, "source": [ "## CROSS VALIDATION" ] }, { "cell_type": "code", "execution_count": 9, "id": "consistent-chinese", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import cross_val_score, train_test_split\n", "\n", "X = X_scaled\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)" ] }, { "cell_type": "code", "execution_count": 10, "id": "emerging-mailman", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LogisticRegression\n", "==================\n", "{'C': 1} 0.8890244129840692\n", "---\n", "KNeighborsClassifier\n", "====================\n", "{'n_neighbors': 5} 0.9584614619612848\n", "---\n", "DecisionTreeClassifier\n", "======================\n", "{'max_depth': 4} 0.8996129724667619\n", "---\n" ] } ], "source": [ "from sklearn.linear_model import LogisticRegression\n", "from sklearn.svm import LinearSVC\n", "from sklearn.neural_network import MLPClassifier\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.model_selection import GridSearchCV\n", "\n", "def print_search_result(name, search_result):\n", " print(name)\n", " print(\"=\" * len(name))\n", " print(search_result.best_params_, search_result.best_score_)\n", " print('---')\n", " \n", "classifiers = [\n", " {\n", " 'classifier': LogisticRegression(),\n", " 'params': { 'C': [1, 5, 10, 20, 40] }\n", " },\n", " {\n", " 'classifier': KNeighborsClassifier(),\n", " 'params': { 'n_neighbors': [5, 10, 15] }\n", " },\n", " {\n", " 'classifier': DecisionTreeClassifier(),\n", " 'params': { 'max_depth': [3, 4, 5, 6] }\n", " }\n", "]\n", "\n", "for entry in classifiers:\n", " classifier = entry['classifier']\n", " classifier_name = type(classifier).__name__\n", " \n", " search_params = entry['params']\n", " search_result = GridSearchCV(classifier, param_grid=search_params, scoring='recall')\\\n", " .fit(X_train, y_train)\n", " \n", " print_search_result(classifier_name, search_result)\n", " " ] }, { "cell_type": "code", "execution_count": 11, "id": "boxed-worry", "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LogisticRegression\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.neighbors import KNeighborsClassifier\n", "\n", "log = LogisticRegression(C=1).fit(X_train, y_train)\n", "knn = KNeighborsClassifier(n_neighbors=5).fit(X_train, y_train)\n", "dtc = DecisionTreeClassifier(max_depth=6).fit(X_train, y_train)\n", "\n", "lst = [log, knn, dtc]" ] }, { "cell_type": "markdown", "id": "champion-control", "metadata": {}, "source": [ "## Decision functions" ] }, { "cell_type": "code", "execution_count": 12, "id": "moral-papua", "metadata": {}, "outputs": [], "source": [ "def get_y_predict(clsf, samples):\n", " dec_fun = getattr(clsf, 'decision_function', None)\n", " if dec_fun:\n", " return clsf.decision_function(samples)\n", " else:\n", " # only interested in positive score\n", " return clsf.predict_proba(samples)[0:, 1:]" ] }, { "cell_type": "markdown", "id": "oriental-sharing", "metadata": {}, "source": [ "## Precision/Recall curves" ] }, { "cell_type": "code", "execution_count": 13, "id": "native-restoration", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "from sklearn.metrics import precision_recall_curve\n", "import matplotlib.pyplot as plt\n", "\n", "# threshold I'm interested in\n", "THRESHOLD = 0.75\n", "\n", "plt.figure()\n", "_, ax = plt.subplots(1, 3, figsize=(15, 4))\n", "cols = 0\n", "\n", "# plotting precision-recall charts\n", "for classifier in lst:\n", " y_predict = get_y_predict(classifier, X_test)\n", " precision, recall, thresholds = precision_recall_curve(y_test, y_predict)\n", " ax[cols].title.set_text(str(type(classifier).__name__))\n", " ax[cols].set(xlabel='Precision', ylabel='Recall')\n", " ax[cols].step(precision, recall)\n", " criteria = np.argmin(np.abs(thresholds - THRESHOLD))\n", " ax[cols].plot(precision[criteria], recall[criteria], 'o', c='r')\n", " ax[cols].grid(axis='both', linestyle='--', c='#cccccc')\n", " cols+=1\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "printable-eight", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.6" } }, "nbformat": 4, "nbformat_minor": 5 }