Source code for gui.core.SubmodelBlend
import numpy as np
from PyQt5 import QtWidgets
from gui.ui.SubmodelBlend import Ui_Form
from gui.util.Modules import Modules
from libpyhat.regression import sm
[docs]
class subWidgets:
def __init__(self, predictionComboBox, minLabel, minSpinBox, maxLabel, maxSpinBox):
self.predictionComboBox = predictionComboBox
self.minLabel = minLabel
self.minSpinBox = minSpinBox
self.maxLabel = maxLabel
self.maxSpinBox = maxSpinBox
[docs]
def setHidden(self, bool):
self.predictionComboBox.setHidden(bool)
self.minLabel.setHidden(bool)
self.minSpinBox.setHidden(bool)
self.maxLabel.setHidden(bool)
self.maxSpinBox.setHidden(bool)
[docs]
def getValues(self):
return [
self.predictionComboBox.currentText(),
[float(self.minSpinBox.value()), float(self.maxSpinBox.value())],
]
[docs]
def spinBox(self, int_):
if int_ == 0:
return self.minSpinBox
elif int_ == 1:
return self.maxSpinBox
else:
return "Not a valid number"
[docs]
class SubmodelBlend(Ui_Form, Modules):
def __init__(self):
super().__init__()
self.subwidgets = []
self.predictnames = [""]
[docs]
def setupUi(self, Form):
super().setupUi(Form)
self.checkMinAndMax()
Modules.setupUi(self, Form)
[docs]
def update_opt(self):
if self.optimizeSubRangesCheckBox.isChecked():
try:
self.setComboBox(
self.optimizeSubRangesComboBox,
self.data[self.ChooseDataComboBox.currentText()]
.df["comp"]
.columns.values,
)
except:
self.setComboBox(self.optimizeSubRangesComboBox, ["No Compositions"])
[docs]
def connectWidgets(self):
self.index_spin.setHidden(
True
) # hide the spinbox counting the number of visible submodels
self.setComboBox(
self.ChooseDataComboBox, ["Choose a dataset"] + self.datakeys
) # populate the combobox
# with teh availalbe datasets to choose from
self.setupWidgets() # create the widgets to hold the various submodels
# start off with optimize combobox hidden
if not self.optimizeSubRangesCheckBox.isChecked():
self.optimizeSubRangesLabel.setHidden(True)
self.optimizeSubRangesComboBox.setHidden(True)
self.setHidden(self.subwidgets)
self.addSubPushButton.clicked.connect(self.addSubmodel_pushed)
self.deleteSubPushButton.clicked.connect(self.deleteSubmodel_pushed)
self.optimizeSubRangesCheckBox.stateChanged.connect(self.update_opt)
self.ChooseDataComboBox.currentIndexChanged.connect(
self.data_changed
) # connect the data combobox to data_changed
# to fill in the submodel boxes with predictions
self.index_spin.valueChanged.connect(lambda: self.setHidden(self.subwidgets))
[docs]
def data_changed(self):
# get the prediction column names from the currently selected dataset
try:
self.predictnames = (
self.data[self.ChooseDataComboBox.currentText()]
.df["predict"]
.columns.values
)
except:
print(
"No predictions found. Make sure that once you train a "
"model, you also predict with it before trying to blend the "
"results."
)
self.predictnames = ["No Predictions"]
# populate the permanent comboboxes with the availalbe predictions
self.setComboBox(self.lowPredictionComboBox, self.predictnames)
self.setComboBox(self.highPredictionComboBox, self.predictnames)
self.setComboBox(self.referencePredictionComboBox, self.predictnames)
# populate all of the intermediate submodel comboboxes with the
# predictions
for i in self.subwidgets:
self.setComboBox(i.predictionComboBox, self.predictnames)
pass
[docs]
def setHidden(self, list):
for i in range(0, len(list)):
if i < self.index_spin.value():
list[i].setHidden(False)
else:
list[i].setHidden(True)
[docs]
def run(self):
blendranges = []
submodel_blend_names = []
submodel_predictions = []
datakey = self.ChooseDataComboBox.currentText()
refcol = ("comp", self.optimizeSubRangesComboBox.currentText())
# start with the low model
blendranges.append([-9999, float(self.lowPredictionMaxSpinBox.value())])
submodel_blend_names.append(self.lowPredictionComboBox.currentText())
submodel_predictions.append(
self.data[datakey].df[("predict", self.lowPredictionComboBox.currentText())]
)
# append the intermediate submodels
for i in range(0, self.index_spin.value()):
temp_vals = self.subwidgets[i].getValues()
blendranges.append(temp_vals[1])
submodel_blend_names.append(temp_vals[0])
submodel_predictions.append(
self.data[datakey].df[("predict", temp_vals[0])]
)
# append the high model
blendranges.append([float(self.highPredictionMinSpinBox.value()), 9999])
submodel_blend_names.append(self.highPredictionComboBox.currentText())
submodel_predictions.append(
self.data[datakey].df[
("predict", self.highPredictionComboBox.currentText())
]
)
# append the reference model as a catch-all
submodel_blend_names.append(self.referencePredictionComboBox.currentText())
submodel_predictions.append(
self.data[datakey].df[
("predict", self.referencePredictionComboBox.currentText())
]
)
if self.optimizeSubRangesCheckBox.isChecked():
truevals = self.data[datakey].df[refcol]
else:
truevals = None
sm_obj = sm.sm(blendranges)
# optimize blending if reference data is provided
if truevals is not None:
predictions_blended = sm_obj.do_blend(
np.array(submodel_predictions), truevals=truevals
)
else:
# otherwise just blend the predictions together
predictions_blended = sm_obj.do_blend(np.array(submodel_predictions))
# save the blended predictions
self.data[datakey].df[
("predict", "Blended-Predict " + str(sm_obj.blendranges))
] = predictions_blended
[docs]
def addSubmodel_pushed(self):
if self.index_spin.value() < len(self.subwidgets):
self.index_spin.setValue(self.index_spin.value() + 1)
else:
print("Cannot add more submodels")
[docs]
def deleteSubmodel_pushed(self):
if self.index_spin.value() > 0:
self.index_spin.setValue(self.index_spin.value() - 1)
self.subwidgets[self.index_spin.value()].setValue(0)
else:
print("Cannot delete any more submodels")
[docs]
def setupWidgets(self):
self.subwidgets.append(
subWidgets(
self.PredictionComboBox,
self.minLabel,
self.minSpinBox,
self.maxLabel,
self.maxSpinBox,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_2,
self.minLabel_2,
self.minSpinBox_2,
self.maxLabel_2,
self.maxSpinBox_2,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_3,
self.minLabel_3,
self.minSpinBox_3,
self.maxLabel_3,
self.maxSpinBox_3,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_4,
self.minLabel_4,
self.minSpinBox_4,
self.maxLabel_4,
self.maxSpinBox_4,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_5,
self.minLabel_5,
self.minSpinBox_5,
self.maxLabel_5,
self.maxSpinBox_5,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_6,
self.minLabel_6,
self.minSpinBox_6,
self.maxLabel_6,
self.maxSpinBox_6,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_7,
self.minLabel_7,
self.minSpinBox_7,
self.maxLabel_7,
self.maxSpinBox_7,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_8,
self.minLabel_8,
self.minSpinBox_8,
self.maxLabel_8,
self.maxSpinBox_8,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_9,
self.minLabel_9,
self.minSpinBox_9,
self.maxLabel_9,
self.maxSpinBox_9,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_10,
self.minLabel_10,
self.minSpinBox_10,
self.maxLabel_10,
self.maxSpinBox_10,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_11,
self.minLabel_11,
self.minSpinBox_11,
self.maxLabel_11,
self.maxSpinBox_11,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_12,
self.minLabel_12,
self.minSpinBox_12,
self.maxLabel_12,
self.maxSpinBox_12,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_13,
self.minLabel_13,
self.minSpinBox_13,
self.maxLabel_13,
self.maxSpinBox_13,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_14,
self.minLabel_14,
self.minSpinBox_14,
self.maxLabel_14,
self.maxSpinBox_14,
)
)
self.subwidgets.append(
subWidgets(
self.PredictionComboBox_15,
self.minLabel_15,
self.minSpinBox_15,
self.maxLabel_15,
self.maxSpinBox_15,
)
)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = SubmodelBlend()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())