from PyQt5.QtGui import *
from PyQt5 import QtGui, QtCore, QtWidgets, uic
import sys, os
import pandas as pd
from NiBAx.plugins.loadsave.dataio import DataIO
# import dtale
from NiBAx.core.baseplugin import BasePlugin
from NiBAx.core import iStagingLogger
[docs]logger = iStagingLogger.get_logger(__name__)
[docs]class PandasModel(QtCore.QAbstractTableModel):
def __init__(self, data, parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._data = data
self.header_labels = None
[docs] def rowCount(self, parent=None):
return len(self._data.values)
[docs] def columnCount(self, parent=None):
return self._data.columns.size
[docs] def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
self.header_labels = self._data.keys()
if role == QtCore.Qt.DisplayRole and orientation == QtCore.Qt.Horizontal:
return self.header_labels[section]
return QtCore.QAbstractTableModel.headerData(self, section, orientation, role)
[docs] def data(self, index, role=QtCore.Qt.DisplayRole):
if index.isValid():
if role == QtCore.Qt.DisplayRole:
return QtCore.QVariant(str(
self._data.iloc[index.row()][index.column()]))
return QtCore.QVariant()
[docs]class LoadSave(QtWidgets.QWidget,BasePlugin):
def __init__(self):
super(LoadSave,self).__init__()
self.datamodel = None
root = os.path.dirname(__file__)
self.readAdditionalInformation(root)
self.ui = uic.loadUi(os.path.join(root, 'loadsave.ui'),self)
self.dataView = QtWidgets.QTableView()
self.ui.verticalLayout_2.addWidget(self.dataView)
# WORKAROUND: Deactivate explore button
self.ui.dtale_Btn.setVisible(False)
[docs] def SetupConnections(self):
self.ui.open_data_file_Btn.clicked.connect(lambda: self.OnOpenDataFileBtnClicked())
self.datamodel.data_changed.connect(lambda: self.OnDataChanged())
self.ui.save_data_Btn.clicked.connect(lambda: self.OnSaveDataBtClicked())
self.ui.dtale_Btn.clicked.connect(lambda: self.OnDtaleBtnClicked())
[docs] def OnDtaleBtnClicked(self):
if ('level_0' in self.datamodel.data.keys()):
self.datamodel.data.drop('level_0', axis=1, inplace=True)
d = dtale.show(self.datamodel.data.reset_index(drop=True))
d.open_browser()
[docs] def OnSaveDataBtClicked(self):
filename = QtWidgets.QFileDialog.getSaveFileName(None,
'Save data frame to file',
QtCore.QDir().homePath(),
"Pickle files (*.pkl.gz *.pkl)")
if filename[0] == "":
print("No file was selected")
else:
pd.to_pickle(self.datamodel.data, filename[0])
[docs] def OnOpenDataFileBtnClicked(self):
filename = QtWidgets.QFileDialog.getOpenFileName(None,
caption = 'Open data file',
directory = QtCore.QDir().homePath(),
filter = "Pickle/CSV files (*.pkl.gz *.pkl *.csv)")
if filename[0] == "":
logger.warning("No file was selected")
else:
self.ReadData(filename[0])
[docs] def PopulateTable(self):
model = PandasModel(self.datamodel.data.head(20))
self.dataView.setModel(model)
[docs] def OnDataChanged(self):
self.PopulateTable()
[docs] def ReadData(self,filename):
#read input data
dio = DataIO()
if filename.endswith('.pkl.gz') | filename[0].endswith('.pkl'):
d = dio.ReadPickleFile(filename)
elif filename.endswith('.csv'):
d = dio.ReadCSVFile(filename)
else:
d = None
#also read MUSE dictionary
MUSEDictNAMEtoID, MUSEDictIDtoNAME, MUSEDictDataFrame = dio.ReadMUSEDictionary()
self.datamodel.SetMUSEDictionaries(MUSEDictNAMEtoID, MUSEDictIDtoNAME,MUSEDictDataFrame)
#also read Derived MUSE dictionary
DerivedMUSEMap = dio.ReadDerivedMUSEMap()
self.datamodel.SetDerivedMUSEMap(DerivedMUSEMap)
#set data in model
if (d is not None) and self.datamodel.IsValidData(d):
logger.info('New data read from file: %s', filename)
self.datamodel.SetDataFilePath(filename)
self.datamodel.SetData(d)
else:
logger.warning('Loaded data was not valid.')