def main():
    from tests_.mock_data import ASPEN_BKP_FILE_PATH

    con_obj = AspenConnection(ASPEN_BKP_FILE_PATH)

    sim_data = con_obj.get_simulation_data()

    # convert uneven dict of arrays into dataframe. Empty values are NaN
    df = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in sim_data.items()]))

    print(df)
class ConnectionWorker(QObject):
    # signals
    connection_open = pyqtSignal()
    input_tree_loaded = pyqtSignal()
    output_tree_loaded = pyqtSignal()
    connection_id_created = pyqtSignal(object)  # emits the server ID

    def __init__(self, app_data: DataStorage, mode: str = 'tree', parent=None):
        super().__init__(parent)
        self.app_data = app_data
        if mode in ['tree', 'open']:
            self.mode = mode
        else:
            raise ValueError("Invalid mode!")

    @pyqtSlot()
    def open_connection(self):
        #ptvsd.debug_this_thread()

        # open the connection
        pythoncom.CoInitialize()
        self.connection = AspenConnection(self.app_data.simulation_file)
        self.connection_open.emit()

        if self.mode == 'open':
            self.create_connection_id()

    @pyqtSlot()
    def load_tree(self):
        self.open_connection()

        # load and store simulation data dictionary
        self.app_data.simulation_data = self.app_data._uneven_array_to_frame(
            self.connection.get_simulation_data())

        # load the trees
        input_tree = self.connection.get_simulation_partial_io_tree('input')
        self.app_data.tree_model_input = input_tree
        self.input_tree_loaded.emit()

        output_tree = self.connection.get_simulation_partial_io_tree('output')
        self.app_data.tree_model_output = output_tree
        self.output_tree_loaded.emit()

        self.create_connection_id()

    @pyqtSlot()
    def create_connection_id(self):
        # create the COM server ID (this enables connection from form thread)
        self.connection_id = pythoncom.CoMarshalInterThreadInterfaceInStream(
            pythoncom.IID_IDispatch, self.connection.get_connection_object())
        self.connection_id_created.emit(self.connection_id)