chat.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. from enum import Enum
  2. from pywebio.input import *
  3. from pywebio.output import *
  4. from pywebio.session import *
  5. import pywebio.pin as pin
  6. from pywebio.session import local
  7. from pywebio import start_server
  8. import pandas as pd
  9. from io import StringIO
  10. from utils import judge_field, image, widget
  11. from utils.common import *
  12. from utils.algo import *
  13. # def get_cur_state():
  14. # return f"当前状态--- 数据文件:{}, 字段映射:{}, 数据清洗:{}"
  15. def init_actions():
  16. if not local.state_enter.get(State.init, None):
  17. local.state_enter.update({State.init: True})
  18. buttons = {State.upload_file.value: ['我想导入数据文件', 'success']}
  19. res = actions('请告诉我您的需求', buttons=construct_buttons(buttons))
  20. put_table([['用户:', buttons[res][0]]])
  21. return State(res)
  22. def upload_file_actions():
  23. put_table([['系统:', "请选择您要导入的数据文件"]])
  24. file = file_upload(accept=['.csv', '.xlsx','.xls'], placeholder="请上传文件,支持 .csv, .xlsx, .xls 文件")
  25. filename = file['filename']
  26. if filename.endswith(".csv"):
  27. df = pd.read_csv(StringIO(file['content'].decode('utf-8')))
  28. elif filename.endswith(".xlsx"):
  29. df = pd.read_excel(file['content'])
  30. elif filename.endswith(".xls"):
  31. df = pd.read_excel(file['content'])
  32. columns = list(df.columns)
  33. put_table([
  34. ['系统:',put_markdown(f"{filename}文件读取成功,展示前2条数据如下")]
  35. ])
  36. put_table([
  37. ['系统:',
  38. put_table(df.to_dict(orient='records')[0:2],header=columns)]
  39. ])
  40. local.df = df
  41. local.columns = columns
  42. # 下一步支持的action
  43. if not local.state_enter.get(State.upload_file, None):
  44. local.state_enter.update({State.upload_file: True})
  45. buttons = {State.column_map.value: ['我想配置数据字段映射', 'success'], State.upload_file.value: ['我想重新导入数据文件', 'info']}
  46. res = actions('请告诉我您的需求', buttons=construct_buttons(buttons))
  47. put_table([['用户:', buttons[res][0]]])
  48. return State(res)
  49. else:
  50. return widget.next_actions()
  51. def column_map_actions():
  52. columns = local.columns
  53. # 下一步支持的action
  54. if not local.state_enter.get(State.column_map, None):
  55. local.state_enter.update({State.column_map: True})
  56. put_table([
  57. ['系统:',put_markdown(f"字段自动化识别结果如下,可手动点击进行修改")]
  58. ])
  59. widget.column_map_widget(columns)
  60. buttons = {State.data_clean_conf.value: ['我想进行数据清洗', 'success'],
  61. State.run_algo.value: ['我想进入算法执行系统', 'success'],
  62. State.upload_file.value: ['我想重新导入数据文件', 'info']}
  63. res = actions('请告诉我您的需求', buttons=construct_buttons(buttons))
  64. put_table([['用户:', buttons[res][0]]])
  65. return State(res)
  66. else:
  67. put_table([
  68. ['系统:',put_markdown(f"当前的字段映射结果如下,请手动点击进行修改")]
  69. ])
  70. widget.column_map_widget(columns)
  71. return widget.next_actions()
  72. def data_clean_conf_actions():
  73. if not local.state_enter.get(State.data_clean_conf, None):
  74. local.state_enter.update({State.data_clean_conf: True})
  75. buttons = {-1: ['我想自定义清洗规则', 'success'],
  76. State.data_clean_exec.value: ['我想使用默认规则进行数据清洗', 'success']}
  77. res = actions('是否需要自定义清洗规则?', buttons=construct_buttons(buttons))
  78. put_table([['系统:', "是否需要自定义清洗规则?"]])
  79. put_table([['用户:', buttons[res][0]]])
  80. if res == -1:
  81. res = widget.data_clean_conf_widget()
  82. else:
  83. res = widget.data_clean_conf_widget()
  84. return State(res)
  85. def data_clean_exec_actions():
  86. if not local.state_enter.get(State.data_clean_exec, None):
  87. local.state_enter.update({State.data_clean_exec: True})
  88. pass # 数据清洗功能
  89. put_table([['系统:', "数据清洗完成"]])
  90. return download_file_actions()
  91. def download_file_actions():
  92. local.df.to_csv("after_clean.csv")
  93. with open("./after_clean.csv", 'rb') as f:
  94. content = f.read()
  95. put_table([['系统:', put_file('data.csv', content, '点击下载清洗后的数据文件')]])
  96. return widget.next_actions()
  97. def run_algo_actions():
  98. if not local.state_enter.get(State.run_algo, None):
  99. local.state_enter.update({State.run_algo: True})
  100. put_table([['系统:', "您已进入算法执行系统"]])
  101. return widget.algo_system_actions()
  102. def run_algo_all_actions():
  103. if not local.state_enter.get(State.run_algo_all, None):
  104. local.state_enter.update({State.run_algo_all: True})
  105. put_table([['系统:', "所有算法执行完成"]])
  106. return widget.next_actions()
  107. def run_algo_1_actions():
  108. if not local.state_enter.get(State.run_algo_1, None):
  109. local.state_enter.update({State.run_algo_1: True})
  110. put_table([['系统:', "基本信息统计执行完成, 结果如下"]])
  111. put_table([['系统:', basic_info_sta()]])
  112. return widget.algo_system_actions()
  113. def run_algo_2_actions():
  114. if not local.state_enter.get(State.run_algo_2, None):
  115. local.state_enter.update({State.run_algo_2: True})
  116. put_table([['系统:', "电池信息分析执行完成, 结果如下"]])
  117. put_table([['系统:', bat_info_sta()]])
  118. return widget.algo_system_actions()
  119. def run_algo_3_actions():
  120. if not local.state_enter.get(State.run_algo_3, None):
  121. local.state_enter.update({State.run_algo_3: True})
  122. put_table([['系统:', "电池安全诊断执行完成, 结果如下"]])
  123. put_table([['系统:', safety_diag()]])
  124. return widget.algo_system_actions()
  125. def run_algo_4_actions():
  126. if not local.state_enter.get(State.run_algo_4, None):
  127. local.state_enter.update({State.run_algo_4: True})
  128. put_table([['系统:', "电池性能诊断执行完成, 结果如下"]])
  129. put_table([['系统:', performance_diag()]])
  130. return widget.algo_system_actions()
  131. def run_algo_5_actions():
  132. if not local.state_enter.get(State.run_algo_5, None):
  133. local.state_enter.update({State.run_algo_5: True})
  134. put_table([['系统:', "电池画像分析执行完成, 结果如下"]])
  135. put_table([['系统:', bat_portrait()]])
  136. return widget.algo_system_actions()
  137. def run_algo_exit_actions():
  138. if not local.state_enter.get(State.run_algo_exit, None):
  139. local.state_enter.update({State.run_algo_exit: True})
  140. put_table([['系统:', "您已退出算法执行系统"]])
  141. return widget.next_actions()
  142. def main():
  143. local.state_enter = {}
  144. cur_state = State.init
  145. set_env(title='神目电池安全卫士', output_animation=False)
  146. put_markdown(f"## 欢迎使用神目电池安全卫士系统")
  147. while True:
  148. try:
  149. if cur_state == State.init:
  150. cur_state = init_actions()
  151. elif cur_state == State.upload_file:
  152. cur_state = upload_file_actions()
  153. elif cur_state == State.column_map:
  154. cur_state = column_map_actions()
  155. elif cur_state == State.data_clean_conf:
  156. cur_state = data_clean_conf_actions()
  157. elif cur_state == State.data_clean_exec:
  158. cur_state = data_clean_exec_actions()
  159. elif cur_state == State.download_file:
  160. cur_state = download_file_actions()
  161. elif cur_state == State.run_algo:
  162. cur_state = run_algo_actions()
  163. elif cur_state == State.run_algo_all:
  164. cur_state = run_algo_all_actions()
  165. elif cur_state == State.run_algo_1:
  166. cur_state = run_algo_1_actions()
  167. elif cur_state == State.run_algo_2:
  168. cur_state = run_algo_2_actions()
  169. elif cur_state == State.run_algo_3:
  170. cur_state = run_algo_3_actions()
  171. elif cur_state == State.run_algo_4:
  172. cur_state = run_algo_4_actions()
  173. elif cur_state == State.run_algo_5:
  174. cur_state = run_algo_5_actions()
  175. elif cur_state == State.run_algo_exit:
  176. cur_state = run_algo_exit_actions()
  177. else:
  178. raise Exception("进入未知状态")
  179. except Exception as e:
  180. toast(str(e), 0, color='error')
  181. # cur_state = State.init
  182. if __name__ == '__main__':
  183. start_server(main, port=8080, debug=True, remote_access=True)