Setup none-blocking stream handler for sending loggin to the console.
Exported source
def init_console_logging(name=None, level=logging.INFO, timestamp=True):'''Setup none-blocking stream handler for sending loggin to the console.'''# Only if no handlers defined.ifnot logging.getLogger(name).handlers: logger = logging.getLogger() logger.setLevel(level) console = logging.StreamHandler() console.setLevel(level)# set a format which is simpler for console useif timestamp: formatter = logging.Formatter("%(asctime)s%(levelname)s\t%(process)d\t%(name)s\t%(filename)s\t%(lineno)d\t%(message)s", datefmt='%Y-%m-%dT%H:%M:%S%z')else: formatter = logging.Formatter("%(levelname)s\t%(process)d\t%(name)s\t%(filename)s\t%(lineno)d\t%(message)s")#formatter = logging.Formatter("%(asctime)s %(levelname)s\t%(process)d\t%(name)s\t%(filename)s\t%(lineno)d\t%(message)s", datefmt='%Y-%m-%dT%H:%M:%S%z')# tell the handler to use this format console.setFormatter(formatter)# add the handler to the root logger logger.addHandler(console)return loggerelse: logging.getLogger(name).info(f'There already is a logger installed for {name}.')
@lru_cache(128)def snake_case_to_camel_case(snake_case:str) ->str: splittext = snake_case.split('_')return''.join([x.capitalize() if n >0else x for x,n inzip(splittext, range(len(splittext)))])
Converts Pandas dataframes and series, Numpy array’s and recarrays or a dictionary of individual timeseries into a Pandas dataframe with one datetime index. With all arrays dataframes and series it is assumed that the first column contains the timestamps.
*Convert various tabular data formats to timeseries DataFrame
Args: data (Union[pd.DataFrame, pd.Series, dict, np.ndarray, np.recarray]): The input data to be converted. timezone (str, optional): The timezone to set for the index of the DataFrame. Defaults to ‘UTC’. columnnames (Optional[List[str]]): The column names to use for the DataFrame. Defaults to None.
Returns: pd.DataFrame: The converted timeseries DataFrame with the index set to the specified timezone.*
Converts a data dict into a pandas DataFrame based on the specified record format. Parameters: - data: A dictionary containing the data to convert. - timecolumns: A list of column names to be treated as time columns. - recordformat: A string specifying the format of the data records (‘records’, ‘table’, ‘split’, ‘index’, ‘tight’). Returns: - df: A pandas DataFrame with a DatetimeIndex representing the converted data.
Exported source
def timeseries_dataframe_from_datadict( data:dict, timecolumns=None, recordformat='records'):""" Converts a data dict into a pandas DataFrame based on the specified record format. Parameters: - data: A dictionary containing the data to convert. - timecolumns: A list of column names to be treated as time columns. - recordformat: A string specifying the format of the data records ('records', 'table', 'split', 'index', 'tight'). Returns: - df: A pandas DataFrame with a DatetimeIndex representing the converted data. """ orient = recordformat.lower()assert orient in ['records', 'table', 'split', 'index', 'tight']assert timecolumns, 'No time columns specified'if orient =='records':# data is a structured ndarray, sequence of tuples or dicts, or DataFrame df = pd.DataFrame.from_records(data) time_columns_in_df = [C for C in df.columns if C in timecolumns]ifnot time_columns_in_df:#syslog.error(f"No column in records {df.columns} matches specification in time columns {timecolumns}, assuming first column is time") time_column = df.columns[0]else: time_column = time_columns_in_df[0]elif orient =='table':# data is in pandas table format time_column = data['schema']['primaryKey'][0] df = pd.DataFrame.from_dict(data['data']).set_index(data['schema']['primaryKey']) df.index.name ='time'else:# data is formatted according to 'orient' parameter (pandas) df = pd.DataFrame.from_dict(data, orient=orient) # type: ignore time_column = df.index.name df.columns =list(df.columns) df[time_column] = pd.to_datetime(df[time_column],utc=True,format='ISO8601') df.set_index(time_column, inplace=True) df.index = pd.DatetimeIndex(df.index).round('ms') df.index.name ='time'return df