Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
#!/usr/bin/env python3 # system modules
# external modules
# internal modules
""" Base class for Netatmo api response datasets """
""" Class constructor Args: request (instance of ApiRequest or derivate): the api request response (dict): The raw api response """
################## ### Properties ### ################## def logger(self): # pragma: no cover """ the logging.Logger used for logging. Defaults to logging.getLogger(__name__). """ try: # try to return the internal property return self._logger except AttributeError: # didn't work return logging.getLogger(__name__) # return default logger
def logger(self, logger): # pragma: no cover assert isinstance(logger, logging.Logger), \ "logger property has to be a logging.Logger" self._logger = logger
def response(self): """ The raw api response dict. """ except AttributeError: # pragma: no cover self._response = {} return self._response # return internal attribute
def response(self, newresponse): "reponse property has to be of class dict"
def request(self): """ The raw api request dict. """
def request(self, newrequest):
def __repr__(self): # pragma: no cover """ python representation of this object """ # self.logger.debug("__repr__ called") reprstring = ("{classname}(\n" "response = {response},\n" "request = {request},\n" ")").format( classname="{module}.{name}".format( name=self.__class__.__name__, module=self.__class__.__module__), # compact version response=self.response.__repr__(), # pretty version # response = json.dumps(self.response,sort_keys=True,indent=4) # the request request=self.request.__repr__() ) return reprstring
""" Class that holds the responded data of a Oauth2 token request """
""" Class that holds the responded data of a Getstationdata request """
""" Convert the response to a pandas.DataFrame
Args: only_inside (bool, optional): Drop stations outside the requested region? Defaults to ``False``.
Returns: pandas.DataFrame: The response converted to a DataFrame """ # get the list of stations if not isinstance(stations, list): # pragma: no cover raise ApiResponseError("'body' part of response does not " "exist or is no list.")
# start with basic dict "id": [], "altitude": [], "longitude": [], "latitude": [], "timezone": [], } # loop over all stations
### gather general information ### # add id to dict
### gather positional information ### # add position to dict
### gather measurement information ### # loop over all measurements # self.logger.warning("module '{}' has not exactly one time! " # "Leaving it out.".format(module_id)) # self.logger.debug("measdict after update: {}".format(measdict))
# add measurements to stationdict
# fill the remaining values val.append(np.nan)
# create DataFrame # convert times to datetime
# drop outliers if desired # TODO: What happens in other regions? Is outside still correct? df["latitude"] > lat_ne, np.logical_or( df["latitude"] < lat_sw, np.logical_or( df["longitude"] > lon_ne, df["longitude"] < lon_sw))) # drop outliers
# set index to device id self.logger.warning("Duplicate device IDs in the response!") # return the resulting DataFrame
""" Class that holds responded data of a subdivided Getpublicdata request """
""" Convert the multiple subdivided Getpublicdata responses to a single dataframe
Returns: pandas.Dataframe: the merged dataframe """ try: count_stations = 0 responses = self.response.get("parts") for response in responses: df_cur = response.dataframe(only_inside=only_inside) count_stations += df_cur.shape[0] try: # join datasets df = pd.concat([df, df_cur], axis=0, join="outer") # df = df.combine_first(df_cur) # drop duplicates except NameError: # first one df = df_cur # drop duplicates df.drop_duplicates(subset="id", inplace=True) return df # return except TypeError: # not iterable e.g. raise ApiResponseError( "subdivided Getpublicdata response contains bogus")
""" Class that holds the responded data of a Getmeasure request """
""" Convert the response to a pandas.DataFrame
Returns: pandas.DataFrame: The response converted to a DataFrame """ if isinstance(body, list): # optimized # pragma: no cover if body: # only if there really is something raise NotImplementedError("converting 'optimized' Getmeasure " "response is not yet implemented") else: body = {} # fake to empty dict "type").split(",") # the types except AttributeError: # pragma: no cover raise InvalidApiInputError( "There is no sensible 'type' " "section in the request's payload. Strange...")
# start with empty measurement dict # loop over all time-measurement pairs if not len(types) == len(measurements): # pragma: no cover raise ApiResponseError( "number of requested types does not " "match number of responded types") # add measurements to measdict
else: # bullshit # pragma: no cover raise ApiResponseError("'body' part of response does not " "exist or is neither list not dict.")
# create DataFrame # convert times to datetime # sort the data frame by time # index # return the resulting DataFrame
""" Class holding responded data of multiple Getmeasure requests """ try: responses = self.response.get("parts") for response in responses: df_cur = response.dataframe() try: # join datasets df = pd.concat([df, df_cur], axis=0, join="outer") except NameError: # first one df = df_cur # drop duplicates df.drop_duplicates(inplace=True) # sort df.sort_index(inplace=True) return df # return except TypeError: # not iterable e.g. raise ApiResponseError( "subdivided Getmeasure response contains bogus")
""" Class that holds the responded data of a Getstationsdata request """
""" Convert the response to a pandas.DataFrame
Returns: pandas.DataFrame: The response converted to a DataFrame """ if not isinstance(body, dict): # optimized # pragma: no cover raise ApiResponseError("api response body is no dict. Strange...") if not isinstance(devices, list): # no list # pragma: no cover raise ApiResponseError("api response devices part is no list. " "Strange...") if len(devices) > 1: # pragma: no cover raise ApiResponseError("api response devices list is longer than " "one. Strange...") except KeyError: # pragma: no cover raise ApiResponseError("api response devices list entry has no " "dashboard_data")
# get proper data if isinstance( val, dict) or isinstance( val, list): # pragma: no cover raise ApiResponseError("dashboard_data values are not scalars")
# convert to data frame
# reset index
|