{ "cells": [ { "cell_type": "markdown", "id": "6c06000b-f238-478b-ab60-672e511358bd", "metadata": {}, "source": [ "# CPE" ] }, { "cell_type": "markdown", "id": "f86bac1a-41aa-470f-8d6a-99d89703de66", "metadata": {}, "source": [ "**Common Platform Enumeration (CPE)** is a structured naming scheme for information technology systems, software, and packages. Based upon the generic syntax for Uniform Resource Identifiers (URI), CPE includes a formal name format, a method for checking names against a system, and a description format for binding text and tests to a name. This method of naming is known as a well-formed CPE name (WFN)\n", "\n", "> source: [cpe.mitre.org/specification](https://cpe.mitre.org/specification/)\n", "\n" ] }, { "cell_type": "markdown", "id": "e905d329-eb7e-4552-94ce-1c8985f6e966", "metadata": {}, "source": [ "You can see this notebook directly via:\n", "- [GitHub](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cpe/cpe.ipynb)\n", "- [Jupter nbviewer](https://nbviewer.org/github/LimberDuck/limberduck.org/blob/master/docs/notebooks/cpe/cpe.ipynb)" ] }, { "cell_type": "markdown", "id": "d18ea856-b88a-4144-a015-c621bf1f208a", "metadata": { "tags": [] }, "source": [ "## Generation time" ] }, { "cell_type": "code", "execution_count": 1, "id": "0b6493e1-214a-475c-aff7-84e76f802de7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2023-03-30 19:34:20 +0000\n" ] } ], "source": [ "from datetime import datetime, timezone, timedelta\n", "\n", "timezone_offset = 0.0\n", "tzinfo = timezone(timedelta(hours=timezone_offset))\n", "generation_time = datetime.now(tzinfo).strftime('%Y-%m-%d %H:%M:%S %z')\n", "print(generation_time)" ] }, { "cell_type": "markdown", "id": "e4a65b9b-d993-495b-92f4-463d544f9ca1", "metadata": {}, "source": [ "## Creative Commons" ] }, { "cell_type": "markdown", "id": "ae373a12-06be-41be-bea8-c01904517c0b", "metadata": {}, "source": [ "This notebook and generated diagrams are released with [Creative Commons liecense (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.en).\n", "\n", "\"CC" ] }, { "cell_type": "code", "execution_count": 2, "id": "f660068b-6834-49b7-9dd5-ed149a4ed2d2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cc.xlarge.png\n", "by.xlarge.png\n" ] } ], "source": [ "import requests\n", "import urllib3\n", "\n", "urllib3.disable_warnings()\n", "\n", "urls = ['https://mirrors.creativecommons.org/presskit/icons/cc.xlarge.png',\n", " 'https://mirrors.creativecommons.org/presskit/icons/by.xlarge.png']\n", "for url in urls:\n", " file_name = url.split(\"/\")[-1:][0]\n", " print(file_name)\n", "\n", " file = requests.get(url, verify=False)\n", " open(file_name, 'wb').write(file.content)" ] }, { "cell_type": "markdown", "id": "7af4b2f4-d6ed-4327-89ed-f0080ff9e88c", "metadata": {}, "source": [ "## CPE data downloading\n", "\n", "All CPE stats are taken from [nvd.nist.gov/products/cpe/statistics](https://nvd.nist.gov/products/cpe/statistics)" ] }, { "cell_type": "code", "execution_count": 3, "id": "d46bff47-b63d-4d2d-b634-21cac2b2c254", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15\n" ] } ], "source": [ "from urllib.request import urlopen\n", "import ssl\n", "from bs4 import BeautifulSoup, SoupStrainer\n", "\n", "def get_data(url):\n", "\n", " ctx = ssl.create_default_context()\n", " ctx.check_hostname = False\n", " ctx.verify_mode = ssl.CERT_NONE\n", "\n", " page = urlopen(url, context=ctx)\n", " html = page.read().decode(\"utf-8\")\n", " \n", " product = SoupStrainer('table')\n", " soup = BeautifulSoup(html, \"html.parser\", parse_only=product)\n", " \n", " return soup\n", "\n", "url = \"https://nvd.nist.gov/products/cpe/statistics\"\n", "data = get_data(url)\n", "\n", "print(len(data))" ] }, { "cell_type": "markdown", "id": "9974ad6b-3ee7-483c-9226-370d241bd3ac", "metadata": {}, "source": [ "## New CPE entries" ] }, { "cell_type": "markdown", "id": "44f06c78-39e5-40cf-a298-16f7c84bcbc6", "metadata": {}, "source": [ "### CPE data parsing" ] }, { "cell_type": "code", "execution_count": 4, "id": "bae10707-ccbc-4683-9090-5da17daf9506", "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", " \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", "
 YearSummaryJanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember
1200957861814228306396122092411103301021960150
220101109499023450911068038864261252707133610261819
3201192637029255832252818682430390423470737851
420122323511481003162225013228225931242887158318301110940
52013156711460110511381271932989162313591140194113271386
6201416714155211511644210321751447160688688526013801625
72015650375865484983842973644656481216144788
8201611075245053587169973214713217629794536961106
92017186587468881070193514981211136418901516159625872357
1020185652222762405157325251049151633707389637231086265643337
1120192723336810719710466129791318132838454592376647202267172273122987
12202017204215960186682015916307145171125010659144591307710921929316772
132021189646112531496918562154761399718730207951653614038161721716711951
142022176239113171215113618104281027214470138171827214418155771490426995
15202356957183221651722118000000000
\n" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "def pars(data):\n", " data_table = []\n", " \n", " for table in data:\n", " table_id = table['id']\n", " table_year = table_id[-4:]\n", " table_rows = table.find_all(\"tr\")\n", " number_of_new_cpe_entries_yearly = 0\n", " number_of_new_cpe_entries_list = []\n", " data_row = []\n", " for table_row in table_rows:\n", " data = table_row.find_all(\"td\")\n", " \n", " if data:\n", " number_of_new_cpe_entries = int(data[1].string.replace(\",\",\"\"))\n", " \n", " number_of_new_cpe_entries_list.append(number_of_new_cpe_entries)\n", " \n", " number_of_new_cpe_entries_yearly += number_of_new_cpe_entries\n", " \n", " while len(number_of_new_cpe_entries_list) < 12:\n", " number_of_new_cpe_entries_list.append(0)\n", "\n", " data_row.append(table_year)\n", " data_row.append(number_of_new_cpe_entries_yearly)\n", " data_row = data_row + number_of_new_cpe_entries_list\n", "\n", " data_table.append(data_row)\n", " \n", " data_columns = ['Year', 'Summary', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n", " df = pd.DataFrame (data_table, columns = data_columns)\n", " df.sort_values(by=['Year'], inplace=True) \n", " df.reset_index(drop=True, inplace=True)\n", " df.index += 1\n", " return df\n", " \n", "parsed_data = pars(data)\n", "\n", "parsed_data.style.bar(subset=['Summary'], color='#FF6200')" ] }, { "cell_type": "markdown", "id": "eaef190d-2e0c-475f-b1d6-fa441d5b3e4a", "metadata": {}, "source": [ "### CPE data saving" ] }, { "cell_type": "markdown", "id": "93f11ea7-2207-4082-8cba-6ad1e3defd4a", "metadata": {}, "source": [ "CSV file is available in GitHub repository, see:\n", "\n", "- [file via GitHub](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cpe/cpe-number-of-new-entries.csv)\n", "- [file directly](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cpe/cpe-number-of-new-entries.csv)" ] }, { "cell_type": "code", "execution_count": 5, "id": "2ae932f3-8efb-488f-b622-258f17610704", "metadata": {}, "outputs": [], "source": [ "csv_filename = 'cpe-number-of-new-entries.csv'\n", "\n", "parsed_data.to_csv(csv_filename, index=False)" ] }, { "cell_type": "markdown", "id": "19290881-0ba4-44fb-b73c-fa906c122998", "metadata": {}, "source": [ "### CPE data ploting" ] }, { "cell_type": "markdown", "id": "9cf9d5fc-54c5-42ba-a644-a2e858ad03ad", "metadata": {}, "source": [ "PNG files are available in GitHub repository with two background versions, see: \n", "\n", "- [file via GitHub (white background)](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cpe/cpe-number-of-new-entries-bg-white.png)\n", "- [file via GitHub (transparent background)](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cpe/cpe-number-of-new-entries-bg-transparent.png)\n", "- [file directly (white background)](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cpe/cpe-number-of-new-entries-bg-white.png)\n", "- [file directly (transparent background)](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cpe/cpe-number-of-new-entries-bg-transparent.png)" ] }, { "cell_type": "code", "execution_count": 6, "id": "72c404e4-64ab-405a-84f7-49d890f71429", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApMAAAGmCAYAAAAgSQ9+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAABUXUlEQVR4nO3de3zP9f//8ft7m7OZTQ6zLac5jSHmTEgjKucQOddyqOSQRIpPxRRF0SdDPuNTJAkVcsg6yCEyYfqiDJtF2MbmtMPz94ef96e1jXnZ9n7T7Xq5uFzee74Oz/vr8H6/H16nt80YYwQAAABY4OLoAAAAALhzUUwCAADAMopJAAAAWEYxCQAAAMsoJgEAAGAZxSQAAAAso5gE8I8wcOBAvfzyyw7p2xijQYMGydPTU40aNXJIBgDIKxSTAByiYsWKKlOmjJKTk+1tCxYsUOvWrR0XKo/88MMP2rhxo2JiYrRz584sx4mLi9OQIUPk7e0td3d31ahRQ6+++qp9/dhsNhUrVkzFixeXj4+PRo8erbS0NEnX1mWRIkVUvHhx+79nnnkm35YPwD8bxSQAh0lLS9Ps2bMdHeOWXS/icurYsWOqWLGiihUrluXwc+fOqWnTprp06ZK2bdumCxcuaOPGjUpISNBvv/1mH2/v3r1KSkrS5s2b9fHHH2v+/Pn2YV988YWSkpLs/+bMmWNt4W5BampqnveRnVvdBgDyDsUkAId54YUXNGPGDCUkJGQaFh0dLZvNlqFgad26tRYsWCBJ+s9//qPmzZtr1KhRKlmypCpXrqwff/xR//nPf+Tn56cyZcooPDw8wzzPnDmj4OBgubu7q1WrVjp27Jh92K+//qrg4GB5eXmpevXqWr58uX3YwIEDNWzYMHXs2FHFihXTli1bMuU9efKkOnXqJC8vL/n7+9sLvYULF+rJJ5/Utm3bVLx4cb366quZpn377bfl7u6u//73v6pYsaIkyc/PT7Nnz1adOnUyjV+jRg21bNlS+/fvv8HazdrkyZPVo0cP9erVS+7u7qpfv7727t2bYTm6d++u0qVLq1KlSnr33XczTfvEE0+oRIkS+s9//pNh3j/99JPKli2bodBbuXKl6tatK0lKT09XaGioqlSpolKlSqlnz546d+6cfdzHHntM5cqVk4eHh+6//34dOHDAPiwn2wCAY1BMAnCYoKAgtW7dWjNmzLA0/Y4dO1SnTh2dPXtWffr0Ue/evfXTTz/pyJEj+u9//6tnnnlGSUlJ9vE/+ugjTZo0SWfOnFG9evXUt29fSVJycrKCg4PVp08fnT59WsuWLdPw4cMVFRVln/bjjz/WxIkTdeHCBbVo0SJTlt69e8vX11cnT57UihUrNGHCBH3zzTcaMmSIPvjgAzVt2lRJSUmaMmVKpmk3bdqkbt26ycUlZx/JUVFR+v7773Xffffd6iqTJK1evVqPPfaYzp07pz59+qhLly5KSUlRenq6Hn30UdWtW1exsbHavHmzZs2apa+//jrDtD169FBCQoJ9/V3XsGFDlSpVShs2bLC3LVmyRP3795ckvffee1q1apW+/fZbnTx5Up6enhoxYoR93A4dOujw4cM6ffq06tevn2n+N9sGABzEAIADVKhQwWzcuNHs27fPlChRwpw+fdrMnz/ftGrVyhhjzNGjR40kk5KSYp+mVatWZv78+cYYYxYtWmT8/f3tw3755Rcjyfzxxx/2Ni8vL7Nnzx5jjDEDBgwwvXr1sg+7cOGCcXFxMcePHzfLli0zLVq0yJAvJCTETJ482T5tv379sl2W48ePGxcXF3P+/Hl72/jx482AAQPsWZs3b57t9P7+/ubf//53tsONMUaScXd3NyVLljSVK1c2EydONGlpacaYa+uyWLFixsPDw/4vLCwsy/m8+uqrpnHjxva/09LSTLly5cx3331ntm/fbvz8/DKMP3XqVDNw4ED7tC1btrxhztDQUNOnTx9jjDFnz541RYoUMSdPnjTGGFOjRg2zadMm+7gnT540bm5uGbbxdfHx8UaSSUhIMMbcfBsAcBw3x5ayAP7pateurUceeUShoaGqWbPmLU1btmxZ++siRYpk2fbXI5N+fn7218WLF5eXl5dOnjypY8eOaceOHSpZsqR9eGpqqvr165fltH938uRJeXl5yd3d3d5WoUIF7dq1K0fLUapUKcXFxd10vJ9//ln+/v5ZDlu1apUefPDBHPX312VxcXGxH1G12Ww6efJkhvWQlpamli1bZjltVp544gnVrFlTycnJWr58uVq2bClvb29J164d7dq1a4YjsK6urjp16pTKlSuniRMn6tNPP9Wff/5pH+fMmTPy8PDIUd8AHIPT3AAcbsqUKZo/f75iY2PtbddvVrl48aK97Y8//ritfk6cOGF/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J/LzvXDT09yPP/64tm/frm7duql79+7atm2bevXqZamzuLg4++vPP//cfqd3p06dtGzZMl25ckVHjx7V4cOH1ahRIzVs2FCHDx/W0aNHdfXqVS1btkydOnWSzWZTmzZttGLFCklSeHi4OnfubJ9XeHi4JGnFihV64IEHZLPZLOUFAADAjeXoNLe3t7c6dep0SzN+/PHHFRERoTNnzsjX11dTpkxRRESEIiMjZbPZVLFiRc2bN0+SVKtWLfXs2VMBAQFyc3PT3Llz5erqKunaNZbt27dXWlqaBg8erFq1akmSpk+frt69e+vll1/WfffdpyFDhkiShgwZon79+snf319eXl5atmzZLeUGAABAzuWomLRi6dKlmdquF3xZmThxoiZOnJipvWPHjvZHCP1V5cqVtXPnzkzthQsX1qeffnqLaQEAAGDFTU9zAwAAANm5YTGZlpamGjVq5FcWAAAA3GFuWEy6urqqevXqOn78eH7lAQAAwB3kptdMxsfHq1atWmrUqJGKFStmb1+zZk2eBgMAAIDzu2kx+dprr+VHDgAAANyBblpMtmrVSseOHdPhw4f14IMP6uLFi0pLS8uPbAAAAHByN72be/78+erRo4eefvppSdd++7pLly55nQsAAAB3gJsWk3PnztXWrVtVokQJSVLVqlV1+vTpPA8GAAAA53fTYrJQoUIqWLCg/e/U1FR+nhAAAACSclBMtmrVSlOnTtWlS5e0ceNGPfbYY3r00UfzIxsAAACc3E2LydDQUJUuXVqBgYGaN2+eOnbsqNdffz0/sgEAAMDJ3fRubhcXFw0YMECNGzeWzWZT9erVOc0NAAAASTkoJr/66isNHTpUVapUkTFGR48e1bx589ShQ4f8yAcAAAAndtNicsyYMdqyZYv8/f0lSb/99psefvhhikkAAADc/JpJd3d3eyEpSZUrV5a7u3uehgIAAMCdIdsjkytXrpQkBQUFqWPHjurZs6dsNps+/fRTNWzYMN8CAgAAwHllW0x+8cUX9tdly5bVt99+K0kqXbq0Ll26lPfJAAAA4PSyLSYXLVqUnzkAAABwB7rpDThHjx7Ve++9p+joaKWmptrb16xZk6fBAAAA4PxuWkx26dJFQ4YM0aOPPioXl5verwMAAIB/kJsWk4ULF9Zzzz2XH1kAAABwh7lpMTly5EhNmTJF7dq1U6FChezt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D4dle/fdd9W1a9cMP1HrLPr27avU1FRdvHhRJUuWVFJSkrp166bNmzfLGKPw8HCH5vv999+1cuXKDAca+vTpoxIlSjg0F98N1jnrd4PDvxcMbktgYKBJTk42xhjz559/mnbt2hljjNm7d69p2rSpI6OZqlWrmqtXr2Zqv3LlivH393dAopzx8/NzaP+zZ8821apVM507dzYVKlQwq1atsg+77777HJjsmtq1a5vU1FSTnJxs3N3dTWJiojHGmIsXL5rAwECHZrvvvvtM3759zZYtW0xERITZsmWLKVeunImIiDAREREOzdawYUP767CwMFO3bl0zefJk06xZMzNt2jQHJjMmICDApKSkGGOMeeqpp8zIkSPN999/byZPnmy6du3q0GwlSpQw3t7epkWLFmbu3Lnm9OnTDs3zV9f395SUFFOmTBmTmppqjDEmPT3d4e+F2bNnm+DgYPPaa6+Zpk2bmuHDh5sJEyaYmjVrmi1btjg0G98N1jjzd4Ojvxc4zX2bjDEqUqSIJKlYsWI6ffq0JKlOnTo6f/68I6PJxcVFJ0+eVIUKFTK0x8XFOfwUfJ06dbJsN8bo1KlT+Zwmo/nz52v37t0qXry4oqOj1aNHD0VHR2vkyJEyTnAg383NTa6uripatKiqVKliP8pRpEgRh2/XXbt2afbs2XrjjTf01ltvqV69eipSpIhatWrl0FySlJKSYn8dFhamjRs3qnTp0ho7dqyaNGni0KMx6enpcnO79nG8a9cu/fzzz5KkFi1aqF69eg7LJUmVK1fW7t27tWnTJn3yySd69dVX1aBBAz3++OPq1q2b3N3dHZYtPT1dV69eVXJysi5evKjExER5eXnpypUrGba3I8yfP1+RkZFydXXV6NGj1bFjR0VEROjpp59W586dtWfPHodl47vBGmf+bnD09wLF5G3q2LGjHnroId1///1av369HnvsMUnSuXPnHL5zzZo1S23btlXVqlXtp6iOHz+uI0eOaM6cOQ7NdurUKX399dfy9PTM0G6MUbNmzRyU6pr09HT76YuKFSsqIiJCPXr00LFjxxy+TSWpYMGCunjxoooWLardu3fb2xMTEx3+ReDi4qJRo0bpscce06hRo1S2bFmlpqY6NNN16enpio+PV3p6uowxKl26tKRr/wm8Xsg5Su3ate2n8OrWratdu3YpKChIhw4dcvh1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xsYqOjpaAwcOVKNGjXTp0iV5e3trx44dCg0NlSQtXbpUW7ZsUZkyZfTiiy9m+b5o1qyZGjZsqOXLl6t06dLatm2bevTooYEDB2rOnDlyc3PT0KFDtWDBAg0fPlzu7u4KDAy0/8987dq12r59u6ZMmWL/H/mUKVMUHx+vxMREzZs3TyEhIapYsaICAwO1a9cu+/tlyJAheuSRR+zLtXbtWsXGxurq1auaOXOm5syZo99++02urq6aMWOGXnrpJV2+fFl+fn4aPXp0puVZsGCBjh07psTERDVo0CDD+nr66afl4eEhLy8vvfLKK5m2U/ny5SVJBw8e1JQpU3Tvvfeqf//+SkpK0vvvvy9JGj58uC5fvqz9+/frmWeeUe/evbVs2TI98sgj9vW4YcMGpaam6t5779Wzzz6riRMnZvi8ePbZZzVjxgwVLVrU/t55++231aJFC8XFxemNN97QsGHDFB4ernXr1ikuLk7FihXTpk2bVLx48UzPr/v7Z8off/yhS5cuaebMmTp27Jg8PDzUq1evDJ9hxYsXlyS99NJLGbbFPffck2FZN2zYoK5duyowMFA9e/bUJ598oi+//FIPP/ywHnnkEbVp00ZHjhzRsGHD9PPPP2vTpk0KCgpSpUqVMuy/qampevXVV1WtWjUlJSVJknr06KEVK1bogw8+UI0aNVSiRAnNmjVL99xzjwYOHKjIyEhNnTpVvXv31rRp0+Tr66vmzZurS5cu2rBhg1544QW99dZbOn78uEqWLKnXXntNAQEBevrpp7Vv3z7Nnj1bP/74o7766itdunRJ3bt3V7t27bRr1y516NBBPXv2VMWKFfXII49keO/ZbDZ9++23On36tN5+++0Mw44fP660tLQM++H1Gx9ef/11tWjRQn/++acSExP13HPP6Z577lGrVq2UlJSkiIgIubu7a+rUqSpUqJDgnK4/eLxhw4b2tnbt2kmStm7dqtKlS+vBBx9UcnKymjRpot9//10zZ87UY489pmnTpmW4MaZevXqSrt08cyPX9y+rp9T/6vop8uTk5BxPww04kg4cOKCGDRsqPT1dzz//vJ555hkdPHhQ3333nTw8PFSgQAEdPHhQ0rULWMeMGaOvvvpKH3/8sS5duiRPT0/9/vvvunr1qsqXL6/x48eratWqSk1NlZeXl5YvX67atWsrICBAkydP1vfff6/o6GiVLFlSSUlJiomJ0R9//KHp06eradOmGbItXbpUgwcP1ty5c7Vp0yZJkq+vr8aMGaOmTZsqMjIy0/K89dZbGjRokCTZv5grVKigmJgY+zivv/66RowYIUn6448/9PTTTys2Ntb+uADpWiFbunTpTNP/5z//Uffu3TMUgtf9dVh202cnJCREw4cP15o1axQTE6OiRYvav5SuXr2qESNGaPPmzapWrZo2btyogIAAlSlTxj59eHi4/XVSUpKWL1+uLl26KCYmxl7UlSlTxv5oBEn6/vvvNXToUH355ZeaOHGihg4dqtTUVCUmJqpkyZLy8PDQhQsXFBsba5/Hvffeq5iYmByNc12LFi3Up08fe9EzdOhQhYWF6bPPPpPNZsuwr0iSu7u7Ro8erccff1zffvutJGnu3LkqUKCARowYoRMnTqhChQp66qmn7IXk3/tZvHixFixYoDfeeEMffPDBDdd9tWrV9OabbyomJkbPPPOMXnzxRa1fv17StQ/BmTNn6qefftKBAwcyvS/S09M1btw4lStXTuXLl9fUqVNVo0aNLPvZsGGDGjZsqJkzZ2rgwIGSpFWrVmnfvn3617/+Zd9fz58/r+joaM2aNUutW7fWhg0bJElPPfWUHnzwQZ06dUqhoaFq1qxZpj4aN26sadOm6cqVK4qLi1NaWpqKFi2qbdu26fTp04qJiVGzZs305JNPZvk+/+677zRr1iw99NBDmbLff//9mjVrlo4dO6bz589nuZ0k6fTp0/L09FSfPn1Uu3ZtvffeewoLC1NYWJjmzp2b5bq5vh59fHxUsGBBvfPOOxo1apQ2btyY4fMiNjZW77//vr2QvK558+YaN26c/vjjDxUtWlSFChVSQkKCVq5cqR49emjZsmWaP39+lqe1svtMiY6OVlBQkJ577rkMn2HXC8nExMRM2+Lvy/rEE0/oo48+0pEjR1S1alXZbDYdPHhQAQEBSktL08iRIzV16lT7eunQoYOef/75TPvv/PnzFRoaqldffVVXr17Nch2+/fbb+uCDD/T222+rTp06qlevniZMmKBKlSopOTlZHTp0sL8HExIS5Orqqn379um9997Ta6+9JkkqX768Ro4cqYcfflhr1qzRu+++q5IlS8rb21s7d+5USkqK3NzclJiYKFdXV3Xp0kUtW7bM8N5zdXVVenq6UlJStGnTpkzvf0kZ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "import urllib\n", "\n", "df = pd.read_csv(csv_filename)\n", "\n", "df.plot(x='Year', \n", " xlabel='Year',\n", " y='Summary', \n", " ylabel='Number of CPE',\n", " kind='bar', \n", " title='Number of CPE per year')\n", "plt.tight_layout()\n", "plt.legend(['CPE'])\n", "plt.figtext(0.16, 0.02, f\"Generated on {generation_time} thanks to limberduck.org based on source: nvd.nist.gov/products/cpe/statistics\", ha=\"left\", fontsize=7)\n", "fig = plt.gcf()\n", "fig.set_size_inches(10,6)\n", "fig.patch.set_facecolor('white')\n", "plt.grid(True)\n", "\n", "img_cc = plt.imread('cc.xlarge.png')\n", "newax_cc = fig.add_axes([0.88, 0.0, 0.05, 0.05], anchor='NE', zorder=-1)\n", "newax_cc.imshow(img_cc)\n", "newax_cc.axis('off')\n", "img_by = plt.imread('by.xlarge.png')\n", "newax_by = fig.add_axes([0.92, 0.0, 0.05, 0.05], anchor='NE', zorder=-1)\n", "newax_by.imshow(img_by)\n", "newax_by.axis('off')\n", "\n", "plt.savefig('cpe-number-of-new-entries-bg-white.png', dpi = 300, facecolor = 'white')\n", "plt.savefig('cpe-number-of-new-entries-bg-transparent.png', dpi = 300, transparent = True)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.5" } }, "nbformat": 4, "nbformat_minor": 5 }