testGui.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. from tkinter import *
  2. from tkinter import ttk
  3. from fdc.dataSheet import DataSheet
  4. from fdc.fdc import canberra_modified, FDC, Clustering
  5. class MessageBox:
  6. def __init__(self, message):
  7. self.root = Tk()
  8. self.root.geometry("300x100")
  9. w = Label(self.root, text=message)
  10. w.pack(side=TOP)
  11. w = Button(self.root, text="OK", command=self.onClickOk)
  12. w.pack(side=TOP)
  13. def onClickOk(self):
  14. self.root.destroy()
  15. def run(self):
  16. self.root.mainloop()
  17. class SpreadSheet:
  18. def __init__(self, data):
  19. self.root = Tk()
  20. self.root.geometry("600x400")
  21. yscroll = Scrollbar(self.root, orient=VERTICAL)
  22. yscroll.pack(side=RIGHT, fill=Y)
  23. xscroll = Scrollbar(self.root, orient=HORIZONTAL)
  24. xscroll.pack(side=BOTTOM, fill=X)
  25. columns = list(data.columns)
  26. frame = ttk.Treeview(
  27. self.root,
  28. columns=columns,
  29. xscrollcommand=xscroll.set,
  30. yscrollcommand=yscroll.set
  31. )
  32. frame.pack(fill=BOTH, expand=True)
  33. xscroll.config(command=frame.xview)
  34. yscroll.config(command=frame.yview)
  35. for c in columns:
  36. frame.heading(c, text=c)
  37. for (n, row) in zip(data.index, data.values):
  38. frame.insert('', 'end', n, text=n, values=[str(v) for v in row])
  39. def run(self):
  40. self.root.mainloop()
  41. class UI:
  42. def __init__(self):
  43. self.root = Tk()
  44. self.root.geometry("640x400")
  45. frame = Frame(self.root)
  46. frame.pack()
  47. self.columnTableItems = []
  48. self.createButtonFrame()
  49. self.columnFrame = self.createColumnOverview()
  50. self.root.title("Test")
  51. self.dataSheet = None
  52. # ---------------------------------------------------------------------------
  53. # Data mapping
  54. # ---------------------------------------------------------------------------
  55. def run(self):
  56. self.root.mainloop()
  57. # ---------------------------------------------------------------------------
  58. # Create UI parts
  59. # ---------------------------------------------------------------------------
  60. def createButtonFrame(self, side=TOP):
  61. frame = Frame(self.root)
  62. frame.pack(side=side)
  63. c = 0
  64. def newButton(c, text, command):
  65. button = Button(frame, text=text, command=command)
  66. button.pack(side=LEFT, padx=3, pady=3)
  67. return c + 1
  68. c = newButton(c, "Load data", self.onClickedLoadData)
  69. c = newButton(c, "Save data", self.onClickedSaveData)
  70. c = newButton(c, "Show data", self.onClickedShowData)
  71. c = newButton(c, "Fix data types", self.onClickedFixDataTypes)
  72. c = newButton(c, "Fix missing values", self.onClickedFixMissingValues)
  73. c = newButton(c, "do FDC", self.onClickedDoFdc)
  74. return frame
  75. def createColumnOverview(self, side=TOP):
  76. myscroll = Scrollbar(self.root)
  77. myscroll.pack(side = RIGHT, fill = Y)
  78. frame = ttk.Treeview(self.root, columns=("type", "missing"), yscrollcommand=myscroll.set)
  79. frame.pack(side=side, fill=BOTH, expand=True)
  80. myscroll.config(command=frame.yview)
  81. frame.heading("type", text="Type")
  82. frame.heading("missing", text="# Missing Values")
  83. return frame
  84. # ---------------------------------------------------------------------------
  85. # Button actions
  86. # ---------------------------------------------------------------------------
  87. def onClickedLoadData(self):
  88. print("Clicked 'load data'")
  89. filename='healthcare-dataset-stroke-data.csv'
  90. self.dataSheet = DataSheet(filename)
  91. self.updateColumnTable()
  92. MessageBox("Data loaded.").run()
  93. def onClickedSaveData(self):
  94. print("Clicked 'save data'")
  95. def onClickedShowData(self):
  96. print("Clicked 'show data'")
  97. if self.dataSheet is None:
  98. MessageBox("No data loaded.").run()
  99. else:
  100. s = SpreadSheet(self.dataSheet.data)
  101. s.run()
  102. def onClickedFixDataTypes(self):
  103. print("Fix data types")
  104. if self.dataSheet:
  105. self.dataSheet.fixDatatypes()
  106. self.updateColumnTable()
  107. MessageBox("Done.").run()
  108. def onClickedFixMissingValues(self):
  109. print("Fix missing values")
  110. if self.dataSheet:
  111. self.dataSheet.fix_missing_values()
  112. self.updateColumnTable()
  113. MessageBox("Done.").run()
  114. def onClickedDoFdc(self):
  115. print("Clicked 'do fdc'")
  116. fdc = FDC(clustering_cont=Clustering('euclidean')
  117. , clustering_ord=Clustering(canberra_modified)
  118. , clustering_nom=Clustering('hamming', max_components=1)
  119. , visual=False
  120. , use_pandas_output=True
  121. , with_2d_embedding=False
  122. )
  123. fdc.selectFeatures(continueous=self.dataSheet.cols_cont, nomial=self.dataSheet.cols_nom, ordinal=self.dataSheet.cols_ord)
  124. fdcData = fdc.normalize(self.dataSheet.data)
  125. self.dataSheet = DataSheet(dataFrame=fdcData)
  126. self.updateColumnTable()
  127. MessageBox("Done.").run()
  128. # ---------------------------------------------------------------------------
  129. # Update View
  130. # ---------------------------------------------------------------------------
  131. def updateColumnTable(self):
  132. for i in self.columnTableItems:
  133. self.columnFrame.delete(i)
  134. self.columnTableItems = []
  135. if self.dataSheet is None:
  136. return
  137. dTypes = self.dataSheet.data.dtypes
  138. row = 0
  139. d = self.dataSheet.data.isna().sum()
  140. for ((n, t), s) in zip(dTypes.items(), d):
  141. i = self.columnFrame.insert('', 'end', row, text=n, values=(str(t), str(s)))
  142. self.columnTableItems.append(i)
  143. row += 1
  144. # ---------------------------------------------------------------------------
  145. # Other Stuff
  146. # ---------------------------------------------------------------------------
  147. ui = UI()
  148. ui.run()