Learn.py 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131
  1. import pandas as pd
  2. import re
  3. import pandas_profiling as pp
  4. # from multiprocessing import Process
  5. from threading import Thread
  6. from pyecharts import options as opts
  7. from pyecharts.charts import *
  8. from pyecharts.globals import SymbolType
  9. from pyecharts.components import Table
  10. import numpy as np
  11. class Form:
  12. def __init__(self):
  13. class DEL:pass
  14. self.Sheet_Dic = {}
  15. self.Clean_Func = {}
  16. self.Clean_Func_Exp = {}
  17. self.DEL = DEL()
  18. self.Name = {'pd':pd,'DEL':self.DEL,'re':re,'Sheet':self.Sheet_Dic}
  19. self.R_Dic = {}#存放所有的图
  20. def get_Sheet(self,name,all_Row = None,all_Colunms=None) -> pd.DataFrame:
  21. try:
  22. pd.set_option('display.max_rows',all_Row)
  23. pd.set_option('display.max_columns',all_Colunms)
  24. except:pass
  25. return self.Sheet_Dic[name]
  26. def Describe(self,name,make_Sheet=False):#生成描述
  27. get = self.get_Sheet(name)
  28. Des = get.describe()
  29. if make_Sheet:self.Add_Form(Des,f'{name}_describe[{len(self.Sheet_Dic)}]')
  30. shape = get.shape
  31. dtype = get.dtypes
  32. n = get.ndim
  33. head = get.head()
  34. tail = get.tail(3)
  35. return f'1)基本\n{Des}\n\n2)形状:{shape}\n\n3)数据类型\n{dtype}\n\n4)数据维度:{n}\n\n5)头部数据\n{head}\n\n6)尾部数据\n{tail}' \
  36. f'\n\n7)行名\n{get.index}\n\n8)列名\n{get.columns}'
  37. def Add_Form(self,Data,name=''):
  38. if name == '':name = f'Sheet[{len(self.Sheet_Dic)}]'
  39. self.Sheet_Dic[name] = Data
  40. return Data
  41. def __Add_Form(self,Dic,Func,name='',Index=True,**kwargs):#新增表格的核心方式
  42. try:
  43. Data = Func(Dic,**kwargs)
  44. except UnicodeDecodeError:#找不到编码方式
  45. return False
  46. if not Index:
  47. Data.index = Data.iloc[:,0].tolist()
  48. Data.drop(Data.columns.values.tolist()[0],inplace=True,axis=1)
  49. return self.Add_Form(Data,name)
  50. def Add_CSV(self,Dic,name='',Sep=',',code='utf-8',str_=True,Index=True):
  51. if str_:
  52. k = {'dtype':'object'}
  53. else:
  54. k = {}
  55. return self.__Add_Form(Dic,pd.read_csv,name,Index,sep=Sep,encoding=code,**k)
  56. def Add_Python(self,Text,sheet_name='') -> pd.DataFrame:
  57. name = {'Sheet':self.get_Sheet}
  58. name.update(globals().copy())
  59. name.update(locals().copy())
  60. exec(Text,name)
  61. exec('get = Creat()',name)
  62. if isinstance(name['get'],pd.DataFrame):#已经是DataFram
  63. get = name['get']
  64. else:
  65. try:
  66. get = pd.DataFrame(name['get'])
  67. except:
  68. get = pd.DataFrame([name['get']])
  69. self.Add_Form(get, sheet_name)
  70. return get
  71. def Add_Html(self,Dic,name='',code='utf-8',str_=True,Index=True):
  72. if str_:
  73. k = {'dtype':'object'}
  74. else:
  75. k = {}
  76. return self.__Add_Form(Dic,pd.read_html,name,Index,encoding=code,**k)
  77. def get_FormList(self):
  78. return list(self.Sheet_Dic.keys())#返回列表
  79. def to_Html(self,name,Dic='',type_=0):
  80. if Dic == '': Dic = f'{name}.html'
  81. #把要画的sheet放到第一个
  82. Sheet_Dic = self.Sheet_Dic.copy()
  83. del Sheet_Dic[name]
  84. Sheet_list = [name] + list(Sheet_Dic.keys())
  85. class TAB_F:
  86. def __init__(self, q):
  87. self.tab = q # 一个Tab
  88. def render(self, Dic):
  89. return self.tab.render(Dic)
  90. #生成一个显示页面
  91. if type_ == 0:
  92. class TAB(TAB_F):
  93. def add(self,table,k,*f):
  94. self.tab.add(table,k)
  95. tab = TAB(Tab(page_title='CoTan:查看表格'))#一个Tab
  96. elif type_ == 1:
  97. class TAB(TAB_F):
  98. def add(self,table,*k):
  99. self.tab.add(table)
  100. tab = TAB(Page(page_title='CoTan:查看表格', layout=Page.DraggablePageLayout))
  101. else:
  102. class TAB(TAB_F):
  103. def add(self,table,*k):
  104. self.tab.add(table)
  105. tab = TAB(Page(page_title='CoTan:查看表格', layout=Page.SimplePageLayout))
  106. #迭代添加内容
  107. for name in Sheet_list:
  108. get = self.get_Sheet(name)
  109. headers = [f'{name}'] + self.get_Column(name,True).tolist()
  110. rows = []
  111. table = Table()
  112. for i in get.iterrows(): # 按行迭代
  113. q = i[1].tolist()
  114. rows.append([f'{i[0]}']+q)
  115. table.add(headers, rows).set_global_opts(title_opts=opts.ComponentTitleOpts(title=f"表格:{name}", subtitle="CoTan~机器学习:查看表格"))
  116. tab.add(table,f'表格:{name}')
  117. tab.render(Dic)
  118. return Dic
  119. def To_Sheet_Des(self,Sheet,Dic):
  120. re = pp.ProfileReport(Sheet)
  121. re.to_file(Dic)
  122. def to_Report(self,name,Dic=''):
  123. if Dic == '': Dic = f'{name}.html'
  124. Sheet = self.get_Sheet(name)
  125. self.To_Sheet_Des(Sheet,Dic)
  126. return Dic
  127. def get_Column(self,name,only=False):#列名
  128. get = self.get_Sheet(name)
  129. if only:
  130. re = get.columns.values
  131. else:
  132. re = []
  133. loc_list = get.columns.values
  134. a = 0
  135. for i in loc_list:
  136. data = get[i].to_list()
  137. re.append(f'[列号:{a}]{i} -> {data}')
  138. a += 1
  139. return re
  140. def get_Index(self,name,only=False):
  141. get = self.get_Sheet(name)
  142. if only:
  143. re = get.index.values
  144. else:
  145. re = []
  146. loc_list = get.index.values
  147. a = 0
  148. for i in range(len(loc_list)):
  149. l = loc_list[i]
  150. data = get.iloc[i].to_list()
  151. re.append(f'[行号:{a}]{l} -> {data}')
  152. a += 1
  153. return re
  154. def Sorted(self,name,row:bool,new=False,a=True):
  155. get = self.get_Sheet(name)
  156. if row:#row-行名排序
  157. so = get.sort_index(axis=0, ascending=a)
  158. else:
  159. so = get.sort_index(axis=1, ascending=a)
  160. if new:
  161. self.Add_Form(so)
  162. return so
  163. def Stored_Valuse(self,name,F,new=False):
  164. get = self.get_Sheet(name)
  165. row = get.columns.values
  166. a = []
  167. b = []
  168. for i in F:
  169. a.append(row[i[0]])
  170. b.append(i[1])
  171. if len(a) == 1:
  172. a = a[0]
  173. b = b[0]
  174. so = get.sort_values(by=a,ascending=b)
  175. if new:
  176. self.Add_Form(so)
  177. return so
  178. def T(self,name,new=True):
  179. get = self.get_Sheet(name)
  180. re = get.T
  181. if new:
  182. self.Add_Form(re)
  183. return re
  184. def get_Clice(self,name,Column,Row,U_iloc=True,new=False):#iloc(Row,Column) or loc
  185. get = self.get_Sheet(name)
  186. if U_iloc:
  187. Cli = get.iloc[Row,Column]
  188. else:
  189. Cli = get.loc[Row, Column]
  190. if new:
  191. self.Add_Form(Cli)
  192. return Cli
  193. def Delete(self,name,Column,Row,new):
  194. get = self.get_Sheet(name)
  195. Column_List = get.columns.values
  196. for i in Column:
  197. try:
  198. get = get.drop(Column_List[int(i)],axis=1)
  199. except:pass
  200. Row_List = get.index.values
  201. for i in Row:
  202. try:
  203. get = get.drop(Row_List[int(i)])
  204. except:raise
  205. if new:
  206. self.Add_Form(get)
  207. return get
  208. def Done_Bool(self,name,Exp,new=False):
  209. get = self.get_Sheet(name)
  210. try:
  211. re = eval(Exp,{'S':get,'Sheet':get.iloc})
  212. if new:
  213. self.Add_Form(re)
  214. return re
  215. except:
  216. return None
  217. # raise
  218. def is_Na(self,name):
  219. get = self.get_Sheet(name)
  220. Na = pd.isna(get)
  221. return Na
  222. def Dropna(self,name,new):
  223. get = self.get_Sheet(name)
  224. Clean = get.dropna(axis=0)
  225. if new:
  226. self.Add_Form(Clean)
  227. return Clean
  228. def Add_CleanFunc(self,Exp):
  229. Name = self.Name.copy()
  230. try:
  231. exec(Exp,Name)
  232. except:
  233. return False
  234. Sava = {}
  235. Sava['Done_Row'] = Name.get('Done_Row', [])
  236. Sava['Done_Column'] = Name.get('Done_Column', [])
  237. Sava['axis'] = Name.get('axis', True)
  238. Sava['check'] = Name.get('check', lambda data,x,b,c,d,e:True)
  239. Sava['done'] = Name.get('done', lambda data,x,b,c,d,e:data)
  240. title = f"[{Name.get('name', f'{len(self.Clean_Func)}')}] Done_Row={Sava['Done_Row']}_Done_Column={Sava['Done_Column']}_axis={Sava['axis']}"
  241. self.Clean_Func[title] = Sava
  242. self.Clean_Func_Exp[title] = Exp
  243. def Return_CleanFunc(self):
  244. return list(self.Clean_Func.keys())
  245. def Delete_CleanFunc(self,key):
  246. try:
  247. del self.Clean_Func[key]
  248. del self.Clean_Func_Exp[key]
  249. except:
  250. pass
  251. def Tra_Clean(self):
  252. self.Clean_Func = {}
  253. self.Clean_Func_Exp = {}
  254. def Return_CleanExp(self,key):
  255. return self.Clean_Func_Exp[key]
  256. def Done_CleanFunc(self,name):
  257. get = self.get_Sheet(name).copy()
  258. for i in list(self.Clean_Func.values()):
  259. Done_Row = i['Done_Row']
  260. Done_Column = i['Done_Column']
  261. if Done_Row == []:
  262. Done_Row = range(get.shape[0])#shape=[行,列]#不需要回调
  263. if Done_Column == []:
  264. Done_Column = range(get.shape[1]) # shape=[行,列]#不需要回调
  265. if i['axis']:axis = 0
  266. else:axis = 1
  267. check = i['check']
  268. done = i['done']
  269. for r in Done_Row:
  270. for c in Done_Column:
  271. try:
  272. print(f'r={r},c={c}')
  273. n = eval(f"get.iloc[{r},{c}]")#第一个是行号,然后是列号
  274. r_h = eval(f"get.iloc[{r}]")
  275. c_h = eval(f"get.iloc[:,{c}]")
  276. print(f'n={n}')
  277. if not check(n,r,c,get,r_h,c_h):
  278. d = done(n,r,c,get,r_h,c_h)
  279. if d == self.DEL:
  280. if axis == 0:#常规删除
  281. Row_List = get.index.values
  282. get = get.drop(Row_List[int(r)])
  283. else:#常规删除
  284. Columns_List = get.columns.values
  285. get = get.drop(Columns_List[int(r)],axis=1)
  286. else:
  287. exec(f"get.iloc[{r},{c}] = {d}")#第一个是行名,然后是列名
  288. except:raise
  289. return get
  290. # 1)图例位置、朝向和是否显示
  291. # 2)视觉映射是否开启、是否有最大值和最小值、两端文本以及颜色、分段和朝向、size或color
  292. # 3)自动设置图标ID,标题
  293. # 4)工具箱显示
  294. # 5)title配置
  295. # 6)是否显示刻度线、数轴类型、分割线
  296. def Parsing_Parameters(self,text):#解析文本参数
  297. args = {}#解析到的参数
  298. exec(text,args)
  299. args_use = {}#真实的参数
  300. args_use['title'] = args.get('title',None)
  301. args_use['vice_title'] = args.get('vice_title', 'CoTan~机器学习:')
  302. args_use['show_Legend'] = bool(args.get('show_Legend', True))#是否显示图例
  303. args_use['ori_Legend'] = args.get('ori_Legend', 'horizontal')#朝向
  304. args_use['show_Visual_mapping'] = bool(args.get('show_Visual_mapping', True))#是否显示视觉映射
  305. args_use['is_color_Visual_mapping'] = bool(args.get('is_color_Visual_mapping', True))#颜色 or 大小
  306. args_use['min_Visual_mapping'] = args.get('min_Visual_mapping', None)#最小值(None表示现场计算)
  307. args_use['max_Visual_mapping'] = args.get('max_Visual_mapping', None)#最大值(None表示现场计算)
  308. args_use['color_Visual_mapping'] = args.get('color_Visual_mapping', None)#颜色列表
  309. args_use['size_Visual_mapping'] = args.get('size_Visual_mapping', None)#大小列表
  310. args_use['text_Visual_mapping'] = args.get('text_Visual_mapping', None)#文字
  311. args_use['is_Subsection'] = bool(args.get('is_Subsection', False)) # 分段类型
  312. args_use['Subsection_list'] = args.get('Subsection_list', []) # 分段列表
  313. args_use['ori_Visual'] = args.get('ori_Visual', 'vertical') # 朝向
  314. args_use['Tool_BOX'] = bool(args.get('Tool_BOX', True)) # 开启工具箱
  315. args_use['Theme'] = args.get('Theme', 'white') # 设置style
  316. args_use['BG_Color'] = args.get('BG_Color', None) # 设置背景颜色
  317. args_use['width'] = args.get('width', '900px') # 设置宽度
  318. args_use['heigh'] = args.get('heigh', '500px') if not bool(args.get('Square', False)) else args.get('width', '900px') # 设置高度
  319. args_use['page_Title'] = args.get('page_Title', '') # 设置HTML标题
  320. args_use['show_Animation'] = args.get('show_Animation', True) # 设置HTML标题
  321. args_use['show_Axis'] = bool(args.get('show_Axis', True)) # 显示坐标轴
  322. args_use['Axis_Zero'] = bool(args.get('Axis_Zero', False)) # 重叠于原点
  323. args_use['show_Axis_Scale'] = bool(args.get('show_Axis_Scale', True)) # 显示刻度
  324. args_use['x_type'] = args.get('x_type', None) # 坐标轴类型
  325. args_use['y_type'] = args.get('y_type', None)
  326. args_use['z_type'] = args.get('z_type', None)
  327. args_use['make_Line'] = args.get('make_Line', []) # 设置直线
  328. args_use['Datazoom'] = args.get('Datazoom', 'N') # 设置Datazoom
  329. args_use['show_Text'] = bool(args.get('show_Text', False)) # 显示文字
  330. #Bar设置
  331. args_use['bar_Stacking'] = bool(args.get('bar_Stacking', False)) # 堆叠(2D和3D)
  332. #散点图设置
  333. args_use['EffectScatter'] = bool(args.get('EffectScatter', True)) # 开启特效(2D和3D)
  334. args_use['symbol_Scatter'] = args.get('EffectScatter', 'circle') # 散点样式
  335. args_use['size_Scatter'] = args.get('size_Scatter', 10) # 散点图大小
  336. # 折线图设置
  337. args_use['connect_None'] = bool(args.get('connect_None', False)) # 连接None
  338. args_use['Smooth_Line'] = bool(args.get('Smooth_Line', False)) # 平滑曲线
  339. args_use['Area_chart'] = bool(args.get('Area_chart', False)) # 面积图
  340. args_use['paste_Y'] = bool(args.get('paste_Y', False)) # 紧贴Y轴
  341. args_use['step_Line'] = bool(args.get('step_Line', False)) # 阶梯式图
  342. args_use['size_PictorialBar'] = args.get('size_PictorialBar', None) # 象形柱状图大小
  343. args_use['Polar_units'] = args.get('Polar_units', '100') # 极坐标图单位制
  344. args_use['More'] = bool(args.get('More', False)) # 均绘制水球图、仪表图
  345. args_use['WordCould_Size'] = args.get('WordCould_Size', [20,100]) # 开启特效
  346. args_use['WordCould_Shape'] = args.get('WordCould_Shape', "circle") # 开启特效
  347. args_use['symbol_Graph'] = args.get('symbol_Graph', 'circle') # 关系点样式
  348. args_use['Area_radar'] = bool(args.get('symbol_Graph', True)) # 雷达图面积
  349. args_use['HTML_Type'] = args.get('HTML_Type', 1) # 雷达图面积
  350. return args_use
  351. #全局设定,返回一个全局设定的字典,解包即可使用
  352. def global_set(self,args_use,title,Min,Max,DataZoom=False,Visual_mapping=True):
  353. k = {}
  354. #标题设置
  355. if args_use['title'] == None:args_use['title'] = title
  356. k['title_opts']=opts.TitleOpts(title=args_use['title'], subtitle=args_use['vice_title'])
  357. #图例设置
  358. if not args_use['show_Legend']:k['legend_opts']=opts.LegendOpts(is_show=False)
  359. else:
  360. k['legend_opts'] = opts.LegendOpts(type_='scroll',orient=args_use['ori_Legend'],pos_bottom='2%')#移动到底部,避免和标题冲突
  361. #视觉映射
  362. if not args_use['show_Visual_mapping']:
  363. pass
  364. elif not Visual_mapping:
  365. pass
  366. else:
  367. if args_use['min_Visual_mapping'] != None:Min = args_use['min_Visual_mapping']
  368. if args_use['max_Visual_mapping'] != None:Max = args_use['max_Visual_mapping']
  369. k['visualmap_opts'] = opts.VisualMapOpts(type_= 'color'if args_use['is_color_Visual_mapping'] else 'size',
  370. max_=Max,min_=Min,range_color=args_use['color_Visual_mapping'],
  371. range_size=args_use['size_Visual_mapping'],range_text=args_use['text_Visual_mapping'],
  372. is_piecewise=args_use['is_Subsection'],pieces=args_use['Subsection_list'],
  373. orient=args_use['ori_Visual'])
  374. k['toolbox_opts']=opts.ToolboxOpts(is_show=args_use['Tool_BOX'])
  375. if DataZoom:
  376. if args_use['Datazoom'] == 'all':
  377. k['datazoom_opts'] = [opts.DataZoomOpts(), opts.DataZoomOpts(orient = "horizontal")]
  378. elif args_use['Datazoom'] == 'horizontal':
  379. k['datazoom_opts'] = opts.DataZoomOpts(type_="inside")
  380. elif args_use['Datazoom'] == 'vertical':
  381. opts.DataZoomOpts(orient="vertical")
  382. elif args_use['Datazoom'] == 'inside_vertical':
  383. opts.DataZoomOpts(type_="inside", orient="vertical")
  384. elif args_use['Datazoom'] == 'inside_vertical':
  385. opts.DataZoomOpts(type_="inside", orient="horizontal")
  386. return k
  387. def get_name(self,args_use):
  388. return f":{args_use['title']}"
  389. def initSetting(self,args_use):
  390. k = {}
  391. #设置标题
  392. if args_use['page_Title'] == '':title = 'CoTan_机器学习'
  393. else:title = f"CoTan_机器学习:{args_use['page_Title']}"
  394. k['init_opts'] = opts.InitOpts(theme=args_use['Theme'],bg_color=args_use['BG_Color'],width=args_use['width'],
  395. height=args_use['heigh'],page_title=title,
  396. animation_opts=opts.AnimationOpts(animation=args_use['show_Animation']))
  397. return k
  398. #标记符,包含线标记、点标记以及面积标记
  399. def Mark(self,args_use):
  400. k = {}
  401. line = []
  402. for i in args_use['make_Line']:
  403. try:
  404. if i[2] == 'c' or i[0] in ('min', 'max', 'average'):
  405. line.append(opts.MarkLineItem(type_=i[0], name=i[1]))
  406. elif i[2] == 'x':
  407. line.append(opts.MarkLineItem(x=i[0], name=i[1]))
  408. else:
  409. raise Exception
  410. except:
  411. line.append(opts.MarkLineItem(y=i[0], name=i[1]))
  412. if line == []:return k
  413. k['markline_opts'] = opts.MarkLineOpts(data=line)
  414. return k
  415. #坐标轴设定,输入设定的坐标轴即可
  416. def axis_Seeting(self,args_use,axis='x'):
  417. k = {}
  418. if args_use[f'{axis[0]}_type'] == 'Display' or not args_use['show_Axis']:k[f'{axis[0]}axis_opts'] = opts.AxisOpts(is_show=False)
  419. else:
  420. k[f'{axis[0]}axis_opts'] = opts.AxisOpts(type_=args_use[f'{axis[0]}_type'],axisline_opts=opts.AxisLineOpts(is_on_zero=args_use['Axis_Zero']),
  421. axistick_opts=opts.AxisTickOpts(is_show=args_use['show_Axis_Scale']))
  422. return k
  423. #标签设定,可以放在系列设置中或者坐标轴y轴设置中
  424. def Label(self,args_use):
  425. return {'label_opts':opts.LabelOpts(is_show=args_use['show_Text'])}
  426. def y_Label(self,args_use):
  427. return {'label_opts':opts.LabelOpts(is_show=args_use['show_Text'],position="inside")}
  428. #放在不同的图~.add中的设定
  429. def Per_Seeting(self,args_use,type_):#私人设定
  430. k = {}
  431. if type_ == 'Bar':#设置y的重叠
  432. if args_use['bar_Stacking']:
  433. k = {"stack":"stack1"}
  434. elif type_ == 'Scatter':
  435. k['Beautiful'] = args_use['EffectScatter']
  436. k['symbol'] = args_use['symbol_Scatter']
  437. k['symbol_size'] = args_use['size_Scatter']
  438. elif type_ == 'Line':
  439. k['is_connect_nones'] = args_use['connect_None']
  440. k['is_smooth'] = True if args_use['Smooth_Line'] or args_use['paste_Y'] else False#平滑曲线或连接y轴
  441. k['areastyle_opts']=opts.AreaStyleOpts(opacity=0.5 if args_use['Area_chart'] else 0)
  442. if args_use['step_Line']:
  443. del k['is_smooth']
  444. k['is_step'] = True
  445. elif type_ == 'PictorialBar':
  446. k['symbol_size'] = args_use['size_PictorialBar']
  447. elif type_ == 'Polar':
  448. return args_use['Polar_units']#回复的是单位制而不是设定
  449. elif type_ == 'WordCloud':
  450. k['word_size_range'] = args_use['WordCould_Size']#放到x轴
  451. k['shape'] = args_use['WordCould_Shape'] # 放到x轴
  452. elif type_ == 'Graph':
  453. k['symbol_Graph'] = args_use['symbol_Scatter']#放到x轴
  454. elif type_ == 'Radar':
  455. if args_use['Area_radar']:
  456. k['areastyle_opts']=opts.AreaStyleOpts(opacity=0.1)
  457. return k
  458. #坐标系图像:水平和垂直的数据轴:DataZoom+inside
  459. def to_Bar(self,name,text) -> Bar:#Bar:数据堆叠
  460. get = self.get_Sheet(name)
  461. x = self.get_Index(name,True).tolist()
  462. args = self.Parsing_Parameters(text)
  463. c = (
  464. Bar(**self.initSetting(args))
  465. .add_xaxis(x)
  466. )
  467. y = []
  468. for i in get.iteritems():#按列迭代
  469. q = i[1].tolist()#转换为列表
  470. try:
  471. y += q
  472. c.add_yaxis(i[0], q,**self.Per_Seeting(args,'Bar'),**self.y_Label(args))#i[0]是名字,i是tuple,其中i[1]是data
  473. except:
  474. pass
  475. c.set_global_opts(**self.global_set(args,f"{name}柱状图",min(y),max(y),True),
  476. **self.axis_Seeting(args,'y'),**self.axis_Seeting(args,'x'))
  477. c.set_series_opts(**self.Mark(args),**self.Label(args))
  478. self.R_Dic[f'{name}柱状图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  479. return c
  480. # 坐标系图像:水平和垂直的数据轴:DataZoom+inside
  481. def to_Line(self,name,text) -> Line:#折线图:连接空数据、显示数值、平滑曲线、面积图以及紧贴Y轴
  482. get = self.get_Sheet(name)
  483. x = self.get_Index(name,True).tolist()
  484. args = self.Parsing_Parameters(text)
  485. c = (
  486. Line(**self.initSetting(args))
  487. .add_xaxis(x)
  488. )
  489. y = []
  490. for i in get.iteritems():#按列迭代
  491. q = i[1].tolist()#转换为列表
  492. try:
  493. y += q#记录最大值最小值
  494. c.add_yaxis(i[0], q,**self.Per_Seeting(args,'Line'),**self.y_Label(args))#i[0]是名字,i是tuple,其中i[1]是data
  495. except:
  496. pass
  497. c.set_global_opts(**self.global_set(args, f"{name}折线图", min(y), max(y), True),
  498. **self.axis_Seeting(args, 'y'), **self.axis_Seeting(args, 'x'))
  499. c.set_series_opts(**self.Mark(args), **self.Label(args))
  500. self.R_Dic[f'{name}折线图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  501. return c
  502. # 坐标系图像:水平和垂直的数据轴:DataZoom+inside
  503. def to_Scatter(self,name,text) -> Scatter:#散点图标记形状和大小、特效、标记线
  504. get = self.get_Sheet(name)
  505. args = self.Parsing_Parameters(text)
  506. x = self.get_Index(name,True).tolist()
  507. type_ = self.Per_Seeting(args, 'Scatter')
  508. if type_['Beautiful']:Func = EffectScatter
  509. else:Func = Scatter
  510. del type_['Beautiful']
  511. c = (
  512. Func(**self.initSetting(args))
  513. .add_xaxis(x)
  514. )
  515. y = []
  516. for i in get.iteritems():#按列迭代
  517. q = i[1].tolist()#转换为列表
  518. try:
  519. y += q
  520. c.add_yaxis(i[0], q,**type_,**self.y_Label(args))#i[0]是名字,i是tuple,其中i[1]是data
  521. except:
  522. pass
  523. c.set_global_opts(**self.global_set(args, f"{name}散点图", min(y), max(y), True),
  524. **self.axis_Seeting(args, 'y'), **self.axis_Seeting(args, 'x'))
  525. c.set_series_opts(**self.Mark(args), **self.Label(args))
  526. self.R_Dic[f'{name}散点图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  527. return c
  528. # 坐标系图像:水平和垂直的数据轴:DataZoom+inside
  529. def to_Pictorialbar(self,name,text) -> PictorialBar:#象形柱状图:图形、剪裁图像、元素重复和间隔
  530. get = self.get_Sheet(name)
  531. x = self.get_Index(name, True).tolist()
  532. args = self.Parsing_Parameters(text)
  533. c = (
  534. PictorialBar(**self.initSetting(args))
  535. .add_xaxis(x)
  536. .reversal_axis()
  537. )
  538. y = []
  539. k = self.Per_Seeting(args, 'PictorialBar')
  540. for i in get.iteritems():#按列迭代
  541. q = i[1].tolist()#转换为列表
  542. try:
  543. y += q
  544. c.add_yaxis(
  545. i[0],
  546. q,
  547. label_opts=opts.LabelOpts(is_show=False),
  548. symbol_repeat=True,
  549. is_symbol_clip=True,
  550. symbol=SymbolType.ROUND_RECT,
  551. **k
  552. )
  553. except:
  554. pass
  555. c.set_global_opts(**self.global_set(args, f"{name}象形柱状图", min(y), max(y), True),
  556. **self.axis_Seeting(args, 'y'), **self.axis_Seeting(args, 'x'))
  557. c.set_series_opts(**self.Mark(args), **self.Label(args))
  558. self.R_Dic[f'{name}[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  559. return c
  560. # 坐标系图像:水平和垂直的数据轴:DataZoom+inside
  561. def to_Boxpolt(self,name,text) -> Boxplot:
  562. get = self.get_Sheet(name)
  563. args = self.Parsing_Parameters(text)
  564. c = (
  565. Boxplot(**self.initSetting(args))
  566. .add_xaxis([f'{name}'])
  567. )
  568. y = []
  569. for i in get.iteritems():#按列迭代
  570. q = i[1].tolist()#转换为列表
  571. y += q
  572. try:
  573. c.add_yaxis(i[0],[q],**self.y_Label(args))
  574. except:
  575. pass
  576. c.set_global_opts(**self.global_set(args, f"{name}箱形图", min(y), max(y), True),
  577. **self.axis_Seeting(args, 'y'), **self.axis_Seeting(args, 'x'))
  578. c.set_series_opts(**self.Mark(args))
  579. self.R_Dic[f'{name}箱形图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  580. return c
  581. # 坐标系图像:水平和垂直的数据轴:DataZoom+inside
  582. def to_HeatMap(self,name,text) -> HeatMap:#显示数据
  583. get = self.get_Sheet(name)
  584. x = self.get_Column(name, True).tolist() # 图的x轴,下侧,列名
  585. y = self.get_Index(name, True).tolist() # 图的y轴,左侧,行名
  586. value_list = []
  587. q = []
  588. for c in range(len(x)): # c-列,r-行
  589. for r in range(len(y)):
  590. try:
  591. v = float(eval(f'get.iloc[{r},{c}]')) # 先行后列
  592. except:continue
  593. q.append(v)
  594. value_list.append([c, r, v])
  595. MAX,MIN = max(q),min(q)
  596. args = self.Parsing_Parameters(text)
  597. c = (
  598. HeatMap(**self.initSetting(args))
  599. .add_xaxis(x)
  600. .add_yaxis(f'{name}', y, value_list,**self.y_Label(args))
  601. .set_global_opts(**self.global_set(args, f"{name}热力图", MIN, MAX, True),
  602. **self.axis_Seeting(args, 'y'), **self.axis_Seeting(args, 'x'))
  603. .set_series_opts(**self.Mark(args))
  604. )
  605. self.R_Dic[f'{name}热力图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  606. return c
  607. #数据哪部全,要设置More
  608. def to_Funnel(self,name,text) -> Funnel:
  609. get = self.get_Sheet(name)
  610. y_name = self.get_Index(name,True).tolist()#拿行名
  611. x = self.get_Column(name,True).tolist()[0]
  612. value = []
  613. y = []
  614. for r in range(len(y_name)):
  615. try:
  616. v = float(eval(f'get.iloc[{r},0]'))
  617. except:continue
  618. value.append([f'{y_name[r]}',v])
  619. y.append(v)
  620. args = self.Parsing_Parameters(text)
  621. c = (
  622. Funnel(**self.initSetting(args))
  623. .add(f'{name}', value)
  624. .set_global_opts(**self.global_set(args, f"{name}漏斗图", min(y), max(y), True, False))
  625. .set_series_opts(**self.Label(args))
  626. )
  627. self.R_Dic[f'{name}漏斗图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  628. return c
  629. def to_Graph(self,name,text) -> Graph:
  630. get = self.get_Sheet(name)
  631. y_name = self.get_Index(name,True).tolist()#拿行名
  632. nodes = []
  633. link = []
  634. for i in get.iterrows():#按行迭代
  635. q = i[1].tolist()#转换为列表
  636. try:
  637. nodes.append({"name": f"{i[0]}", "symbolSize": float(q[0]),"value": float(q[0])})
  638. for a in q[1:]:
  639. n = str(a).split(':')
  640. try:
  641. link.append({"source": f"{i[0]}", "target": n[0], "value":float(n[1])})
  642. except:pass
  643. except:
  644. pass
  645. if link == []:
  646. for i in nodes:
  647. for j in nodes:
  648. link.append({"source": i.get("name"), "target": j.get("name"),"value":abs(i.get("value")-j.get("value"))})
  649. args = self.Parsing_Parameters(text)
  650. c = (
  651. Graph(**self.initSetting(args))
  652. .add(f"{y_name[0]}", nodes, link, repulsion=8000,**self.y_Label(args))
  653. .set_global_opts(**self.global_set(args, f"{name}关系图", 0, 100, False,False))
  654. )
  655. self.R_Dic[f'{name}关系图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  656. return c
  657. def to_Parallel(self,name,text) -> Parallel:
  658. get = self.get_Sheet(name)
  659. dim = []
  660. dim_list = self.get_Index(name,True).tolist()
  661. for i in range(len(dim_list)):
  662. dim.append({"dim": i, "name": f"{dim_list[i]}"})
  663. args = self.Parsing_Parameters(text)
  664. c = (
  665. Parallel(**self.initSetting(args))
  666. .add_schema(dim)
  667. .set_global_opts(**self.global_set(args, f"{name}多轴图", 0, 100, False, False))
  668. )
  669. for i in get.iteritems(): # 按列迭代
  670. q = i[1].tolist() # 转换为列表
  671. c.add(f"{i[0]}",[q],**self.y_Label(args))
  672. self.R_Dic[f'{name}多轴图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  673. return c
  674. def to_Pie(self,name,text) -> Pie:
  675. get = self.get_Sheet(name)
  676. data = []
  677. for i in get.iterrows():#按行迭代
  678. try:
  679. data.append([f'{i[0]}',float(i[1].tolist()[0])])
  680. except:pass
  681. args = self.Parsing_Parameters(text)
  682. c = (
  683. Pie(**self.initSetting(args))
  684. .add(f"{name}", data,**self.Label(args))
  685. .set_global_opts(**self.global_set(args, f"{name}饼图", 0, 100, False, False))
  686. .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
  687. )
  688. self.R_Dic[f'{name}饼图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  689. return c
  690. def to_Polar(self,name,text) -> Polar:
  691. get = self.get_Sheet(name)
  692. data = []
  693. args = self.Parsing_Parameters(text)
  694. setting = self.Per_Seeting(args, 'Polar')
  695. if setting == 'rad':#弧度制
  696. D = 0.0628
  697. elif setting == '360':#角度制
  698. D = 0.36
  699. else:
  700. D = 1
  701. for i in get.iterrows():#按行迭代
  702. try:
  703. q = i[1].tolist()
  704. data.append((float(q[0]),float(q[1])/D))
  705. except:pass
  706. c = (
  707. Polar(**self.initSetting(args))
  708. .add(f"{name}", data, type_="scatter",**self.y_Label(args))
  709. .set_global_opts(**self.global_set(args, f"{name}极坐标图", 0, 100, False, False))
  710. )
  711. self.R_Dic[f'{name}极坐标图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  712. return c
  713. def to_Radar(self,name,text) -> Radar:
  714. get = self.get_Sheet(name)
  715. x = self.get_Index(name,True).tolist()
  716. Max_list = [[] for i in range(len(x))]#保存每个x栏目的最大值
  717. data = []#y的组成数据,包括name和list
  718. x_list = []#保存x的数据
  719. for i in get.iteritems(): # 按列迭代计算每一项的abcd
  720. q = i[1].tolist()
  721. add = []
  722. for a in range(len(q)):
  723. try:
  724. f = float(q[a])
  725. Max_list[a].append(f)
  726. add.append(f)
  727. except:pass
  728. data.append([f'{i[0]}',[add]])#add是包含在一个list中的
  729. for i in range(len(Max_list)):#计算x_list
  730. x_list.append(opts.RadarIndicatorItem(name=x[i], max_=max(Max_list[i])))
  731. args = self.Parsing_Parameters(text)
  732. c = (
  733. Radar(**self.initSetting(args))
  734. .add_schema(
  735. schema=x_list
  736. )
  737. .set_global_opts(**self.global_set(args, f"{name}雷达图", 0, 100, False, False))
  738. )
  739. k = self.Per_Seeting(args,'Radar')
  740. for i in data:
  741. c.add(*i,**self.y_Label(args),**k)#对i解包,取得name和data
  742. self.R_Dic[f'{name}雷达图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  743. return c
  744. def to_WordCloud(self,name,text) -> WordCloud:
  745. get = self.get_Sheet(name)
  746. data = []
  747. for i in get.iterrows(): # 按行迭代
  748. try:
  749. data.append([i[0],float(i[1].tolist()[0])])
  750. except:pass
  751. args = self.Parsing_Parameters(text)
  752. c = (
  753. WordCloud(**self.initSetting(args))
  754. .add(f"{name}", data, **self.Per_Seeting(args,'WordCloud'))
  755. .set_global_opts(**self.global_set(args, f"{name}词云", 0, 100, False, False))
  756. )
  757. self.R_Dic[f'{name}词云[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  758. return c
  759. def to_Liquid(self,name,text) -> Liquid:
  760. get = self.get_Sheet(name)
  761. data = str(get.iloc[0,0])
  762. c = data.split('.')
  763. try:
  764. data = float(f'0.{c[1]}')
  765. except:
  766. data = float(f'0.{c[0]}')
  767. args = self.Parsing_Parameters(text)
  768. c = (
  769. Liquid(**self.initSetting(args))
  770. .add(f"{name}", [data, data])
  771. .set_global_opts(title_opts=opts.TitleOpts(title=f"{name}水球图", subtitle="CoTan~机器学习"))
  772. )
  773. self.R_Dic[f'{name}水球图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  774. return c
  775. def to_Gauge(self,name,text) -> Gauge:
  776. get = self.get_Sheet(name)
  777. data = float(get.iloc[0,0])
  778. if data > 100:
  779. data = str(data/100)
  780. c = data.split('.')
  781. try:
  782. data = float(f'0.{c[1]}')*100
  783. except:
  784. data = float(f'0.{data}')*100
  785. args = self.Parsing_Parameters(text)
  786. c = (
  787. Gauge(**self.initSetting(args))
  788. .add(f"{name}", [(f"{name}", data)])
  789. .set_global_opts(title_opts=opts.TitleOpts(title=f"{name}仪表图", subtitle="CoTan~机器学习"))
  790. )
  791. self.R_Dic[f'{name}仪表图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  792. return c
  793. def to_Bar3d(self,name,text) -> Bar3D:
  794. get = self.get_Sheet(name)
  795. x = self.get_Column(name, True).tolist() # 图的x轴,下侧,列名
  796. y = self.get_Index(name, True).tolist() # 图的y轴,左侧,行名
  797. value_list = []
  798. q = []
  799. for c in range(len(x)): # c-列,r-行
  800. for r in range(len(y)):
  801. try:
  802. v = float(eval(f'get.iloc[{r},{c}]')) # 先行后列
  803. except:continue
  804. q.append(v)
  805. value_list.append([c, r, v])
  806. args = self.Parsing_Parameters(text)
  807. c = (
  808. Bar3D(**self.initSetting(args))
  809. .add(f"{name}",value_list,
  810. xaxis3d_opts=opts.Axis3DOpts(x, type_=args["x_type"]),
  811. yaxis3d_opts=opts.Axis3DOpts(y, type_=args["y_type"]),
  812. zaxis3d_opts=opts.Axis3DOpts(type_=args["z_type"]),
  813. )
  814. .set_global_opts(**self.global_set(args,f"{name}3D柱状图",min(y),max(y),True),
  815. ))
  816. if args['bar_Stacking']:c.set_series_opts(**{"stack": "stack"})#层叠
  817. self.R_Dic[f'{name}3D柱状图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  818. return c
  819. def to_Scatter3D(self,name,text) -> Scatter3D:
  820. get = self.get_Sheet(name)
  821. x = self.get_Column(name, True).tolist() # 图的x轴,下侧,列名
  822. y = self.get_Index(name, True).tolist() # 图的y轴,左侧,行名
  823. value_list = []
  824. q = []
  825. for c in range(len(x)): # c-列,r-行
  826. for r in range(len(y)):
  827. try:
  828. v = float(eval(f'get.iloc[{r},{c}]')) # 先行后列
  829. except:continue
  830. q.append(v)
  831. value_list.append([c, r, v])
  832. args = self.Parsing_Parameters(text)
  833. c = (
  834. Scatter3D(**self.initSetting(args))
  835. .add(f"{name}",value_list,
  836. xaxis3d_opts=opts.Axis3DOpts(x, type_=args["x_type"]),
  837. yaxis3d_opts=opts.Axis3DOpts(y, type_=args["y_type"]),
  838. zaxis3d_opts=opts.Axis3DOpts(type_=args["z_type"]),
  839. )
  840. .set_global_opts(**self.global_set(args,f"{name}3D散点图",min(y),max(y),True))
  841. )
  842. self.R_Dic[f'{name}3D散点图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  843. return c
  844. def to_Line3D(self,name,text) -> Line3D:
  845. get = self.get_Sheet(name)
  846. x = self.get_Column(name, True).tolist() # 图的x轴,下侧,列名
  847. y = self.get_Index(name, True).tolist() # 图的y轴,左侧,行名
  848. value_list = []
  849. q = []
  850. for c in range(len(x)): # c-列,r-行
  851. for r in range(len(y)):
  852. try:
  853. v = float(eval(f'get.iloc[{r},{c}]')) # 先行后列
  854. except:continue
  855. q.append(v)
  856. value_list.append([c, r, v])
  857. args = self.Parsing_Parameters(text)
  858. c = (
  859. Line3D(**self.initSetting(args))
  860. .add(f"{name}",value_list,
  861. xaxis3d_opts=opts.Axis3DOpts(x, type_=args["x_type"]),
  862. yaxis3d_opts=opts.Axis3DOpts(y, type_=args["y_type"]),
  863. zaxis3d_opts=opts.Axis3DOpts(type_=args["z_type"]),
  864. grid3d_opts=opts.Grid3DOpts(width=100, height=100, depth=100),
  865. )
  866. .set_global_opts(**self.global_set(args,f"{name}3D折线图",min(y),max(y),True))
  867. )
  868. self.R_Dic[f'{name}3D折线图[{len(self.R_Dic)}]{self.get_name(args)}'] = c
  869. return c
  870. def Import_c(self,text):
  871. Name = {}
  872. Name.update(locals())
  873. Name.update(globals())
  874. exec(text,Name)
  875. exec('c = Page()',Name)
  876. self.R_Dic[f'自定义图[{len(self.R_Dic)}]'] = Name['c']
  877. return Name['c']
  878. def retunr_RDic(self):
  879. return self.R_Dic.copy()
  880. def Delete_RDic(self,key):
  881. del self.R_Dic[key]
  882. def Draw_Page(self,text,Dic) -> Page:
  883. args = self.Parsing_Parameters(text)
  884. if args['page_Title'] == '':
  885. title = 'CoTan_机器学习'
  886. else:
  887. title = f"CoTan_机器学习:{args['page_Title']}"
  888. if args['HTML_Type'] == 1:
  889. page = Page(page_title=title,layout=Page.DraggablePageLayout)
  890. page.add(*self.R_Dic.values())
  891. elif args['HTML_Type'] == 2:
  892. page = Page(page_title=title, layout=Page.SimplePageLayout)
  893. page.add(*self.R_Dic.values())
  894. else:
  895. page = Tab(page_title=title)
  896. for i in self.R_Dic:
  897. page.add(self.R_Dic[i],i)
  898. page.render(Dic)
  899. return Dic
  900. def Reasonable_Type(self,name,column,dtype,wrong):
  901. get = self.get_Sheet(name).copy()
  902. for i in range(len(column)):
  903. try:
  904. column[i] = int(column[i])
  905. except:pass
  906. if dtype != '':
  907. func_Dic = {'Num':pd.to_numeric,'Date':pd.to_datetime,'Time':pd.to_timedelta}
  908. if column != []:
  909. get.iloc[:,column] = get.iloc[:,column].apply(func_Dic.get(dtype,pd.to_numeric),errors=wrong)
  910. print('A')
  911. else:
  912. get = get.apply(func_Dic.get(dtype,pd.to_numeric), errors=wrong)
  913. else:
  914. if column != []:
  915. get.iloc[:,column] = get.iloc[:,column].infer_objects()
  916. print('A')
  917. else:
  918. get = get.infer_objects()
  919. self.Add_Form(get)
  920. return get
  921. def as_Type(self,name,column,dtype,wrong):
  922. get = self.get_Sheet(name).copy()
  923. for i in range(len(column)):
  924. try:
  925. column[i] = int(column[i])
  926. except:
  927. pass
  928. func_Dic = {'Int': int, 'Float': float, 'Str':str,'Date':pd.Timestamp,'TimeDelta':pd.Timedelta}
  929. if column != []:
  930. get.iloc[:, column] = get.iloc[:, column].astype(func_Dic.get(dtype,dtype),errors=wrong)
  931. print('A')
  932. else:
  933. get = get.astype(func_Dic.get(dtype,dtype),errors=wrong)
  934. self.Add_Form(get)
  935. return get
  936. def Replace_Index(self,name,is_column,Dic,save):
  937. get = self.get_Sheet(name)
  938. if is_column:
  939. if save:#保存原数据
  940. get.loc['column'] = self.get_Column(name, True)
  941. new = get.rename(columns=Dic)
  942. else:
  943. if save:
  944. get.loc[:, 'row'] = self.get_Index(name, True)
  945. new = get.rename(index=Dic)
  946. self.Add_Form(new)
  947. return new
  948. def Change_Index(self,name:str,is_column:bool,iloc:int,save:bool=True,drop:bool=False):
  949. get = self.get_Sheet(name).copy()
  950. if is_column:#列名
  951. Col = self.get_Column(name, True)
  952. t = Col.tolist()[slice(iloc,iloc+1)]
  953. if save:#保存原数据
  954. get.loc['column'] = Col
  955. get.columns = get.loc[t].values[0] #调整 loc[t]取行数据,否则为DataFrame,不可做为Index
  956. if drop:
  957. get.drop(t,axis=0,inplace=True)#删除行
  958. else:
  959. Row = self.get_Index(name, True)
  960. t = Row.tolist()[slice(iloc, iloc + 1)]
  961. if save:
  962. get.loc[:, 'row'] = Row
  963. new_index_list = get.loc[:,t].values
  964. new_index = []
  965. for i in new_index_list:
  966. new_index.append(i[0])
  967. print(new_index)
  968. get.index = new_index # 调整
  969. if drop:
  970. get.drop(t,axis=1,inplace=True)#删除行
  971. self.Add_Form(get)
  972. return get
  973. def num_toName(self,name,is_column,save):
  974. get = self.get_Sheet(name).copy()
  975. if is_column:#处理列名
  976. Col = self.get_Column(name,True)
  977. if save:#保存原数据
  978. get.loc['column'] = Col
  979. get.columns = [i for i in range(len(Col))]
  980. else:
  981. Row = self.get_Index(name,True)
  982. if save:
  983. get.loc[:, 'row'] = Row
  984. get.index = [i for i in range(len(Row))]
  985. self.Add_Form(get)
  986. return get
  987. def num_withName(self,name,is_column,save):
  988. get = self.get_Sheet(name).copy()
  989. if is_column:#处理列名
  990. Col = self.get_Column(name,True)
  991. if save:#保存原数据
  992. get.loc['column'] = Col
  993. get.columns = [f'[{i}]{Col[i]}' for i in range(len(Col))]
  994. else:
  995. Row = self.get_Index(name,True)
  996. if save:
  997. get.loc[:, 'row'] = Row
  998. get.index = [f'[{i}]{Row[i]}' for i in range(len(Row))]
  999. self.Add_Form(get)
  1000. return get
  1001. def Date_Index(self,name,is_column,save,**Date_Init):
  1002. #Date_Init:start,end,freq 任意两样
  1003. get = self.get_Sheet(name)
  1004. if is_column: # 处理列名
  1005. Col = self.get_Column(name, True)
  1006. if save: # 保存原数据
  1007. get.loc['column'] = Col
  1008. Date_Init['periods'] = len(Col)
  1009. get.columns = pd.date_range(**Date_Init)
  1010. else:
  1011. Row = self.get_Index(name, True)
  1012. if save:
  1013. get.loc[:, 'row'] = Row
  1014. Date_Init['periods'] = len(Row)
  1015. get.index = pd.date_range(**Date_Init)
  1016. self.Add_Form(get)
  1017. return get
  1018. def Time_Index(self,name,is_column,save,**Time_Init):
  1019. #Date_Init:start,end,freq 任意两样
  1020. get = self.get_Sheet(name)
  1021. if is_column: # 处理列名
  1022. Col = self.get_Column(name, True)
  1023. if save: # 保存原数据
  1024. get.loc['column'] = Col
  1025. Time_Init['periods'] = len(Col)
  1026. get.columns = pd.timedelta_range(**Time_Init)
  1027. else:
  1028. Row = self.get_Index(name, True)
  1029. if save:
  1030. get.loc[:, 'row'] = Row
  1031. Time_Init['periods'] = len(Row)
  1032. get.index = pd.timedelta_range(**Time_Init)
  1033. self.Add_Form(get)
  1034. return get