classLocalData:# pragma: no cover"""Pandas interface to OMOP data stored as local parquet files/folders. Parameters ---------- folder: str absolute path to a folder containing several parquet files with omop data Examples -------- >>> data = LocalData(folder="/export/home/USER/my_data/") >>> person = data.person >>> person.shape (100, 10) Attributes ---------- person: pd.DataFrame Pandas dataframe `person`. All dataframe attributes are dynamically generated to match the content of the selected folder. """def__init__(self,folder:str,):(self.parquet_tables,self.pickle_tables,self.available_tables,self.tables_paths,)=self.list_available_tables(folder)@staticmethoddeflist_available_tables(folder:str)->Tuple[List[str],List[str]]:available_tables=[]pickle_tables=[]parquet_tables=[]tables_paths={}forfilenameinos.listdir(folder):file=Path(folder)/filenametable_name=file.stemextension=file.suffixifextension==".parquet":abspath=Path.resolve(file)tables_paths[table_name]=abspathparquet_tables.append(table_name)available_tables.append(table_name)elifextension==".pkl"orextension==".pickle":abspath=Path.resolve(file)tables_paths[table_name]=abspathpickle_tables.append(table_name)available_tables.append(table_name)returnparquet_tables,pickle_tables,available_tables,tables_pathsdef_read_table(self,table_name:str)->pd.DataFrame:path=self.tables_paths[table_name]iftable_nameinself.parquet_tables:returnpd.read_parquet(path)returnpd.read_pickle(path)def__getattr__(self,table_name:str)->pd.DataFrame:iftable_nameinself.available_tables:returnself._read_table(table_name)raiseAttributeError(f"Table '{table_name}' is not available in chosen folder.")def__dir__(self)->List[str]:returnlist(super().__dir__())+list(self.available_tables)