AMITT/HTML_GENERATING_CODE/test_new_code.ipynb
Sara-Jayne Terp e1ae84d741 Updated datasheet generating code
Overhauled generating code to include:
* datasheet for each counter
* one file to generate all TTPs (creator and counter)
* one master data spreadsheet (creator and counter)
* more readable code
* counter lists in technique sheets
2021-02-19 06:09:32 +00:00

626 строки
23 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Updating ../phases/P01.md\n",
"Updating ../phases/P02.md\n",
"Updating ../phases/P03.md\n",
"Updating ../phases/P04.md\n",
"Updating ../tactics/TA01.md\n",
"Updating ../tactics/TA02.md\n",
"Updating ../tactics/TA03.md\n",
"Updating ../tactics/TA04.md\n",
"Updating ../tactics/TA05.md\n",
"Updating ../tactics/TA06.md\n",
"Updating ../tactics/TA07.md\n",
"Updating ../tactics/TA08.md\n",
"Updating ../tactics/TA09.md\n",
"Updating ../tactics/TA10.md\n",
"Updating ../tactics/TA11.md\n",
"Updating ../tactics/TA12.md\n",
"Updating ../techniques/T0001.md\n",
"Updating ../techniques/T0002.md\n",
"Updating ../techniques/T0003.md\n",
"Updating ../techniques/T0004.md\n",
"Updating ../techniques/T0005.md\n",
"Updating ../techniques/T0006.md\n",
"Updating ../techniques/T0007.md\n",
"Updating ../techniques/T0008.md\n",
"Updating ../techniques/T0009.md\n",
"Updating ../techniques/T0010.md\n",
"Updating ../techniques/T0011.md\n",
"Updating ../techniques/T0012.md\n",
"Updating ../techniques/T0013.md\n",
"Updating ../techniques/T0014.md\n",
"Updating ../techniques/T0015.md\n",
"Updating ../techniques/T0016.md\n",
"Updating ../techniques/T0017.md\n",
"Updating ../techniques/T0018.md\n",
"Updating ../techniques/T0019.md\n",
"Updating ../techniques/T0020.md\n",
"Updating ../techniques/T0021.md\n",
"Updating ../techniques/T0022.md\n",
"Updating ../techniques/T0023.md\n",
"Updating ../techniques/T0024.md\n",
"Updating ../techniques/T0025.md\n",
"Updating ../techniques/T0026.md\n",
"Updating ../techniques/T0027.md\n",
"Updating ../techniques/T0028.md\n",
"Updating ../techniques/T0029.md\n",
"Updating ../techniques/T0030.md\n",
"Updating ../techniques/T0031.md\n",
"Updating ../techniques/T0032.md\n",
"Updating ../techniques/T0033.md\n",
"Updating ../techniques/T0034.md\n",
"Updating ../techniques/T0035.md\n",
"Updating ../techniques/T0036.md\n",
"Updating ../techniques/T0037.md\n",
"Updating ../techniques/T0038.md\n",
"Updating ../techniques/T0039.md\n",
"Updating ../techniques/T0040.md\n",
"Updating ../techniques/T0041.md\n",
"Updating ../techniques/T0042.md\n",
"Updating ../techniques/T0043.md\n",
"Updating ../techniques/T0044.md\n",
"Updating ../techniques/T0045.md\n",
"Updating ../techniques/T0046.md\n",
"Updating ../techniques/T0047.md\n",
"Updating ../techniques/T0048.md\n",
"Updating ../techniques/T0049.md\n",
"Updating ../techniques/T0050.md\n",
"Updating ../techniques/T0051.md\n",
"Updating ../techniques/T0052.md\n",
"Updating ../techniques/T0053.md\n",
"Updating ../techniques/T0054.md\n",
"Updating ../techniques/T0055.md\n",
"Updating ../techniques/T0056.md\n",
"Updating ../techniques/T0057.md\n",
"Updating ../techniques/T0058.md\n",
"Updating ../techniques/T0059.md\n",
"Updating ../techniques/T0060.md\n",
"Updating ../techniques/T0061.md\n",
"Updating ../tasks/TK0001.md\n",
"Updating ../tasks/TK0002.md\n",
"Updating ../tasks/TK0003.md\n",
"Updating ../tasks/TK0004.md\n",
"Updating ../tasks/TK0005.md\n",
"Updating ../tasks/TK0006.md\n",
"Updating ../tasks/TK0007.md\n",
"Updating ../tasks/TK0008.md\n",
"Updating ../tasks/TK0009.md\n",
"Updating ../tasks/TK0010.md\n",
"Updating ../tasks/TK0011.md\n",
"Updating ../tasks/TK0012.md\n",
"Updating ../tasks/TK0013.md\n",
"Updating ../tasks/TK0014.md\n",
"Updating ../tasks/TK0015.md\n",
"Updating ../tasks/TK0016.md\n",
"Updating ../tasks/TK0017.md\n",
"Updating ../tasks/TK0018.md\n",
"Updating ../tasks/TK0019.md\n",
"Updating ../tasks/TK0020.md\n",
"Updating ../tasks/TK0021.md\n",
"Updating ../tasks/TK0022.md\n",
"Updating ../tasks/TK0023.md\n",
"Updating ../tasks/TK0024.md\n",
"Updating ../tasks/TK0025.md\n",
"Updating ../tasks/TK0026.md\n",
"Updating ../tasks/TK0027.md\n",
"Updating ../tasks/TK0028.md\n",
"Updating ../tasks/TK0029.md\n",
"Updating ../tasks/TK0030.md\n",
"Updating ../incidents/I00001.md\n",
"Updating ../incidents/I00002.md\n",
"Updating ../incidents/I00003.md\n",
"Updating ../incidents/I00004.md\n",
"Updating ../incidents/I00005.md\n",
"Updating ../incidents/I00006.md\n",
"Updating ../incidents/I00007.md\n",
"Updating ../incidents/I00008.md\n",
"Updating ../incidents/I00009.md\n",
"Updating ../incidents/I00010.md\n",
"Updating ../incidents/I00011.md\n",
"Updating ../incidents/I00012.md\n",
"Updating ../incidents/I00013.md\n",
"Updating ../incidents/I00014.md\n",
"Updating ../incidents/I00015.md\n",
"Updating ../incidents/I00016.md\n",
"Updating ../incidents/I00017.md\n",
"Updating ../incidents/I00018.md\n",
"Updating ../incidents/I00019.md\n",
"Updating ../incidents/I00020.md\n",
"Updating ../incidents/I00021.md\n",
"Updating ../incidents/I00022.md\n",
"Updating ../incidents/I00023.md\n",
"Updating ../incidents/I00024.md\n",
"Updating ../incidents/I00025.md\n",
"Updating ../incidents/I00026.md\n",
"Updating ../incidents/I00027.md\n",
"Updating ../incidents/I00028.md\n",
"Updating ../incidents/I00029.md\n",
"Updating ../incidents/I00030.md\n",
"Updating ../incidents/I00031.md\n",
"Updating ../incidents/I00032.md\n",
"Updating ../incidents/I00033.md\n",
"Updating ../incidents/I00034.md\n",
"Updating ../incidents/I00035.md\n",
"Updating ../incidents/I00036.md\n",
"Updating ../incidents/I00037.md\n",
"Updating ../incidents/I00038.md\n",
"Updating ../incidents/I00039.md\n",
"Updating ../incidents/I00040.md\n",
"Updating ../incidents/I00041.md\n",
"Updating ../incidents/I00042.md\n",
"Updating ../incidents/I00043.md\n",
"Updating ../incidents/I00044.md\n",
"Updating ../incidents/I00045.md\n",
"Updating ../incidents/I00046.md\n",
"Updating ../incidents/I00047.md\n",
"Updating ../incidents/I00048.md\n",
"Updating ../incidents/I00049.md\n",
"Updating ../incidents/I00050.md\n",
"Updating ../incidents/I00051.md\n",
"Updating ../incidents/I00052.md\n",
"Updating ../incidents/I00053.md\n",
"Updating ../incidents/I00054.md\n",
"Updating ../incidents/I00055.md\n",
"Updating ../incidents/I00056.md\n",
"Updating ../incidents/I00057.md\n",
"Updating ../incidents/I00058.md\n",
"Updating ../incidents/I00059.md\n",
"Updating ../incidents/I00060.md\n",
"Updating ../incidents/I00061.md\n",
"Updating ../incidents/I00062.md\n",
"Updating ../incidents/I00063.md\n",
"Updating ../counters/C00001.md\n",
"Updating ../counters/C00003.md\n",
"Updating ../counters/C00004.md\n",
"Updating ../counters/C00005.md\n",
"Updating ../counters/C00006.md\n",
"Updating ../counters/C00007.md\n",
"Updating ../counters/C00008.md\n",
"Updating ../counters/C00009.md\n",
"Updating ../counters/C00010.md\n",
"Updating ../counters/C00011.md\n",
"Updating ../counters/C00012.md\n",
"Updating ../counters/C00013.md\n",
"Updating ../counters/C00014.md\n",
"Updating ../counters/C00015.md\n",
"Updating ../counters/C00016.md\n",
"Updating ../counters/C00017.md\n",
"Updating ../counters/C00018.md\n",
"Updating ../counters/C00019.md\n",
"Updating ../counters/C00020.md\n",
"Updating ../counters/C00021.md\n",
"Updating ../counters/C00022.md\n",
"Updating ../counters/C00023.md\n",
"Updating ../counters/C00024.md\n",
"Updating ../counters/C00025.md\n",
"Updating ../counters/C00026.md\n",
"Updating ../counters/C00027.md\n",
"Updating ../counters/C00028.md\n",
"Updating ../counters/C00029.md\n",
"Updating ../counters/C00030.md\n",
"Updating ../counters/C00031.md\n",
"Updating ../counters/C00032.md\n",
"Updating ../counters/C00033.md\n",
"Updating ../counters/C00034.md\n",
"Updating ../counters/C00035.md\n",
"Updating ../counters/C00036.md\n",
"Updating ../counters/C00039.md\n",
"Updating ../counters/C00040.md\n",
"Updating ../counters/C00042.md\n",
"Updating ../counters/C00043.md\n",
"Updating ../counters/C00044.md\n",
"Updating ../counters/C00045.md\n",
"Updating ../counters/C00046.md\n",
"Updating ../counters/C00047.md\n",
"Updating ../counters/C00048.md\n",
"Updating ../counters/C00049.md\n",
"Updating ../counters/C00050.md\n",
"Updating ../counters/C00051.md\n",
"Updating ../counters/C00052.md\n",
"Updating ../counters/C00053.md\n",
"Updating ../counters/C00054.md\n",
"Updating ../counters/C00055.md\n",
"Updating ../counters/C00056.md\n",
"Updating ../counters/C00057.md\n",
"Updating ../counters/C00058.md\n",
"Updating ../counters/C00059.md\n",
"Updating ../counters/C00060.md\n",
"Updating ../counters/C00061.md\n",
"Updating ../counters/C00062.md\n",
"Updating ../counters/C00063.md\n",
"Updating ../counters/C00065.md\n",
"Updating ../counters/C00066.md\n",
"Updating ../counters/C00067.md\n",
"Updating ../counters/C00068.md\n",
"Updating ../counters/C00069.md\n",
"Updating ../counters/C00070.md\n",
"Updating ../counters/C00071.md\n",
"Updating ../counters/C00072.md\n",
"Updating ../counters/C00073.md\n",
"Updating ../counters/C00074.md\n",
"Updating ../counters/C00075.md\n",
"Updating ../counters/C00076.md\n",
"Updating ../counters/C00077.md\n",
"Updating ../counters/C00078.md\n",
"Updating ../counters/C00079.md\n",
"Updating ../counters/C00080.md\n",
"Updating ../counters/C00081.md\n",
"Updating ../counters/C00082.md\n",
"Updating ../counters/C00084.md\n",
"Updating ../counters/C00085.md\n",
"Updating ../counters/C00086.md\n",
"Updating ../counters/C00087.md\n",
"Updating ../counters/C00088.md\n",
"Updating ../counters/C00089.md\n",
"Updating ../counters/C00090.md\n",
"Updating ../counters/C00091.md\n",
"Updating ../counters/C00092.md\n",
"Updating ../counters/C00093.md\n",
"Updating ../counters/C00094.md\n",
"Updating ../counters/C00095.md\n",
"Updating ../counters/C00096.md\n",
"Updating ../counters/C00097.md\n",
"Updating ../counters/C00098.md\n",
"Updating ../counters/C00099.md\n",
"Updating ../counters/C00100.md\n",
"Updating ../counters/C00101.md\n",
"Updating ../counters/C00102.md\n",
"Updating ../counters/C00103.md\n",
"Updating ../counters/C00105.md\n",
"Updating ../counters/C00106.md\n",
"Updating ../counters/C00107.md\n",
"Updating ../counters/C00109.md\n",
"Updating ../counters/C00110.md\n",
"Updating ../counters/C00111.md\n",
"Updating ../counters/C00112.md\n",
"Updating ../counters/C00113.md\n",
"Updating ../counters/C00114.md\n",
"Updating ../counters/C00115.md\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Updating ../counters/C00116.md\n",
"Updating ../counters/C00117.md\n",
"Updating ../counters/C00118.md\n",
"Updating ../counters/C00119.md\n",
"Updating ../counters/C00120.md\n",
"Updating ../counters/C00121.md\n",
"Updating ../counters/C00122.md\n",
"Updating ../counters/C00123.md\n",
"Updating ../counters/C00124.md\n",
"Updating ../counters/C00125.md\n",
"Updating ../counters/C00126.md\n",
"Updating ../counters/C00128.md\n",
"Updating ../counters/C00129.md\n",
"Updating ../counters/C00130.md\n",
"Updating ../counters/C00131.md\n",
"Updating ../counters/C00133.md\n",
"Updating ../counters/C00135.md\n",
"Updating ../counters/C00136.md\n",
"Updating ../counters/C00137.md\n",
"Updating ../counters/C00138.md\n",
"Updating ../counters/C00139.md\n",
"Updating ../counters/C00140.md\n",
"Updating ../counters/C00141.md\n",
"Updating ../counters/C00142.md\n",
"Updating ../counters/C00143.md\n",
"Updating ../counters/C00144.md\n",
"Updating ../counters/C00145.md\n",
"Updating ../counters/C00147.md\n",
"Updating ../counters/C00148.md\n",
"Updating ../counters/C00149.md\n",
"Updating ../counters/C00150.md\n",
"Updating ../counters/C00151.md\n",
"Updating ../counters/C00152.md\n",
"Updating ../counters/C00153.md\n",
"Updating ../counters/C00154.md\n",
"Updating ../counters/C00155.md\n",
"Updating ../counters/C00156.md\n",
"Updating ../counters/C00157.md\n",
"Updating ../counters/C00158.md\n",
"Updating ../counters/C00159.md\n",
"Updating ../counters/C00160.md\n",
"Updating ../counters/C00161.md\n",
"Updating ../counters/C00162.md\n",
"Updating ../counters/C00164.md\n",
"Updating ../counters/C00165.md\n",
"Updating ../counters/C00167.md\n",
"Updating ../counters/C00169.md\n",
"Updating ../counters/C00170.md\n",
"Updating ../counters/C00171.md\n",
"Updating ../counters/C00172.md\n",
"Updating ../counters/C00174.md\n",
"Updating ../counters/C00176.md\n",
"Updating ../counters/C00178.md\n",
"Updating ../counters/C00179.md\n",
"Updating ../counters/C00182.md\n",
"Updating ../counters/C00184.md\n",
"Updating ../counters/C00188.md\n",
"Updating ../counters/C00189.md\n",
"Updating ../counters/C00190.md\n",
"Updating ../counters/C00193.md\n",
"Updating ../counters/C00194.md\n",
"Updating ../counters/C00195.md\n",
"Updating ../counters/C00196.md\n",
"Updating ../counters/C00197.md\n",
"Updating ../counters/C00200.md\n",
"Updating ../counters/C00202.md\n",
"Updating ../counters/C00203.md\n",
"Updating ../counters/C00204.md\n",
"Updating ../counters/C00205.md\n",
"Updating ../counters/C00207.md\n",
"Updating ../counters/C00210.md\n",
"Updating ../counters/C00211.md\n",
"Updating ../counters/C00212.md\n",
"Updating ../counters/C00214.md\n",
"Updating ../counters/C00215.md\n",
"Updating ../counters/C00216.md\n",
"Updating ../counters/C00217.md\n",
"Updating ../counters/C00218.md\n",
"Updating ../counters/C00219.md\n"
]
}
],
"source": [
"from generate_amitt_ttps import Amitt\n",
"amitt = Amitt()\n",
"amitt.update_markdown_files()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"updated ../matrix.md\n",
"updated ../incidents.md\n",
"updated ../matrix_to_message.html\n",
"Writing ../counter_tactics/TA01counters.md\n",
"Writing ../counter_tactics/TA02counters.md\n",
"Writing ../counter_tactics/TA03counters.md\n",
"Writing ../counter_tactics/TA04counters.md\n",
"Writing ../counter_tactics/TA05counters.md\n",
"Writing ../counter_tactics/TA06counters.md\n",
"Writing ../counter_tactics/TA07counters.md\n",
"Writing ../counter_tactics/TA08counters.md\n",
"Writing ../counter_tactics/TA09counters.md\n",
"Writing ../counter_tactics/TA10counters.md\n",
"Writing ../counter_tactics/TA11counters.md\n",
"Writing ../counter_tactics/TA12counters.md\n",
"updated ../counter_tactic_counts.md\n",
"Writing ../counters_metatag/cleaningcounters.md\n",
"Writing ../counters_metatag/countermessagingcounters.md\n",
"Writing ../counters_metatag/data pollutioncounters.md\n",
"Writing ../counters_metatag/daylightcounters.md\n",
"Writing ../counters_metatag/dilutioncounters.md\n",
"Writing ../counters_metatag/diversioncounters.md\n",
"Writing ../counters_metatag/frictioncounters.md\n",
"Writing ../counters_metatag/metatechniquecounters.md\n",
"Writing ../counters_metatag/reduce resourcescounters.md\n",
"Writing ../counters_metatag/removalcounters.md\n",
"Writing ../counters_metatag/resiliencecounters.md\n",
"Writing ../counters_metatag/scoringcounters.md\n",
"Writing ../counters_metatag/targetingcounters.md\n",
"Writing ../counters_metatag/verificationcounters.md\n",
"updated ../counter_metatag_counts.md\n",
"Writing ../counter_resource/DHScounters.md\n",
"Writing ../counter_resource/NGOcounters.md\n",
"Writing ../counter_resource/activistscounters.md\n",
"Writing ../counter_resource/adtechcounters.md\n",
"Writing ../counter_resource/civil_societycounters.md\n",
"Writing ../counter_resource/community_groupscounters.md\n",
"Writing ../counter_resource/companiescounters.md\n",
"Writing ../counter_resource/content_creatorscounters.md\n",
"Writing ../counter_resource/data_scientistcounters.md\n",
"Writing ../counter_resource/datastreamscounters.md\n",
"Writing ../counter_resource/developerscounters.md\n",
"Writing ../counter_resource/educatorscounters.md\n",
"Writing ../counter_resource/elvescounters.md\n",
"Writing ../counter_resource/factcheckerscounters.md\n",
"Writing ../counter_resource/fundingcounters.md\n",
"Writing ../counter_resource/gamesdesignerscounters.md\n",
"Writing ../counter_resource/governmentcounters.md\n",
"Writing ../counter_resource/government:policymakerscounters.md\n",
"Writing ../counter_resource/influencerscounters.md\n",
"Writing ../counter_resource/influencers:trusted_authoritycounters.md\n",
"Writing ../counter_resource/infoseccounters.md\n",
"Writing ../counter_resource/librariescounters.md\n",
"Writing ../counter_resource/mediacounters.md\n",
"Writing ../counter_resource/militarycounters.md\n",
"Writing ../counter_resource/moneycounters.md\n",
"Writing ../counter_resource/platform_admincounters.md\n",
"Writing ../counter_resource/platform_admin:adtechcounters.md\n",
"Writing ../counter_resource/platform_admin:fundingsitescounters.md\n",
"Writing ../counter_resource/platform_admin:socialmediacounters.md\n",
"Writing ../counter_resource/platform_algorithmscounters.md\n",
"Writing ../counter_resource/platform_outreachcounters.md\n",
"Writing ../counter_resource/platformscounters.md\n",
"Writing ../counter_resource/publiccounters.md\n",
"Writing ../counter_resource/public:account_ownerscounters.md\n",
"Writing ../counter_resource/religious_organisationscounters.md\n",
"Writing ../counter_resource/schoolscounters.md\n",
"Writing ../counter_resource/server_admincounters.md\n",
"updated ../counter_resource_counts.md\n"
]
}
],
"source": [
"amitt.write_grid_markdown()\n",
"amitt.write_incidentlist_markdown()\n",
"amitt.write_grid_message_generator()\n",
"amitt.write_responsetype_tactics_table_file()\n",
"amitt.write_metatechniques_responsetype_table_file()\n",
"amitt.write_resources_responsetype_table_file()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"vars(amitt)['tactics']"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"vars(amitt).keys()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"###. TEST AREA"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def create_tactic_counters_string(tactic_id):\n",
" table_string = '''\n",
"| Response types | Counters |\n",
"| -------------- | -------- |\n",
"'''\n",
" tactic_counters = amitt.df_counters[amitt.df_counters['tactic_id']==tactic_id]\n",
" row_string = '| {0} | [{1} {2}](../counters/{1}.md) |\\n'\n",
" for index, row in tactic_counters.sort_values(['responsetype', 'id']).iterrows():\n",
" table_string += row_string.format(row['responsetype'], row['id'], row['name'])\n",
" return table_string\n",
"\n",
"\n",
"def create_technique_counters_string(technique_id):\n",
" table_string = '''\n",
"| Counters |\n",
"| -------- |\n",
"'''\n",
" technique_counters = amitt.cross_counterid_techniqueid[amitt.cross_counterid_techniqueid['technique_id']==technique_id]\n",
" technique_counters = pd.merge(technique_counters, amitt.df_counters[['id', 'name']])\n",
" row_string = '| [{0} {1}](../counters/{0}.md) |\\n'\n",
" for index, row in technique_counters.sort_values('id').iterrows():\n",
" table_string += row_string.format(row['id'], row['name'])\n",
" return table_string\n",
"\n",
"create_technique_counters_string('TA01')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"amitt.df_counters"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"amitt.cross_counterid_techniqueid[amitt.cross_counterid_techniqueid['technique_id'] == 'T0006']"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"amitt.cross_counterid_techniqueid"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"technique_id='T0006'\n",
"xx = amitt.cross_counterid_techniqueid[amitt.cross_counterid_techniqueid['technique_id']==technique_id]\n",
"pd.merge(xx, amitt.df_counters[['id', 'name']])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tactics=self.create_counter_tactics_string(row['id'])\n",
"techniques=self.create_counter_techniques_string(row['id'])\n",
"incidents=self.create_counter_incidents_string(row['id'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pd.pivot_table(amitt.df_counters[['tactic_id', 'responsetype','id']], index='responsetype', columns='tactic_id', aggfunc=len, fill_value=0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}