From a483bf4c805ed1ec3d4b0ddc8d4d718ef820e9a8 Mon Sep 17 00:00:00 2001 From: Sara-Jayne Terp Date: Fri, 1 Jul 2022 13:18:16 +0100 Subject: [PATCH] added code to check for name and summary changes across versions --- ... check_new_table_updates-checkpoint.ipynb} | 403 +++++++++++++++++- ...ke.ipynb => check_new_table_updates.ipynb} | 403 +++++++++++++++++- 2 files changed, 766 insertions(+), 40 deletions(-) rename CODE/.ipynb_checkpoints/{generate_csvs_for_mike-checkpoint.ipynb => check_new_table_updates-checkpoint.ipynb} (84%) rename CODE/{generate_csvs_for_mike.ipynb => check_new_table_updates.ipynb} (84%) diff --git a/CODE/.ipynb_checkpoints/generate_csvs_for_mike-checkpoint.ipynb b/CODE/.ipynb_checkpoints/check_new_table_updates-checkpoint.ipynb similarity index 84% rename from CODE/.ipynb_checkpoints/generate_csvs_for_mike-checkpoint.ipynb rename to CODE/.ipynb_checkpoints/check_new_table_updates-checkpoint.ipynb index 27ad5e1..10fbac0 100644 --- a/CODE/.ipynb_checkpoints/generate_csvs_for_mike-checkpoint.ipynb +++ b/CODE/.ipynb_checkpoints/check_new_table_updates-checkpoint.ipynb @@ -1198,30 +1198,35 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 25, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "dict_keys(['ADMIN_README', 'ADMIN CODES', 'phases', 'tactics', 'techniques', 'countermeasures', 'frameworks', 'tasks', 'detections', 'playbooks', 'responsetypes', 'metatechniques', 'actortypes', 'actortype_framework', 'actortype_sector', 'sectors', 'resources', 'MOE', 'MOP'])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Current keys: dict_keys(['FRAMEWORK_ADMIN_README', 'FRAMEWORK_ADMIN CODES', 'phases', 'tactics', 'techniques', 'subtechniques', 'frameworks', 'tasks', 'detections', 'countermeasures', 'playbooks', 'responsetypes', 'metatechniques', 'actortypes', 'sectors', 'resources', 'MOE', 'MOP'])\n", + "Old keys: dict_keys(['ADMIN_README', 'ADMIN CODES', 'phases', 'tactics', 'techniques', 'countermeasures', 'frameworks', 'tasks', 'detections', 'playbooks', 'responsetypes', 'metatechniques', 'actortypes', 'actortype_framework', 'actortype_sector', 'sectors', 'resources', 'MOE', 'MOP'])\n" + ] } ], "source": [ "MASTERDATA_DIR = '../DISARM_MASTER_DATA/'\n", "frameworkfile = MASTERDATA_DIR + 'DISARM_FRAMEWORKS_MASTER.xlsx'\n", - " \n", - "metadata = {}\n", - "xlsx = pd.ExcelFile(frameworkfile)\n", - "for sheetname in xlsx.sheet_names:\n", - " metadata[sheetname] = xlsx.parse(sheetname)\n", - " metadata[sheetname].fillna('', inplace=True)\n", - "metadata.keys()" + "oldframefile = MASTERDATA_DIR + '2022-06-30_DISARM_0_1/DISARM_FRAMEWORKS_MASTER_0_1.xlsx'\n", + "\n", + "def create_excel_metadata(frameworkfile):\n", + " metadata = {}\n", + " xlsx = pd.ExcelFile(frameworkfile)\n", + " for sheetname in xlsx.sheet_names:\n", + " metadata[sheetname] = xlsx.parse(sheetname)\n", + " metadata[sheetname].fillna('', inplace=True)\n", + " return metadata\n", + "\n", + "metadata = create_excel_metadata(frameworkfile)\n", + "oldmeta = create_excel_metadata(oldframefile)\n", + "print('Current keys: {}'.format(metadata.keys()))\n", + "print('Old keys: {}'.format(oldmeta.keys()))" ] }, { @@ -1963,11 +1968,369 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "# Check against last version of framework" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "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", + "
disarm_idname_changedsummary_changedname_xname_ysummary_xsummary_y
3P04FalseTrueAssessAssessEvaluate effectiveness of action, for use in f...Evaluate effectiveness of action, for use in f...
\n", + "
" + ], + "text/plain": [ + " disarm_id name_changed summary_changed name_x name_y \\\n", + "3 P04 False True Assess Assess \n", + "\n", + " summary_x \\\n", + "3 Evaluate effectiveness of action, for use in f... \n", + "\n", + " summary_y \n", + "3 Evaluate effectiveness of action, for use in f... " + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def check_version_descriptions(df1, df2):\n", + " merge = df1.merge(df2, on='disarm_id')\n", + " merge['name_changed'] = merge['name_x'] != merge['name_y']\n", + " merge['summary_changed'] = merge['summary_x'] != merge['summary_y']\n", + " return merge[(merge['name_changed']) | (merge['summary_changed'])][['disarm_id', 'name_changed', 'summary_changed', 'name_x', \n", + " 'name_y', 'summary_x', 'summary_y']]\n", + "\n", + "check_version_descriptions(metadata['phases'], oldmeta['phases'])" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "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", + "
disarm_idname_changedsummary_changedname_xname_ysummary_xsummary_y
0TA01TrueFalsePlan StrategyStrategic PlanningDefine the desired end state, i.e. the set of ...Define the desired end state, i.e. the set of ...
1TA02TrueTruePlan ObjectivesObjective PlanningSet clearly defined, measurable, and achievabl...Set clearly defined, measurable, and achievabl...
2TA05TrueFalseMicrotargetMicrotargetingTarget very specific populations of peopleTarget very specific populations of people
3TA06FalseTrueDevelop ContentDevelop ContentCreate and acquire content used in incident
4TA07TrueTrueSelect Channels and AffordancesChannel SelectionSelecting platforms and affordances assesses w...Set up specific delivery, amplification and ma...
5TA08TrueTrueConduct Pump PrimingPump PrimingRelease content on a targetted small scale, pr...Release content on a targetted small scale, pr...
6TA09TrueTrueDeliver ContentExposureRelease content to general public or larger po...Release content to general public or push to l...
7TA10FalseTrueDrive Offline ActivityDrive Offline ActivityMove incident/campaign from online to offline....Move incident into offline world
8TA11TrueTruePersist in the Information EnvironmentPersistencePersist in the Information Space refers to tak...Keep incident 'alive', beyond the incident cre...
9TA12TrueTrueAssess EffectivenessMeasure EffectivenessAssess effectiveness of action, for use in fut...Measure effectiveness of incident, for use in ...
10TA13TrueTrueTarget Audience AnalysisConduct Center of Gravity AnalysisIdentifying and analyzing the target audience ...Recon/research to identify \"the source of powe...
\n", + "
" + ], + "text/plain": [ + " disarm_id name_changed summary_changed \\\n", + "0 TA01 True False \n", + "1 TA02 True True \n", + "2 TA05 True False \n", + "3 TA06 False True \n", + "4 TA07 True True \n", + "5 TA08 True True \n", + "6 TA09 True True \n", + "7 TA10 False True \n", + "8 TA11 True True \n", + "9 TA12 True True \n", + "10 TA13 True True \n", + "\n", + " name_x \\\n", + "0 Plan Strategy \n", + "1 Plan Objectives \n", + "2 Microtarget \n", + "3 Develop Content \n", + "4 Select Channels and Affordances \n", + "5 Conduct Pump Priming \n", + "6 Deliver Content \n", + "7 Drive Offline Activity \n", + "8 Persist in the Information Environment \n", + "9 Assess Effectiveness \n", + "10 Target Audience Analysis \n", + "\n", + " name_y \\\n", + "0 Strategic Planning \n", + "1 Objective Planning \n", + "2 Microtargeting \n", + "3 Develop Content \n", + "4 Channel Selection \n", + "5 Pump Priming \n", + "6 Exposure \n", + "7 Drive Offline Activity \n", + "8 Persistence \n", + "9 Measure Effectiveness \n", + "10 Conduct Center of Gravity Analysis \n", + "\n", + " summary_x \\\n", + "0 Define the desired end state, i.e. the set of ... \n", + "1 Set clearly defined, measurable, and achievabl... \n", + "2 Target very specific populations of people \n", + "3 \n", + "4 Selecting platforms and affordances assesses w... \n", + "5 Release content on a targetted small scale, pr... \n", + "6 Release content to general public or larger po... \n", + "7 Move incident/campaign from online to offline.... \n", + "8 Persist in the Information Space refers to tak... \n", + "9 Assess effectiveness of action, for use in fut... \n", + "10 Identifying and analyzing the target audience ... \n", + "\n", + " summary_y \n", + "0 Define the desired end state, i.e. the set of ... \n", + "1 Set clearly defined, measurable, and achievabl... \n", + "2 Target very specific populations of people \n", + "3 Create and acquire content used in incident \n", + "4 Set up specific delivery, amplification and ma... \n", + "5 Release content on a targetted small scale, pr... \n", + "6 Release content to general public or push to l... \n", + "7 Move incident into offline world \n", + "8 Keep incident 'alive', beyond the incident cre... \n", + "9 Measure effectiveness of incident, for use in ... \n", + "10 Recon/research to identify \"the source of powe... " + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "check_version_descriptions(metadata['tactics'], oldmeta['tactics'])" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
disarm_idname_changedsummary_changedname_xname_ysummary_xsummary_y
\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [disarm_id, name_changed, summary_changed, name_x, name_y, summary_x, summary_y]\n", + "Index: []" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "check_version_descriptions(metadata['techniques'], oldmeta['techniques'])" + ] }, { "cell_type": "code", diff --git a/CODE/generate_csvs_for_mike.ipynb b/CODE/check_new_table_updates.ipynb similarity index 84% rename from CODE/generate_csvs_for_mike.ipynb rename to CODE/check_new_table_updates.ipynb index 27ad5e1..10fbac0 100644 --- a/CODE/generate_csvs_for_mike.ipynb +++ b/CODE/check_new_table_updates.ipynb @@ -1198,30 +1198,35 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 25, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "dict_keys(['ADMIN_README', 'ADMIN CODES', 'phases', 'tactics', 'techniques', 'countermeasures', 'frameworks', 'tasks', 'detections', 'playbooks', 'responsetypes', 'metatechniques', 'actortypes', 'actortype_framework', 'actortype_sector', 'sectors', 'resources', 'MOE', 'MOP'])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Current keys: dict_keys(['FRAMEWORK_ADMIN_README', 'FRAMEWORK_ADMIN CODES', 'phases', 'tactics', 'techniques', 'subtechniques', 'frameworks', 'tasks', 'detections', 'countermeasures', 'playbooks', 'responsetypes', 'metatechniques', 'actortypes', 'sectors', 'resources', 'MOE', 'MOP'])\n", + "Old keys: dict_keys(['ADMIN_README', 'ADMIN CODES', 'phases', 'tactics', 'techniques', 'countermeasures', 'frameworks', 'tasks', 'detections', 'playbooks', 'responsetypes', 'metatechniques', 'actortypes', 'actortype_framework', 'actortype_sector', 'sectors', 'resources', 'MOE', 'MOP'])\n" + ] } ], "source": [ "MASTERDATA_DIR = '../DISARM_MASTER_DATA/'\n", "frameworkfile = MASTERDATA_DIR + 'DISARM_FRAMEWORKS_MASTER.xlsx'\n", - " \n", - "metadata = {}\n", - "xlsx = pd.ExcelFile(frameworkfile)\n", - "for sheetname in xlsx.sheet_names:\n", - " metadata[sheetname] = xlsx.parse(sheetname)\n", - " metadata[sheetname].fillna('', inplace=True)\n", - "metadata.keys()" + "oldframefile = MASTERDATA_DIR + '2022-06-30_DISARM_0_1/DISARM_FRAMEWORKS_MASTER_0_1.xlsx'\n", + "\n", + "def create_excel_metadata(frameworkfile):\n", + " metadata = {}\n", + " xlsx = pd.ExcelFile(frameworkfile)\n", + " for sheetname in xlsx.sheet_names:\n", + " metadata[sheetname] = xlsx.parse(sheetname)\n", + " metadata[sheetname].fillna('', inplace=True)\n", + " return metadata\n", + "\n", + "metadata = create_excel_metadata(frameworkfile)\n", + "oldmeta = create_excel_metadata(oldframefile)\n", + "print('Current keys: {}'.format(metadata.keys()))\n", + "print('Old keys: {}'.format(oldmeta.keys()))" ] }, { @@ -1963,11 +1968,369 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "# Check against last version of framework" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "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", + "
disarm_idname_changedsummary_changedname_xname_ysummary_xsummary_y
3P04FalseTrueAssessAssessEvaluate effectiveness of action, for use in f...Evaluate effectiveness of action, for use in f...
\n", + "
" + ], + "text/plain": [ + " disarm_id name_changed summary_changed name_x name_y \\\n", + "3 P04 False True Assess Assess \n", + "\n", + " summary_x \\\n", + "3 Evaluate effectiveness of action, for use in f... \n", + "\n", + " summary_y \n", + "3 Evaluate effectiveness of action, for use in f... " + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def check_version_descriptions(df1, df2):\n", + " merge = df1.merge(df2, on='disarm_id')\n", + " merge['name_changed'] = merge['name_x'] != merge['name_y']\n", + " merge['summary_changed'] = merge['summary_x'] != merge['summary_y']\n", + " return merge[(merge['name_changed']) | (merge['summary_changed'])][['disarm_id', 'name_changed', 'summary_changed', 'name_x', \n", + " 'name_y', 'summary_x', 'summary_y']]\n", + "\n", + "check_version_descriptions(metadata['phases'], oldmeta['phases'])" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "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", + "
disarm_idname_changedsummary_changedname_xname_ysummary_xsummary_y
0TA01TrueFalsePlan StrategyStrategic PlanningDefine the desired end state, i.e. the set of ...Define the desired end state, i.e. the set of ...
1TA02TrueTruePlan ObjectivesObjective PlanningSet clearly defined, measurable, and achievabl...Set clearly defined, measurable, and achievabl...
2TA05TrueFalseMicrotargetMicrotargetingTarget very specific populations of peopleTarget very specific populations of people
3TA06FalseTrueDevelop ContentDevelop ContentCreate and acquire content used in incident
4TA07TrueTrueSelect Channels and AffordancesChannel SelectionSelecting platforms and affordances assesses w...Set up specific delivery, amplification and ma...
5TA08TrueTrueConduct Pump PrimingPump PrimingRelease content on a targetted small scale, pr...Release content on a targetted small scale, pr...
6TA09TrueTrueDeliver ContentExposureRelease content to general public or larger po...Release content to general public or push to l...
7TA10FalseTrueDrive Offline ActivityDrive Offline ActivityMove incident/campaign from online to offline....Move incident into offline world
8TA11TrueTruePersist in the Information EnvironmentPersistencePersist in the Information Space refers to tak...Keep incident 'alive', beyond the incident cre...
9TA12TrueTrueAssess EffectivenessMeasure EffectivenessAssess effectiveness of action, for use in fut...Measure effectiveness of incident, for use in ...
10TA13TrueTrueTarget Audience AnalysisConduct Center of Gravity AnalysisIdentifying and analyzing the target audience ...Recon/research to identify \"the source of powe...
\n", + "
" + ], + "text/plain": [ + " disarm_id name_changed summary_changed \\\n", + "0 TA01 True False \n", + "1 TA02 True True \n", + "2 TA05 True False \n", + "3 TA06 False True \n", + "4 TA07 True True \n", + "5 TA08 True True \n", + "6 TA09 True True \n", + "7 TA10 False True \n", + "8 TA11 True True \n", + "9 TA12 True True \n", + "10 TA13 True True \n", + "\n", + " name_x \\\n", + "0 Plan Strategy \n", + "1 Plan Objectives \n", + "2 Microtarget \n", + "3 Develop Content \n", + "4 Select Channels and Affordances \n", + "5 Conduct Pump Priming \n", + "6 Deliver Content \n", + "7 Drive Offline Activity \n", + "8 Persist in the Information Environment \n", + "9 Assess Effectiveness \n", + "10 Target Audience Analysis \n", + "\n", + " name_y \\\n", + "0 Strategic Planning \n", + "1 Objective Planning \n", + "2 Microtargeting \n", + "3 Develop Content \n", + "4 Channel Selection \n", + "5 Pump Priming \n", + "6 Exposure \n", + "7 Drive Offline Activity \n", + "8 Persistence \n", + "9 Measure Effectiveness \n", + "10 Conduct Center of Gravity Analysis \n", + "\n", + " summary_x \\\n", + "0 Define the desired end state, i.e. the set of ... \n", + "1 Set clearly defined, measurable, and achievabl... \n", + "2 Target very specific populations of people \n", + "3 \n", + "4 Selecting platforms and affordances assesses w... \n", + "5 Release content on a targetted small scale, pr... \n", + "6 Release content to general public or larger po... \n", + "7 Move incident/campaign from online to offline.... \n", + "8 Persist in the Information Space refers to tak... \n", + "9 Assess effectiveness of action, for use in fut... \n", + "10 Identifying and analyzing the target audience ... \n", + "\n", + " summary_y \n", + "0 Define the desired end state, i.e. the set of ... \n", + "1 Set clearly defined, measurable, and achievabl... \n", + "2 Target very specific populations of people \n", + "3 Create and acquire content used in incident \n", + "4 Set up specific delivery, amplification and ma... \n", + "5 Release content on a targetted small scale, pr... \n", + "6 Release content to general public or push to l... \n", + "7 Move incident into offline world \n", + "8 Keep incident 'alive', beyond the incident cre... \n", + "9 Measure effectiveness of incident, for use in ... \n", + "10 Recon/research to identify \"the source of powe... " + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "check_version_descriptions(metadata['tactics'], oldmeta['tactics'])" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
disarm_idname_changedsummary_changedname_xname_ysummary_xsummary_y
\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [disarm_id, name_changed, summary_changed, name_x, name_y, summary_x, summary_y]\n", + "Index: []" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "check_version_descriptions(metadata['techniques'], oldmeta['techniques'])" + ] }, { "cell_type": "code",