{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction\n", "\n", "Recently, I came across the nice little library `xmldataset` that allows you to flatten multi-level XML data so that you can process it easily with Pandas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "pip install xmldataset\n", "```" ] }, { "cell_type": "code", "execution_count": 37, "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", "
class_namecoveredmethod_namemissedtype
0org/springframework/samples/petclinic/Petclini...3<init>0INSTRUCTION
1org/springframework/samples/petclinic/Petclini...1<init>0LINE
2org/springframework/samples/petclinic/Petclini...1<init>0COMPLEXITY
3org/springframework/samples/petclinic/Petclini...1<init>0METHOD
4org/springframework/samples/petclinic/Petclini...7onStartup0INSTRUCTION
\n", "
" ], "text/plain": [ " class_name covered method_name \\\n", "0 org/springframework/samples/petclinic/Petclini... 3 \n", "1 org/springframework/samples/petclinic/Petclini... 1 \n", "2 org/springframework/samples/petclinic/Petclini... 1 \n", "3 org/springframework/samples/petclinic/Petclini... 1 \n", "4 org/springframework/samples/petclinic/Petclini... 7 onStartup \n", "\n", " missed type \n", "0 0 INSTRUCTION \n", "1 0 LINE \n", "2 0 COMPLEXITY \n", "3 0 METHOD \n", "4 0 INSTRUCTION " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import xmldataset\n", "import pandas as pd\n", "xml = \"\"\n", "\n", "with open (\"datasets/jacocoTestReport.xml\") as f:\n", " xml = f.read()\n", "\n", "\n", "profile=\"\"\"\n", "report\n", " package\n", " class\n", " name = external_dataset:info,prefix:class_\n", " method\n", " name = external_dataset:info,prefix:method_\n", " counter\n", " type = dataset:measures\n", " missed = dataset:measures\n", " covered = dataset:measures\n", " __EXTERNAL_VALUE__ = info:class_name:measures info:method_name:measures\n", " \n", "\"\"\"\n", "\n", "\n", "output = xmldataset.parse_using_profile(xml,profile)\n", "coverage_data = pd.DataFrame.from_records(output['measures'])\n", "coverage_data.head()" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": true }, "outputs": [], "source": [ "coverage_data['covered'] = pd.to_numeric(coverage_data['covered'])" ] }, { "cell_type": "code", "execution_count": 56, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
covered
typeBRANCHCOMPLEXITYINSTRUCTIONLINEMETHOD
class_namemethod_name
org/springframework/samples/petclinic/PetclinicInitializer<init>NaN1.03.01.01.0
createRootApplicationContextNaN1.027.04.01.0
createServletApplicationContextNaN1.09.03.01.0
getServletFiltersNaN1.029.04.01.0
getServletMappingsNaN1.07.01.01.0
onStartupNaN1.07.03.01.0
registerDandelionServletNaN1.022.05.01.0
registerServletFilterNaN1.020.03.01.0
org/springframework/samples/petclinic/model/BaseEntity<init>NaN1.03.01.01.0
getIdNaN1.03.01.01.0
isNew2.02.07.01.01.0
setIdNaN1.04.02.01.0
org/springframework/samples/petclinic/model/NamedEntity<init>NaN1.03.01.01.0
getNameNaN1.03.01.01.0
setNameNaN1.04.02.01.0
toStringNaN0.00.00.00.0
org/springframework/samples/petclinic/model/Owner<init>NaN1.03.01.01.0
addPetNaN1.09.03.01.0
getAddressNaN1.03.01.01.0
getCityNaN1.03.01.01.0
getPet5.01.016.04.00.5
getPetsNaN1.017.03.01.0
getPetsInternal1.01.06.02.01.0
getTelephoneNaN1.03.01.01.0
setAddressNaN1.04.02.01.0
setCityNaN1.04.02.01.0
setPetsInternalNaN0.00.00.00.0
setTelephoneNaN1.04.02.01.0
toStringNaN0.00.00.00.0
org/springframework/samples/petclinic/model/Person<init>NaN1.03.01.01.0
.....................
org/springframework/samples/petclinic/web/OwnerControllerinitUpdateOwnerFormNaN1.011.03.01.0
processCreationForm0.00.00.00.00.0
processFindForm3.01.023.06.01.0
processUpdateOwnerForm1.01.013.04.01.0
setAllowedFieldsNaN1.09.02.01.0
showOwnerNaN1.014.03.01.0
org/springframework/samples/petclinic/web/PetController<init>NaN1.06.03.01.0
findOwnerNaN1.05.01.01.0
initCreationFormNaN1.014.04.01.0
initOwnerBinderNaN1.09.02.01.0
initPetBinderNaN1.06.02.01.0
initUpdateFormNaN0.00.00.00.0
populatePetTypesNaN1.04.01.01.0
processCreationForm4.01.025.05.01.0
processUpdateForm0.00.00.00.00.0
org/springframework/samples/petclinic/web/PetTypeFormatter<init>NaN1.06.03.01.0
parse3.02.022.05.01.0
printNaN1.03.01.01.0
org/springframework/samples/petclinic/web/PetValidator<init>NaN1.03.01.01.0
supportsNaN1.04.01.01.0
validate4.01.019.06.01.0
org/springframework/samples/petclinic/web/VetController<init>NaN1.06.03.01.0
showResourcesVetListNaN0.00.00.00.0
showVetListNaN0.00.00.00.0
org/springframework/samples/petclinic/web/VisitController<init>NaN1.06.03.01.0
initNewVisitFormNaN1.02.01.01.0
loadPetWithVisitNaN1.014.04.01.0
processNewVisitForm1.01.09.03.01.0
setAllowedFieldsNaN1.09.02.01.0
showVisitsNaN0.00.00.00.0
\n", "

162 rows × 5 columns

\n", "
" ], "text/plain": [ " covered \\\n", "type BRANCH \n", "class_name method_name \n", "org/springframework/samples/petclinic/Petclinic... NaN \n", " createRootApplicationContext NaN \n", " createServletApplicationContext NaN \n", " getServletFilters NaN \n", " getServletMappings NaN \n", " onStartup NaN \n", " registerDandelionServlet NaN \n", " registerServletFilter NaN \n", "org/springframework/samples/petclinic/model/Bas... NaN \n", " getId NaN \n", " isNew 2.0 \n", " setId NaN \n", "org/springframework/samples/petclinic/model/Nam... NaN \n", " getName NaN \n", " setName NaN \n", " toString NaN \n", "org/springframework/samples/petclinic/model/Owner NaN \n", " addPet NaN \n", " getAddress NaN \n", " getCity NaN \n", " getPet 5.0 \n", " getPets NaN \n", " getPetsInternal 1.0 \n", " getTelephone NaN \n", " setAddress NaN \n", " setCity NaN \n", " setPetsInternal NaN \n", " setTelephone NaN \n", " toString NaN \n", "org/springframework/samples/petclinic/model/Person NaN \n", "... ... \n", "org/springframework/samples/petclinic/web/Owner... initUpdateOwnerForm NaN \n", " processCreationForm 0.0 \n", " processFindForm 3.0 \n", " processUpdateOwnerForm 1.0 \n", " setAllowedFields NaN \n", " showOwner NaN \n", "org/springframework/samples/petclinic/web/PetCo... NaN \n", " findOwner NaN \n", " initCreationForm NaN \n", " initOwnerBinder NaN \n", " initPetBinder NaN \n", " initUpdateForm NaN \n", " populatePetTypes NaN \n", " processCreationForm 4.0 \n", " processUpdateForm 0.0 \n", "org/springframework/samples/petclinic/web/PetTy... NaN \n", " parse 3.0 \n", " print NaN \n", "org/springframework/samples/petclinic/web/PetVa... NaN \n", " supports NaN \n", " validate 4.0 \n", "org/springframework/samples/petclinic/web/VetCo... NaN \n", " showResourcesVetList NaN \n", " showVetList NaN \n", "org/springframework/samples/petclinic/web/Visit... NaN \n", " initNewVisitForm NaN \n", " loadPetWithVisit NaN \n", " processNewVisitForm 1.0 \n", " setAllowedFields NaN \n", " showVisits NaN \n", "\n", " \\\n", "type COMPLEXITY \n", "class_name method_name \n", "org/springframework/samples/petclinic/Petclinic... 1.0 \n", " createRootApplicationContext 1.0 \n", " createServletApplicationContext 1.0 \n", " getServletFilters 1.0 \n", " getServletMappings 1.0 \n", " onStartup 1.0 \n", " registerDandelionServlet 1.0 \n", " registerServletFilter 1.0 \n", "org/springframework/samples/petclinic/model/Bas... 1.0 \n", " getId 1.0 \n", " isNew 2.0 \n", " setId 1.0 \n", "org/springframework/samples/petclinic/model/Nam... 1.0 \n", " getName 1.0 \n", " setName 1.0 \n", " toString 0.0 \n", "org/springframework/samples/petclinic/model/Owner 1.0 \n", " addPet 1.0 \n", " getAddress 1.0 \n", " getCity 1.0 \n", " getPet 1.0 \n", " getPets 1.0 \n", " getPetsInternal 1.0 \n", " getTelephone 1.0 \n", " setAddress 1.0 \n", " setCity 1.0 \n", " setPetsInternal 0.0 \n", " setTelephone 1.0 \n", " toString 0.0 \n", "org/springframework/samples/petclinic/model/Person 1.0 \n", "... ... \n", "org/springframework/samples/petclinic/web/Owner... initUpdateOwnerForm 1.0 \n", " processCreationForm 0.0 \n", " processFindForm 1.0 \n", " processUpdateOwnerForm 1.0 \n", " setAllowedFields 1.0 \n", " showOwner 1.0 \n", "org/springframework/samples/petclinic/web/PetCo... 1.0 \n", " findOwner 1.0 \n", " initCreationForm 1.0 \n", " initOwnerBinder 1.0 \n", " initPetBinder 1.0 \n", " initUpdateForm 0.0 \n", " populatePetTypes 1.0 \n", " processCreationForm 1.0 \n", " processUpdateForm 0.0 \n", "org/springframework/samples/petclinic/web/PetTy... 1.0 \n", " parse 2.0 \n", " print 1.0 \n", "org/springframework/samples/petclinic/web/PetVa... 1.0 \n", " supports 1.0 \n", " validate 1.0 \n", "org/springframework/samples/petclinic/web/VetCo... 1.0 \n", " showResourcesVetList 0.0 \n", " showVetList 0.0 \n", "org/springframework/samples/petclinic/web/Visit... 1.0 \n", " initNewVisitForm 1.0 \n", " loadPetWithVisit 1.0 \n", " processNewVisitForm 1.0 \n", " setAllowedFields 1.0 \n", " showVisits 0.0 \n", "\n", " \\\n", "type INSTRUCTION \n", "class_name method_name \n", "org/springframework/samples/petclinic/Petclinic... 3.0 \n", " createRootApplicationContext 27.0 \n", " createServletApplicationContext 9.0 \n", " getServletFilters 29.0 \n", " getServletMappings 7.0 \n", " onStartup 7.0 \n", " registerDandelionServlet 22.0 \n", " registerServletFilter 20.0 \n", "org/springframework/samples/petclinic/model/Bas... 3.0 \n", " getId 3.0 \n", " isNew 7.0 \n", " setId 4.0 \n", "org/springframework/samples/petclinic/model/Nam... 3.0 \n", " getName 3.0 \n", " setName 4.0 \n", " toString 0.0 \n", "org/springframework/samples/petclinic/model/Owner 3.0 \n", " addPet 9.0 \n", " getAddress 3.0 \n", " getCity 3.0 \n", " getPet 16.0 \n", " getPets 17.0 \n", " getPetsInternal 6.0 \n", " getTelephone 3.0 \n", " setAddress 4.0 \n", " setCity 4.0 \n", " setPetsInternal 0.0 \n", " setTelephone 4.0 \n", " toString 0.0 \n", "org/springframework/samples/petclinic/model/Person 3.0 \n", "... ... \n", "org/springframework/samples/petclinic/web/Owner... initUpdateOwnerForm 11.0 \n", " processCreationForm 0.0 \n", " processFindForm 23.0 \n", " processUpdateOwnerForm 13.0 \n", " setAllowedFields 9.0 \n", " showOwner 14.0 \n", "org/springframework/samples/petclinic/web/PetCo... 6.0 \n", " findOwner 5.0 \n", " initCreationForm 14.0 \n", " initOwnerBinder 9.0 \n", " initPetBinder 6.0 \n", " initUpdateForm 0.0 \n", " populatePetTypes 4.0 \n", " processCreationForm 25.0 \n", " processUpdateForm 0.0 \n", "org/springframework/samples/petclinic/web/PetTy... 6.0 \n", " parse 22.0 \n", " print 3.0 \n", "org/springframework/samples/petclinic/web/PetVa... 3.0 \n", " supports 4.0 \n", " validate 19.0 \n", "org/springframework/samples/petclinic/web/VetCo... 6.0 \n", " showResourcesVetList 0.0 \n", " showVetList 0.0 \n", "org/springframework/samples/petclinic/web/Visit... 6.0 \n", " initNewVisitForm 2.0 \n", " loadPetWithVisit 14.0 \n", " processNewVisitForm 9.0 \n", " setAllowedFields 9.0 \n", " showVisits 0.0 \n", "\n", " \\\n", "type LINE \n", "class_name method_name \n", "org/springframework/samples/petclinic/Petclinic... 1.0 \n", " createRootApplicationContext 4.0 \n", " createServletApplicationContext 3.0 \n", " getServletFilters 4.0 \n", " getServletMappings 1.0 \n", " onStartup 3.0 \n", " registerDandelionServlet 5.0 \n", " registerServletFilter 3.0 \n", "org/springframework/samples/petclinic/model/Bas... 1.0 \n", " getId 1.0 \n", " isNew 1.0 \n", " setId 2.0 \n", "org/springframework/samples/petclinic/model/Nam... 1.0 \n", " getName 1.0 \n", " setName 2.0 \n", " toString 0.0 \n", "org/springframework/samples/petclinic/model/Owner 1.0 \n", " addPet 3.0 \n", " getAddress 1.0 \n", " getCity 1.0 \n", " getPet 4.0 \n", " getPets 3.0 \n", " getPetsInternal 2.0 \n", " getTelephone 1.0 \n", " setAddress 2.0 \n", " setCity 2.0 \n", " setPetsInternal 0.0 \n", " setTelephone 2.0 \n", " toString 0.0 \n", "org/springframework/samples/petclinic/model/Person 1.0 \n", "... ... \n", "org/springframework/samples/petclinic/web/Owner... initUpdateOwnerForm 3.0 \n", " processCreationForm 0.0 \n", " processFindForm 6.0 \n", " processUpdateOwnerForm 4.0 \n", " setAllowedFields 2.0 \n", " showOwner 3.0 \n", "org/springframework/samples/petclinic/web/PetCo... 3.0 \n", " findOwner 1.0 \n", " initCreationForm 4.0 \n", " initOwnerBinder 2.0 \n", " initPetBinder 2.0 \n", " initUpdateForm 0.0 \n", " populatePetTypes 1.0 \n", " processCreationForm 5.0 \n", " processUpdateForm 0.0 \n", "org/springframework/samples/petclinic/web/PetTy... 3.0 \n", " parse 5.0 \n", " print 1.0 \n", "org/springframework/samples/petclinic/web/PetVa... 1.0 \n", " supports 1.0 \n", " validate 6.0 \n", "org/springframework/samples/petclinic/web/VetCo... 3.0 \n", " showResourcesVetList 0.0 \n", " showVetList 0.0 \n", "org/springframework/samples/petclinic/web/Visit... 3.0 \n", " initNewVisitForm 1.0 \n", " loadPetWithVisit 4.0 \n", " processNewVisitForm 3.0 \n", " setAllowedFields 2.0 \n", " showVisits 0.0 \n", "\n", " \n", "type METHOD \n", "class_name method_name \n", "org/springframework/samples/petclinic/Petclinic... 1.0 \n", " createRootApplicationContext 1.0 \n", " createServletApplicationContext 1.0 \n", " getServletFilters 1.0 \n", " getServletMappings 1.0 \n", " onStartup 1.0 \n", " registerDandelionServlet 1.0 \n", " registerServletFilter 1.0 \n", "org/springframework/samples/petclinic/model/Bas... 1.0 \n", " getId 1.0 \n", " isNew 1.0 \n", " setId 1.0 \n", "org/springframework/samples/petclinic/model/Nam... 1.0 \n", " getName 1.0 \n", " setName 1.0 \n", " toString 0.0 \n", "org/springframework/samples/petclinic/model/Owner 1.0 \n", " addPet 1.0 \n", " getAddress 1.0 \n", " getCity 1.0 \n", " getPet 0.5 \n", " getPets 1.0 \n", " getPetsInternal 1.0 \n", " getTelephone 1.0 \n", " setAddress 1.0 \n", " setCity 1.0 \n", " setPetsInternal 0.0 \n", " setTelephone 1.0 \n", " toString 0.0 \n", "org/springframework/samples/petclinic/model/Person 1.0 \n", "... ... \n", "org/springframework/samples/petclinic/web/Owner... initUpdateOwnerForm 1.0 \n", " processCreationForm 0.0 \n", " processFindForm 1.0 \n", " processUpdateOwnerForm 1.0 \n", " setAllowedFields 1.0 \n", " showOwner 1.0 \n", "org/springframework/samples/petclinic/web/PetCo... 1.0 \n", " findOwner 1.0 \n", " initCreationForm 1.0 \n", " initOwnerBinder 1.0 \n", " initPetBinder 1.0 \n", " initUpdateForm 0.0 \n", " populatePetTypes 1.0 \n", " processCreationForm 1.0 \n", " processUpdateForm 0.0 \n", "org/springframework/samples/petclinic/web/PetTy... 1.0 \n", " parse 1.0 \n", " print 1.0 \n", "org/springframework/samples/petclinic/web/PetVa... 1.0 \n", " supports 1.0 \n", " validate 1.0 \n", "org/springframework/samples/petclinic/web/VetCo... 1.0 \n", " showResourcesVetList 0.0 \n", " showVetList 0.0 \n", "org/springframework/samples/petclinic/web/Visit... 1.0 \n", " initNewVisitForm 1.0 \n", " loadPetWithVisit 1.0 \n", " processNewVisitForm 1.0 \n", " setAllowedFields 1.0 \n", " showVisits 0.0 \n", "\n", "[162 rows x 5 columns]" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coverage_data.pivot_table(\n", " index=[\"class_name\", \"method_name\"],\n", " columns=['type'],\n", " values=[\"covered\", \"missed\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Limitations\n", "Unfortunately, there is currently an important feature missing. Apparently, you " ] } ], "metadata": { "hide_input": false, "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.6.2" } }, "nbformat": 4, "nbformat_minor": 2 }