code: def sd2df(self, table: str, libref: str = '', dsopts: dict = None, method: str = 'MEMORY',
                **kwargs) -> 'pd.DataFrame':
          
          dsopts = dsopts if dsopts is not None else {}
          return self.sasdata2dataframe(table, libref, dsopts, method, **kwargs)
docs: This is an alias for 'sasdata2dataframe'. Why type all that?
          SASdata object that refers to the Sas Data Set you want to export to a Pandas Data Frame
  
          :param table: the name of the SAS Data Set you want to export to a Pandas Data Frame
          :param libref: the libref for the SAS Data Set.
          :param dsopts: a dictionary containing any of the following SAS data set options(where, drop, keep, obs, firstobs):
  
              - where is a string
              - keep are strings or list of strings.
              - drop are strings or list of strings.
              - obs is a numbers - either string or int
              - first obs is a numbers - either string or int
              - format is a string or dictionary { var: format }
  
              .. code-block:: python
  
                               {'where'    : 'msrp < 20000 and make = "Ford"'
                                'keep'     : 'msrp enginesize Cylinders Horsepower Weight'
                                'drop'     : ['msrp', 'enginesize', 'Cylinders', 'Horsepower', 'Weight']
                                'obs'      :  10
                                'firstobs' : '12'
                                'format'  : {'money': 'dollar10', 'time': 'tod5.'}
                               }
          :param method: defaults to MEMORY; the original method. CSV is the other choice which uses an intermediary csv file; faster for large data
          :param kwargs: dictionary
          :return: Pandas data frame