code: def select(self, *properties, **aliased_properties):
          
          if not (properties or aliased_properties):
              return self
          merged_properties = dict(zip(properties, properties))
          merged_properties.update(aliased_properties)
  
          for prop_name in (merged_properties.keys()):
              if prop_name in self.selection:
                  raise Exception('The property {} has already been selected'.format(prop_name))
  
          new_selection = self.selection.copy()
          new_selection.update(merged_properties)
  
          return self._copy(selection=new_selection)
docs: Specify which properties of the dataset must be returned
  
          Property extraction is based on `JMESPath <http://jmespath.org>`_ expressions.
          This method returns a new Dataset narrowed down by the given selection.
  
          :param properties: JMESPath to use for the property extraction.
                             The JMESPath string will be used as a key in the output dictionary.
          :param aliased_properties: Same as properties, but the output dictionary will contain
                                     the parameter name instead of the JMESPath string.