|
|
@@ -0,0 +1,203 @@
|
|
|
+from tkinter import *
|
|
|
+from tkinter import ttk
|
|
|
+from fdc.dataSheet import DataSheet
|
|
|
+from fdc.fdc import canberra_modified, FDC, Clustering
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class MessageBox:
|
|
|
+ def __init__(self, message):
|
|
|
+ self.root = Tk()
|
|
|
+ self.root.geometry("300x100")
|
|
|
+
|
|
|
+ w = Label(self.root, text=message)
|
|
|
+ w.pack(side=TOP)
|
|
|
+
|
|
|
+ w = Button(self.root, text="OK", command=self.onClickOk)
|
|
|
+ w.pack(side=TOP)
|
|
|
+
|
|
|
+
|
|
|
+ def onClickOk(self):
|
|
|
+ self.root.destroy()
|
|
|
+
|
|
|
+ def run(self):
|
|
|
+ self.root.mainloop()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class SpreadSheet:
|
|
|
+ def __init__(self, data):
|
|
|
+ self.root = Tk()
|
|
|
+ self.root.geometry("600x400")
|
|
|
+
|
|
|
+ yscroll = Scrollbar(self.root, orient=VERTICAL)
|
|
|
+ yscroll.pack(side=RIGHT, fill=Y)
|
|
|
+
|
|
|
+ xscroll = Scrollbar(self.root, orient=HORIZONTAL)
|
|
|
+ xscroll.pack(side=BOTTOM, fill=X)
|
|
|
+
|
|
|
+ columns = list(data.columns)
|
|
|
+ frame = ttk.Treeview(
|
|
|
+ self.root,
|
|
|
+ columns=columns,
|
|
|
+ xscrollcommand=xscroll.set,
|
|
|
+ yscrollcommand=yscroll.set
|
|
|
+ )
|
|
|
+
|
|
|
+ frame.pack(fill=BOTH, expand=True)
|
|
|
+ xscroll.config(command=frame.xview)
|
|
|
+ yscroll.config(command=frame.yview)
|
|
|
+
|
|
|
+ for c in columns:
|
|
|
+ frame.heading(c, text=c)
|
|
|
+
|
|
|
+ for (n, row) in zip(data.index, data.values):
|
|
|
+ frame.insert('', 'end', n, text=n, values=[str(v) for v in row])
|
|
|
+
|
|
|
+ def run(self):
|
|
|
+ self.root.mainloop()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class UI:
|
|
|
+ def __init__(self):
|
|
|
+ self.root = Tk()
|
|
|
+ self.root.geometry("640x400")
|
|
|
+ frame = Frame(self.root)
|
|
|
+ frame.pack()
|
|
|
+
|
|
|
+ self.columnTableItems = []
|
|
|
+
|
|
|
+ self.createButtonFrame()
|
|
|
+ self.columnFrame = self.createColumnOverview()
|
|
|
+
|
|
|
+ self.root.title("Test")
|
|
|
+
|
|
|
+ self.dataSheet = None
|
|
|
+
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+ # Data mapping
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+ def run(self):
|
|
|
+ self.root.mainloop()
|
|
|
+
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+ # Create UI parts
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+ def createButtonFrame(self, side=TOP):
|
|
|
+ frame = Frame(self.root)
|
|
|
+ frame.pack(side=side)
|
|
|
+
|
|
|
+ c = 0
|
|
|
+ def newButton(c, text, command):
|
|
|
+ button = Button(frame, text=text, command=command)
|
|
|
+ button.pack(side=LEFT, padx=3, pady=3)
|
|
|
+ return c + 1
|
|
|
+
|
|
|
+ c = newButton(c, "Load data", self.onClickedLoadData)
|
|
|
+ c = newButton(c, "Save data", self.onClickedSaveData)
|
|
|
+ c = newButton(c, "Show data", self.onClickedShowData)
|
|
|
+ c = newButton(c, "Fix data types", self.onClickedFixDataTypes)
|
|
|
+ c = newButton(c, "Fix missing values", self.onClickedFixMissingValues)
|
|
|
+ c = newButton(c, "do FDC", self.onClickedDoFdc)
|
|
|
+ return frame
|
|
|
+
|
|
|
+ def createColumnOverview(self, side=TOP):
|
|
|
+ myscroll = Scrollbar(self.root)
|
|
|
+ myscroll.pack(side = RIGHT, fill = Y)
|
|
|
+
|
|
|
+ frame = ttk.Treeview(self.root, columns=("type", "missing"), yscrollcommand=myscroll.set)
|
|
|
+
|
|
|
+ frame.pack(side=side, fill=BOTH, expand=True)
|
|
|
+ myscroll.config(command=frame.yview)
|
|
|
+
|
|
|
+ frame.heading("type", text="Type")
|
|
|
+ frame.heading("missing", text="# Missing Values")
|
|
|
+
|
|
|
+ return frame
|
|
|
+
|
|
|
+
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+ # Button actions
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+ def onClickedLoadData(self):
|
|
|
+ print("Clicked 'load data'")
|
|
|
+ filename='healthcare-dataset-stroke-data.csv'
|
|
|
+ self.dataSheet = DataSheet(filename)
|
|
|
+ self.updateColumnTable()
|
|
|
+ MessageBox("Data loaded.").run()
|
|
|
+
|
|
|
+ def onClickedSaveData(self):
|
|
|
+ print("Clicked 'save data'")
|
|
|
+
|
|
|
+ def onClickedShowData(self):
|
|
|
+ print("Clicked 'show data'")
|
|
|
+ if self.dataSheet is None:
|
|
|
+ MessageBox("No data loaded.").run()
|
|
|
+ else:
|
|
|
+ s = SpreadSheet(self.dataSheet.data)
|
|
|
+ s.run()
|
|
|
+
|
|
|
+ def onClickedFixDataTypes(self):
|
|
|
+ print("Fix data types")
|
|
|
+ if self.dataSheet:
|
|
|
+ self.dataSheet.fixDatatypes()
|
|
|
+ self.updateColumnTable()
|
|
|
+ MessageBox("Done.").run()
|
|
|
+
|
|
|
+ def onClickedFixMissingValues(self):
|
|
|
+ print("Fix missing values")
|
|
|
+ if self.dataSheet:
|
|
|
+ self.dataSheet.fix_missing_values()
|
|
|
+ self.updateColumnTable()
|
|
|
+ MessageBox("Done.").run()
|
|
|
+
|
|
|
+ def onClickedDoFdc(self):
|
|
|
+ print("Clicked 'do fdc'")
|
|
|
+ fdc = FDC(clustering_cont=Clustering('euclidean')
|
|
|
+ , clustering_ord=Clustering(canberra_modified)
|
|
|
+ , clustering_nom=Clustering('hamming', max_components=1)
|
|
|
+ , visual=False
|
|
|
+ , use_pandas_output=True
|
|
|
+ , with_2d_embedding=False
|
|
|
+ )
|
|
|
+
|
|
|
+ fdc.selectFeatures(continueous=self.dataSheet.cols_cont, nomial=self.dataSheet.cols_nom, ordinal=self.dataSheet.cols_ord)
|
|
|
+
|
|
|
+ fdcData = fdc.normalize(self.dataSheet.data)
|
|
|
+ self.dataSheet = DataSheet(dataFrame=fdcData)
|
|
|
+ self.updateColumnTable()
|
|
|
+ MessageBox("Done.").run()
|
|
|
+
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+ # Update View
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+ def updateColumnTable(self):
|
|
|
+ for i in self.columnTableItems:
|
|
|
+ self.columnFrame.delete(i)
|
|
|
+
|
|
|
+ self.columnTableItems = []
|
|
|
+
|
|
|
+ if self.dataSheet is None:
|
|
|
+ return
|
|
|
+
|
|
|
+ dTypes = self.dataSheet.data.dtypes
|
|
|
+ row = 0
|
|
|
+ d = self.dataSheet.data.isna().sum()
|
|
|
+ for ((n, t), s) in zip(dTypes.items(), d):
|
|
|
+ i = self.columnFrame.insert('', 'end', row, text=n, values=(str(t), str(s)))
|
|
|
+ self.columnTableItems.append(i)
|
|
|
+ row += 1
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+ # Other Stuff
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ui = UI()
|
|
|
+ui.run()
|
|
|
+
|
|
|
+
|