{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Updating ../counters/C00008.md\n",
"Updating ../counters/C00009.md\n",
"Updating ../counters/C00011.md\n",
"Updating ../counters/C00012.md\n",
"Updating ../counters/C00014.md\n",
"Updating ../counters/C00016.md\n",
"Updating ../counters/C00020.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/C00031.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/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/C00055.md\n",
"Updating ../counters/C00060.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/C00076.md\n",
"Updating ../counters/C00078.md\n",
"Updating ../counters/C00079.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/C00101.md\n",
"Updating ../counters/C00102.md\n",
"Updating ../counters/C00103.md\n",
"Updating ../counters/C00107.md\n",
"Updating ../counters/C00112.md\n",
"Updating ../counters/C00113.md\n",
"Updating ../counters/C00114.md\n",
"Updating ../counters/C00115.md\n",
"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/C00123.md\n",
"Updating ../counters/C00126.md\n",
"Updating ../counters/C00129.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/C00144.md\n",
"Updating ../counters/C00145.md\n",
"Updating ../counters/C00147.md\n",
"Updating ../counters/C00149.md\n",
"Updating ../counters/C00202.md\n",
"Updating ../counters/C00210.md\n",
"updated ../incidents_list.md\n",
"updated ../amitt_red_framework.md\n",
"updated ../amitt_red_framework_clickable.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 ../tactics_by_responsetype_table.md\n",
"Writing metatechniques/cleaningcounters.md\n",
"Writing metatechniques/countermessagingcounters.md\n",
"Writing metatechniques/data pollutioncounters.md\n",
"Writing metatechniques/daylightcounters.md\n",
"Writing metatechniques/dilutioncounters.md\n",
"Writing metatechniques/diversioncounters.md\n",
"Writing metatechniques/frictioncounters.md\n",
"Writing metatechniques/metatechniquecounters.md\n",
"Writing metatechniques/reduce resourcescounters.md\n",
"Writing metatechniques/removalcounters.md\n",
"Writing metatechniques/resiliencecounters.md\n",
"Writing metatechniques/scoringcounters.md\n",
"Writing metatechniques/targetingcounters.md\n",
"Writing metatechniques/verificationcounters.md\n",
"updated ../metatechniques_by_responsetype_table.md\n",
"Writing ../resources_needed/DHScounters.md\n",
"Writing ../resources_needed/NGOcounters.md\n",
"Writing ../resources_needed/activistscounters.md\n",
"Writing ../resources_needed/adtechcounters.md\n",
"Writing ../resources_needed/civil_societycounters.md\n",
"Writing ../resources_needed/community_groupscounters.md\n",
"Writing ../resources_needed/companiescounters.md\n",
"Writing ../resources_needed/content_creatorscounters.md\n",
"Writing ../resources_needed/data_scientistcounters.md\n",
"Writing ../resources_needed/datastreamscounters.md\n",
"Writing ../resources_needed/developerscounters.md\n",
"Writing ../resources_needed/educatorscounters.md\n",
"Writing ../resources_needed/elvescounters.md\n",
"Writing ../resources_needed/factcheckerscounters.md\n",
"Writing ../resources_needed/fundingcounters.md\n",
"Writing ../resources_needed/gamesdesignerscounters.md\n",
"Writing ../resources_needed/governmentcounters.md\n",
"Writing ../resources_needed/government:policymakerscounters.md\n",
"Writing ../resources_needed/influencerscounters.md\n",
"Writing ../resources_needed/influencers:trusted_authoritycounters.md\n",
"Writing ../resources_needed/infoseccounters.md\n",
"Writing ../resources_needed/librariescounters.md\n",
"Writing ../resources_needed/mediacounters.md\n",
"Writing ../resources_needed/militarycounters.md\n",
"Writing ../resources_needed/moneycounters.md\n",
"Writing ../resources_needed/platform_admincounters.md\n",
"Writing ../resources_needed/platform_admin:adtechcounters.md\n",
"Writing ../resources_needed/platform_admin:fundingsitescounters.md\n",
"Writing ../resources_needed/platform_admin:socialmediacounters.md\n",
"Writing ../resources_needed/platform_algorithmscounters.md\n",
"Writing ../resources_needed/platform_outreachcounters.md\n",
"Writing ../resources_needed/platformscounters.md\n",
"Writing ../resources_needed/publiccounters.md\n",
"Writing ../resources_needed/public:account_ownerscounters.md\n",
"Writing ../resources_needed/religious_organisationscounters.md\n",
"Writing ../resources_needed/schoolscounters.md\n",
"Writing ../resources_needed/server_admincounters.md\n",
"updated ../resources_by_responsetype_table.md\n"
]
}
],
"source": [
"from generate_amitt_ttps import Amitt\n",
"amitt = Amitt()\n",
"amitt.generate_and_write_datafiles()"
]
},
{
"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": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" technique_id | \n",
"
\n",
" \n",
" \n",
" \n",
" | 6 | \n",
" C00008 | \n",
" TA01 | \n",
"
\n",
" \n",
" | 6 | \n",
" C00008 | \n",
" TA06 | \n",
"
\n",
" \n",
" | 6 | \n",
" C00008 | \n",
" TA08 | \n",
"
\n",
" \n",
" | 6 | \n",
" C00008 | \n",
" T0006 | \n",
"
\n",
" \n",
" | 6 | \n",
" C00008 | \n",
" T0009 | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 182 | \n",
" C00145 | \n",
" T0015 | \n",
"
\n",
" \n",
" | 182 | \n",
" C00145 | \n",
" T0046 | \n",
"
\n",
" \n",
" | 183 | \n",
" C00147 | \n",
" T0060 | \n",
"
\n",
" \n",
" | 185 | \n",
" C00149 | \n",
" TA12 | \n",
"
\n",
" \n",
" | 185 | \n",
" C00149 | \n",
" T0020 | \n",
"
\n",
" \n",
"
\n",
"
283 rows × 2 columns
\n",
"
"
],
"text/plain": [
" id technique_id\n",
"6 C00008 TA01\n",
"6 C00008 TA06\n",
"6 C00008 TA08\n",
"6 C00008 T0006\n",
"6 C00008 T0009\n",
".. ... ...\n",
"182 C00145 T0015\n",
"182 C00145 T0046\n",
"183 C00147 T0060\n",
"185 C00149 TA12\n",
"185 C00149 T0020\n",
"\n",
"[283 rows x 2 columns]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"amitt.cross_counterid_techniqueid"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"'\\n| Counters these Techniques |\\n| ------------------------- |\\n| [C00145 Create hashtag](../techniques/C00145.md) |\\n| [C00145 Search Engine Optimization](../techniques/C00145.md) |\\n'"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"counter_id = 'C00145'\n",
"table_string = '''\n",
"| Counters these Techniques |\n",
"| ------------------------- |\n",
"'''\n",
"counter_techniques = amitt.cross_counterid_techniqueid[amitt.cross_counterid_techniqueid['id']==counter_id]\n",
"counter_techniques = pd.merge(counter_techniques, amitt.df_techniques[['id', 'name']].rename(columns={'id': 'technique_id'}))\n",
"row_string = '| [{0} {1}](../techniques/{0}.md) |\\n'\n",
"for index, row in counter_techniques.sort_values('id').iterrows():\n",
" table_string += row_string.format(row['id'], row['name'])\n",
"\n",
"table_string"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" technique_id | \n",
"
\n",
" \n",
" \n",
" \n",
" | 182 | \n",
" C00145 | \n",
" T0015 | \n",
"
\n",
" \n",
" | 182 | \n",
" C00145 | \n",
" T0046 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id technique_id\n",
"182 C00145 T0015\n",
"182 C00145 T0046"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"counter_techniques = amitt.cross_counterid_techniqueid[amitt.cross_counterid_techniqueid['id']==counter_id]\n",
"\n",
"counter_techniques"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" name | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" T0001 | \n",
" 5Ds (dismiss, distort, distract, dismay, divide) | \n",
"
\n",
" \n",
" | 1 | \n",
" T0002 | \n",
" Facilitate State Propaganda | \n",
"
\n",
" \n",
" | 2 | \n",
" T0003 | \n",
" Leverage Existing Narratives | \n",
"
\n",
" \n",
" | 3 | \n",
" T0004 | \n",
" Competing Narratives | \n",
"
\n",
" \n",
" | 4 | \n",
" T0005 | \n",
" Center of Gravity Analysis | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 56 | \n",
" T0057 | \n",
" Organise remote rallies and events | \n",
"
\n",
" \n",
" | 57 | \n",
" T0058 | \n",
" Legacy web content | \n",
"
\n",
" \n",
" | 58 | \n",
" T0059 | \n",
" Play the long game | \n",
"
\n",
" \n",
" | 59 | \n",
" T0060 | \n",
" Continue to amplify | \n",
"
\n",
" \n",
" | 60 | \n",
" T0061 | \n",
" Sell merchandising | \n",
"
\n",
" \n",
"
\n",
"
61 rows × 2 columns
\n",
"
"
],
"text/plain": [
" id name\n",
"0 T0001 5Ds (dismiss, distort, distract, dismay, divide)\n",
"1 T0002 Facilitate State Propaganda\n",
"2 T0003 Leverage Existing Narratives\n",
"3 T0004 Competing Narratives\n",
"4 T0005 Center of Gravity Analysis\n",
".. ... ...\n",
"56 T0057 Organise remote rallies and events\n",
"57 T0058 Legacy web content\n",
"58 T0059 Play the long game\n",
"59 T0060 Continue to amplify\n",
"60 T0061 Sell merchandising\n",
"\n",
"[61 rows x 2 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"amitt.df_techniques[['id', 'name']]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" technique_id | \n",
" name | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" C00145 | \n",
" T0015 | \n",
" Create hashtag | \n",
"
\n",
" \n",
" | 1 | \n",
" C00145 | \n",
" T0046 | \n",
" Search Engine Optimization | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id technique_id name\n",
"0 C00145 T0015 Create hashtag\n",
"1 C00145 T0046 Search Engine Optimization"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.merge(counter_techniques, amitt.df_techniques[['id', 'name']].rename(columns={'id': 'technique_id'}))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" technique_id | \n",
" name | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" T0001 | \n",
" 5Ds (dismiss, distort, distract, dismay, divide) | \n",
"
\n",
" \n",
" | 1 | \n",
" T0002 | \n",
" Facilitate State Propaganda | \n",
"
\n",
" \n",
" | 2 | \n",
" T0003 | \n",
" Leverage Existing Narratives | \n",
"
\n",
" \n",
" | 3 | \n",
" T0004 | \n",
" Competing Narratives | \n",
"
\n",
" \n",
" | 4 | \n",
" T0005 | \n",
" Center of Gravity Analysis | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 56 | \n",
" T0057 | \n",
" Organise remote rallies and events | \n",
"
\n",
" \n",
" | 57 | \n",
" T0058 | \n",
" Legacy web content | \n",
"
\n",
" \n",
" | 58 | \n",
" T0059 | \n",
" Play the long game | \n",
"
\n",
" \n",
" | 59 | \n",
" T0060 | \n",
" Continue to amplify | \n",
"
\n",
" \n",
" | 60 | \n",
" T0061 | \n",
" Sell merchandising | \n",
"
\n",
" \n",
"
\n",
"
61 rows × 2 columns
\n",
"
"
],
"text/plain": [
" technique_id name\n",
"0 T0001 5Ds (dismiss, distort, distract, dismay, divide)\n",
"1 T0002 Facilitate State Propaganda\n",
"2 T0003 Leverage Existing Narratives\n",
"3 T0004 Competing Narratives\n",
"4 T0005 Center of Gravity Analysis\n",
".. ... ...\n",
"56 T0057 Organise remote rallies and events\n",
"57 T0058 Legacy web content\n",
"58 T0059 Play the long game\n",
"59 T0060 Continue to amplify\n",
"60 T0061 Sell merchandising\n",
"\n",
"[61 rows x 2 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"amitt.df_techniques[['id', 'name']].rename(columns={'id': 'technique_id'})"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" name | \n",
"
\n",
" \n",
" \n",
" \n",
" | 14 | \n",
" T0015 | \n",
" Create hashtag | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name\n",
"14 T0015 Create hashtag"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"amitt.df_techniques[amitt.df_techniques['id'] == 'T0015'][['id', 'name']]"
]
},
{
"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
}