def create_result_chart(data): instrulist = list(set(d.instrument for d in data)) # x = ["{} P{}".format(localtime(d.upload_time).strftime("%Y-%m-%d %X"), d.platenum) for d in data] x = ["{} P{}".format(d.upload_time.strftime("%Y-%m-%d %X"), d.platenum) for d in data] # 均值直方图 b = Bar(init_opts=opts.InitOpts(width='1900px')) b.add_xaxis(x) for instru in instrulist: mean = get_mean(data, instru) b.add_yaxis(instru, mean) b.set_global_opts(title_opts=opts.TitleOpts(title="结果mean图")) # sd折线图 l = Line(init_opts=opts.InitOpts(width='1900px')) l.add_xaxis(x) for instru in instrulist: sd = get_sd(data, instru) l.add_yaxis(instru, sd, is_connect_nones=True) l.set_global_opts(title_opts=opts.TitleOpts(title="结果sd图", pos_top='48%')) grid = Grid(init_opts=opts.InitOpts(width='1900px')) grid.add(b, grid_opts=opts.GridOpts(pos_bottom='60%')) grid.add(l, grid_opts=opts.GridOpts(pos_top='60%')) return grid
def draw(self, symbol, fn_render): fn = get_dss() +'fut/bar/day_' + symbol + '.csv' df = pd.read_csv(fn) df1 = df.loc[:,['date','time','close']] n = 30 close_list = df.apply(lambda record: float(record['close']), axis=1).tolist() close_list = np.array(close_list) ma_arr = talib.SMA(close_list, n) df['ma'] = ma_arr df['close'] = df['close'] - df['ma'] df2 = df.loc[:,['date','time','close']] line1 = self.gen_line_one(df1, symbol) line2 = self.gen_line_two(df2) grid_chart = Grid( init_opts=opts.InitOpts( width="1300px", height="700px", #animation_opts=opts.AnimationOpts(animation=False), ) ) grid_chart.add( line1, grid_opts=opts.GridOpts(pos_left="5%", pos_right="3%", height="39%"), ) grid_chart.add( line2, grid_opts=opts.GridOpts( pos_left="5%", pos_right="3%", pos_top="53%", height="39%" ), ) grid_chart.render(fn_render)
def html_output(self, order, view, mode): """ output function of html Args: order(int): diversified_ranking use different order view(View): view object mode(str): single or multiple Returns: None """ instance = self.instance data = {} data['order'] = order data['chartname'] = instance.table_name data['describe'] = view.table.describe data['x_name'] = view.fx.name data['y_name'] = view.fy.name data['chart'] = Chart.chart[view.chart] data['classify'] = [v[0] for v in view.table.classes] data['x_data'] = view.X data['y_data'] = view.Y data['title_top'] = 5 [chart, filename] = self.html_handle(data) grid = Grid() grid.add(chart, grid_opts=opts.GridOpts(pos_bottom='20%', pos_top='20%')) if mode == 'single': self.page.add(grid) #the grid is added in the same page elif mode == 'multiple': grid.render('./html/' + self.table_name + '/' + filename) #the grid is added in a new file
def grid(factor, factor2, instrument): gridchart = Grid(init_opts=opts.InitOpts(width="100vw", height="50vh", animation_opts=opts.AnimationOpts( animation=True))) gridchart.add( #左边画最新数据 getplot(factor, factor2, kdata_part, nnv, new_p, instrument, xaxis_index=[0, 1]), grid_opts=opts.GridOpts(pos_left="5%", pos_right="68%")) gridchart.add( # 右边画全样本数据 getplot(factor, factor2, kdata_all, nv, new_a, instrument, xaxis_index=None), grid_opts=opts.GridOpts(pos_left="40%", pos_right="5%")) return gridchart
def KlinePlotting(target_file): global trend_punishment res = pickle.load(open(target_file, 'rb')) c = (Line().add_xaxis([item[0] for item in res]).add_yaxis( "打分", [item[1] for item in res], linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), ).set_global_opts( title_opts=opts.TitleOpts(title="打分"), xaxis_opts=opts.AxisOpts(type_="category"), datazoom_opts=[ opts.DataZoomOpts( type_="slider", xaxis_index=[0], range_start=80, range_end=100, ) ], tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000"), ), )) gridChart = Grid(init_opts=opts.InitOpts(width="1000px", height="500px", animation_opts=opts.AnimationOpts( animation=False))) gridChart.add(c, grid_opts=opts.GridOpts(pos_left="10%", pos_right="10%")) gridChart.render("score_modified_plot_new_0.002.html")
def draw(self, symbol, fn_render): fn = get_dss() + 'fut/bar/day_' + symbol + '.csv' df1 = pd.read_csv(fn) # print(df1.head()) price_min = int(df1.close.min() * 0.99) price_max = df1.close.max() kline = self.gen_kline(df1, symbol) line_cci = self.gen_cci(df1, 100) grid_chart = Grid(init_opts=opts.InitOpts( width="1390px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="60%"), ) grid_chart.add( line_cci, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="75%", height="17%"), ) grid_chart.render(fn_render)
def base_kline_grid_chart(df, signal_infos=[]): """ 最最最基础的 K 线图,传入的 df 只需要有 open high low close volume 即可绘制 """ # OHLC kline_chart = ohlc_kline_chart(df, signal_infos=signal_infos) # Volume volume_chart = volume_bar_chart(df) # 把 ohlc 和 volume 图组合起来 grid_chart = Grid(init_opts=opts.InitOpts( width="1000px", height="800px", bg_color="#ffffff", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( kline_chart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="55%"), ) grid_chart.add( volume_chart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="70%", height="15%"), ) return grid_chart
def draw_charts(fn1, fn2): df1 = pd.read_csv(fn1) df1['datetime'] = df1['date'] + ' ' + df1['time'] #print(df1.head()) kline1 = gen_kline_one(df1) df2 = pd.read_csv(fn2) df2['datetime'] = df2['date'] + ' ' + df2['time'] #print(df1.head()) kline2 = gen_kline_two(df2) grid_chart = Grid( init_opts=opts.InitOpts( width="1300px", height="700px", #animation_opts=opts.AnimationOpts(animation=False), ) ) grid_chart.add( kline1, grid_opts=opts.GridOpts(pos_left="5%", pos_right="3%", height="39%"), ) grid_chart.add( kline2, grid_opts=opts.GridOpts( pos_left="3%", pos_right="5%", pos_top="53%", height="39%" ), ) fn = get_dss( ) + 'backtest/render/bar2.html' grid_chart.render(fn)
def grid(self, data=[]): grid = Grid(init_opts=opts.InitOpts(**self.chart_opt)) for d in data: grid.add( d["chart"], grid_opts=opts.GridOpts(**d["setting"]), ) return grid
def workarea_salary_chart(df): # 转换类型为浮点型 df.low_salary, df.high_salary = df.low_salary.astype( float), df.high_salary.astype(float) # 分别求各地区平均最高薪资, 平均最低薪资 salary = df.groupby('workarea', as_index=False)[['low_salary', 'high_salary' ]].mean() # 分别求各地区的岗位数量,并降序排列 print(salary) workarea = df.groupby('workarea', as_index=False)['name'].count().sort_values( 'name', ascending=False) print(workarea) workarea = pd.merge(workarea, salary, how='left', on='workarea') # 合并数据表 print(workarea) workarea = workarea.head(20) # 用前20名进行绘图 grid = Grid() bar = Bar() grid.theme = themes line = Line() line1 = Line() bar.add_xaxis(workarea.workarea.tolist()) bar.add_yaxis("岗位需求量", workarea.name.tolist()) bar.set_global_opts( title_opts=opts.TitleOpts( title="岗位需求量排名前20地区的平均薪资水平状况", title_link='./chart/workarea_salary_chart.html', title_target='blank', pos_left='left', ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross", is_show=True), # 交叉指向工具 legend_opts=opts.LegendOpts(pos_left="80%", orient="vertical", pos_top="3%"), ) # bar.set_series_opts(is_show=True, position='rightTop') print((workarea.name).tolist()) print((round(workarea.high_salary * 1000)).tolist()) # 在bar上增加Y轴,在line图上选择对应的轴向 line.add_xaxis(workarea.workarea.tolist()) line.add_yaxis("平均最高薪资", (round(workarea.high_salary * 1000)).tolist(), yaxis_index=0) line1.add_xaxis(workarea.workarea.tolist()) line1.add_yaxis("平均最低薪资", (round(workarea.low_salary * 1000)).tolist(), yaxis_index=0) # 把line添加到bar上 bar.overlap(line) bar.overlap(line1) # 这里如果不需要grid也可以,直接设置bar的格式,然后显示bar即可 #bar.render_notebook() grid.add(chart=bar, grid_opts=opts.GridOpts(), is_control_axis_index=True) # grid.render("./chart/workarea_salary_chart.html") return grid
def draw_charts(): pz = 'CF' vtSymbol = 'CF' fn = get_dss() + 'backtest/fut/' + pz + '/day_' + vtSymbol + '.csv' df1 = pd.read_csv(fn) # df1 = df1[df1.date >= '2019-01-20'] #df1['datetime'] = df1['date'] + ' ' + df1['time'] df1['datetime'] = df1['date'] price_min = int(df1.close.min() * 0.99) price_max = df1.close.max() #fn = get_dss( )+ 'fut/engine/aberration_raw/signal_aberration_raw_duo_deal_CF.csv' #fn = get_dss( )+ 'fut/engine/aberration_raw/signal_aberration_raw_kong_deal_CF.csv' fn = get_dss( ) + 'fut/engine/aberration_enhance/signal_aberration_enhance_duo_deal_CF.csv' #fn = get_dss( )+ 'fut/engine/aberration_enhance/signal_aberration_enhance_kong_deal_CF.csv' df2 = pd.read_csv(fn) dt_list = df2['datetime'].tolist() dt_list = [dt[:10] for dt in dt_list] # print(dt_list) df2['datetime'] = dt_list line = gen_line(df1, vtSymbol, price_min, price_max) line_atr = gen_atr(df1, 10) line_boll = gen_boll(df1, 10, 2) line = line.overlap(line_boll) scatter_open = gen_poit_open(df2) scatter_close = gen_poit_close(df2) line = line.overlap(scatter_open) line = line.overlap(scatter_close) grid_chart = Grid(init_opts=opts.InitOpts( width="1300px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( line, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="60%"), ) grid_chart.add( line_atr, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="76%", height="17%"), ) fn = get_dss() + 'backtest/render/k_deal_aberration_' + vtSymbol + '.html' grid_chart.render(fn)
def to_single_html(self): if len(self.charts) == 0: self.generate_views() page = Page() self.page = Page() for chart in self.charts: grid = Grid() grid.add(chart, grid_opts=opts.GridOpts(pos_bottom='20%', pos_top='20%')) self.page.add(grid) self.page.render(self.charts_dir + self.name + '.html')
def draw_charts(): # #fn = get_dss() +'backtest/fut/m/' + 'm_01_05.csv' # fn = get_dss() +'backtest/fut/m/' + 'day_m.csv' # df1 = pd.read_csv(fn) # df1['datetime'] = df1['date'] + ' ' + df1['time'] # #print(df1.head()) # kline1 = gen_kline_one(df1) # # fn = get_dss() +'backtest/fut/y/' + 'day_y.csv' # df2 = pd.read_csv(fn) # df2['datetime'] = df2['date'] + ' ' + df2['time'] # #print(df1.head()) # kline2 = gen_kline_two(df2) #-------------------------------------------------------------------------- fn = 'bar_kamaresid_raw_duo_CF.csv' fn = 'bar_kamaresid_raw_duo_m.csv' df = pd.read_csv(fn) df.columns = ['date','time','close','q1','q2','resid'] df1 = df.loc[:,['date','time','close']] df2 = df.loc[:,['date','time','resid']] df2['close'] = df2['resid'] print(df1.head(3)) print(df2.head(3)) s1 = 'close' s2 = 'resid' line1 = gen_line_one(df1) line2 = gen_line_two(df2) grid_chart = Grid( init_opts=opts.InitOpts( width="1300px", height="700px", #animation_opts=opts.AnimationOpts(animation=False), ) ) grid_chart.add( line1, grid_opts=opts.GridOpts(pos_left="5%", pos_right="3%", height="39%"), ) grid_chart.add( line2, grid_opts=opts.GridOpts( pos_left="5%", pos_right="3%", pos_top="53%", height="39%" ), ) fn = get_dss( )+ 'backtest/render/k_k_' + s1 + '_' + s2 + '.html' grid_chart.render(fn)
def bar_base(self) -> Bar: start = datetime.datetime.now() dispose_unit = [] done = [] undo = [] count_dispose_unit = 30 event_counts = Event.objects.filter(Q(achieve=1)).values('dispose_unit').annotate(count=Count('dispose_unit')).values('dispose_unit', 'count').order_by('-count') event_counts = list(event_counts) sum_of_done = 0 sum_of_undo = 0 # print(len(event_counts)) # print(event_counts) for i in range(0,count_dispose_unit): undo_event = Event.objects.filter(Q(achieve=3) & Q(dispose_unit = event_counts[i]['dispose_unit'])) undo_event_num = len(undo_event) dispose_unit_name = DisposeUnit.objects.filter(id=event_counts[i]['dispose_unit']).values("name")[0]['name'] dispose_unit.append(dispose_unit_name) done.append(event_counts[i]['count']) undo.append(undo_event_num) for i in range(count_dispose_unit,len(event_counts)): undo_event = Event.objects.filter(Q(achieve=3) & Q(dispose_unit=event_counts[i]['dispose_unit'])) undo_event_num = len(undo_event) sum_of_done = sum_of_done + event_counts[i]['count'] sum_of_undo = sum_of_undo + undo_event_num other_unit_num = len(event_counts) - count_dispose_unit dispose_unit.append("其他"+str(other_unit_num)+"个部门总和") done.append(sum_of_done) undo.append(sum_of_undo) c = ( Bar() .add_xaxis(dispose_unit) .add_yaxis("按期完成", done, stack="stack1",category_gap="60%") .add_yaxis("逾期完成", undo, stack="stack1",category_gap="60%") .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), title_opts=opts.TitleOpts(title="处理事件最多的部门"), datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], ) ) grid = Grid() grid.add(c, grid_opts=opts.GridOpts(pos_bottom="20%")) c = grid.dump_options_with_quotes() end = datetime.datetime.now() print("Bar: " + str(end - start)) return c
def weak_user(title): all_day = parse_day(7) x_data = [str(i.day) + '日' for i in all_day] y_data = [get_long(i) for i in all_day] bar = (Bar(init_opts=opts.InitOpts( theme=ThemeType.DARK, width="1400px", height='1000px')).add_xaxis(x_data).add_yaxis( "增长用户", [i[1] for i in y_data], yaxis_index=0, color="#d14a61", ).extend_axis(yaxis=opts.AxisOpts( type_="value", name="活跃用户", min_=0, max_=max([i[0] for i in y_data]), position="left", axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts( color="#675bba")), axislabel_opts=opts.LabelOpts(formatter="{value} 人"), splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)), )).set_global_opts( yaxis_opts=opts.AxisOpts( name="增长用户", type_="value", min_=0, max_=max([i[1] for i in y_data]), position="right", offset=80, axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(color="#5793f3")), axislabel_opts=opts.LabelOpts(formatter="{value} 人"), ), title_opts=opts.TitleOpts(title=title), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), )) line = (Line(init_opts=opts.InitOpts( theme=ThemeType.DARK, width="1400px", height='1000px')).add_xaxis( x_data).add_yaxis( "活跃用户", [i[0] for i in y_data], yaxis_index=1, color="#675bba", label_opts=opts.LabelOpts(is_show=False), )) bar.overlap(line) grid = Grid(init_opts=opts.InitOpts( theme=ThemeType.DARK, width="1400px", height='1000px')) grid.add(bar, opts.GridOpts(), is_control_axis_index=True) return grid
def grid(self): line = Line('折线图', width=1200) attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] line.add('最高气温', attr, [11, 12, 14, 11, 12, 15, 16], mark_point=['max', 'min'], \ mark_line=['average']) line.add('最低气温', attr, [1, -1, 2, 5, 2, 3, 0], mark_point=['max', 'min'], \ mark_line=['average'], legend_pos='20%') attr = ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'] v1 = [11, 12, 14, 10, 11, 10] pie = Pie('饼图', title_pos='55%') pie.add('', attr, v1, radius=[45, 65], center=[65, 50], legend_pos='80%', \ legend_orient='vertical') grid = Grid() grid.add(line, grid_right='55%') grid.add(pie, grid_left='60%')
def makechart(sumary,day,shdeath,shcured,shsum,shpending,newconfirmed,newpending): title = "上海新型冠状病毒统计" grid_chart = Grid() grid_chart.add( total_trend(day,shdeath,shcured,shsum,shpending), grid_opts=GridOpts(height="57%") ) grid_chart.add( new_trend(day,newconfirmed,newpending), grid_opts=GridOpts(pos_top="75%",) ) page = Page(page_title=title) page.add( grid_chart, # calendar_base(), map_visualmap(sumary), ) page.render(outfile)
def to_treemap(data, proj, version): complexity = {'name': f'{proj}-{version}', 'children': []} extract(complexity, 'complexity', data) maintainability = {'name': f'{proj}-{version}', 'children': []} extract(maintainability, 'maintainability', data) testability = {'name': f'{proj}-{version}', 'children': []} extract(testability, 'testability', data) readability = {'name': f'{proj}-{version}', 'children': []} extract(readability, 'readability', data) reusability = {'name': f'{proj}-{version}', 'children': []} extract(reusability, 'reusability', data) inheritance = {'name': f'{proj}-{version}', 'children': []} extract(inheritance, 'inheritance', data) treemap = TreeMap() for indicator in [ 'complexity', 'maintainability', 'testability', 'readability', 'reusability', 'inheritance' ]: treemap = treemap.add(series_name=indicator, data=[locals()[indicator]], leaf_depth=2, roam=False, label_opts=opts.LabelOpts(position='inside')) treemap = (treemap.set_global_opts( tooltip_opts=opts.TooltipOpts(formatter='{b}<br/>{a}: {c}'), toolbox_opts=opts.ToolboxOpts(feature=opts.ToolBoxFeatureOpts( magic_type=opts.ToolBoxFeatureMagicTypeOpts(is_show=False), data_zoom=opts.ToolBoxFeatureDataZoomOpts(is_show=False), brush=opts.ToolBoxFeatureBrushOpts(type_='clear'))), legend_opts=opts.LegendOpts(is_show=True, selected_mode='single', pos_top='7%', orient='horizontal', padding=0), title_opts=opts.TitleOpts( title=f'Code Quality Treemap of {proj}-{version}', pos_left='center'))) grid = Grid() grid.add(treemap, grid_opts=opts.GridOpts(pos_top='100%')) return grid
def margin_chart(chart: pyecharts.charts.chart.Chart, margin: list = []) -> Grid: """ Description: 1. Arange `chart` in a grid to set the margin Params: chart margin: [top, left, bottom, right] Return: grid """ margin = margin or [0, 0, 0, 0] grid = Grid() grid.add(chart, grid_opts=opts.GridOpts(pos_top=margin[0] or None, pos_left=margin[1] or None, pos_bottom=margin[2] or None, pos_right=margin[3] or None)) return grid
def to_linechart(data, proj): versions = [version['version_name'] for version in data] linechart = Line().add_xaxis(xaxis_data=versions) for indicator in [ 'complexity', 'maintainability', 'testability', 'readability', 'reusability', 'inheritance' ]: linechart = linechart.add_yaxis( series_name=indicator, y_axis=[round(version[indicator], 2) for version in data], is_smooth=True, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=2), ) linechart = (linechart.set_global_opts( tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), xaxis_opts=opts.AxisOpts(boundary_gap=False), yaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(formatter="{value}"), splitline_opts=opts.SplitLineOpts(is_show=True), ), toolbox_opts=opts.ToolboxOpts(feature=opts.ToolBoxFeatureOpts( magic_type=opts.ToolBoxFeatureMagicTypeOpts(is_show=False), data_zoom=opts.ToolBoxFeatureDataZoomOpts(is_show=False), brush=opts.ToolBoxFeatureBrushOpts(type_='clear'))), legend_opts=opts.LegendOpts(is_show=True, pos_top='middle', pos_left='1%', orient='vertical', padding=0), datazoom_opts=opts.DataZoomOpts(type_='slider', range_start=0, range_end=100), title_opts=opts.TitleOpts(title=f'Code Quality Linechart of {proj}', pos_left='center'))) grid = Grid() grid.add(linechart, grid_opts=opts.GridOpts(pos_left='150')) return grid
def bolling_backtest_grid_chart(df): """完整布林线回测图,传入的 df 需要有 open high low close volume upper median lower signal equity_curve 即可绘制 """ # 布林线的 OHLC 图 kline_chart = bolling_kline_chart(df, 3) # 这里要控制3个轴同时缩放 # Volume volume_chart = volume_bar_chart(df) # 资金曲线 equity_chart = equity_line_chart(df) # 组合起来 grid_chart = Grid(init_opts=opts.InitOpts( width="1000px", height="800px", bg_color="#ffffff", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( kline_chart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="40%"), ) grid_chart.add( volume_chart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="55%", height="10%"), ) grid_chart.add( equity_chart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="75%", height="10%"), ) return grid_chart
def drawChart(self, data=None, ma=None, vol=None, blist=None, slist=None, positlist=None): koverlap = self.kline(data=data, blist=blist, slist=slist, positlist=positlist) datazoom = [ opts.DataZoomOpts( pos_bottom="0px", range_start=50.0, range_end=100.00, ) ] koverlap.set_global_opts( xaxis_opts=opts.AxisOpts(is_scale=True), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), datazoom_opts=datazoom, title_opts=opts.TitleOpts(title="eeeee"), ) grid = Grid(init_opts=opts.InitOpts()) if koverlap != None: grid.add( koverlap, grid_opts=opts.GridOpts(pos_top="5%"), ) return grid
def gen_grid_chart( overlap_kline_line: Kline, width: str, height: str, bar_plot_list: typing.List[Bar], filename: str, ) -> Grid: index = 0 grid_chart = Grid(init_opts=opts.InitOpts( width=width, height=height, animation_opts=opts.AnimationOpts(animation=False), )) pos_top_list, height_list = gen_pos_top_height(plot_list=bar_plot_list) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top=f"{pos_top_list[index]}%", height=f"{height_list[index]}%", ), ) index += 1 bar_plot_list = filter_bar_plot(bar_plot_list) for bar_plot in bar_plot_list: grid_chart.add( bar_plot, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top=f"{pos_top_list[index]}%", height=f"{height_list[index]}%", ), ) index += 1 grid_chart.render(filename) return grid_chart
def makechart(data, debug=False): day, shsum, shpending, shcured, shdeath, shsum_date, new_date, newconfirmed, newpending = data_process( data) title = "上海新型冠状病毒统计" grid_chart = Grid() grid_chart.add(total_trend(day, shdeath, shcured, shsum, shpending), grid_opts=GridOpts(height="57%")) grid_chart.add(new_trend(day, newconfirmed, newpending), grid_opts=GridOpts(pos_top="75%", )) bk = bkey() if debug: ak = bk.ak_dev else: ak = bk.ak_web get_detail() with open(shsumary, 'r', encoding='utf-8') as f: j = json.loads(f.read()) sumary = [(k, j[k]) for k in j.keys()] tab = Tab(page_title=title) tab.add(grid_chart, "趋势") tab.add(map_visualmap(sumary), "区县分布") tab.add(bmap_base(BAIDU_AK=ak), '详细地图') tab.render(outfile)
def ice_ga_shrinkage_chart(df): """ice ga shrinkage""" os_ma = pyecharts_float_values_data(df, 'os_ma', 6) # 信号信息 signal_infos = bolling_signals_data(df) # k 线 ohlc_chart = ohlc_kline_chart(df, x_axis_count=3, signal_infos=signal_infos) # os_ma os_ma_line = Line().add_xaxis( xaxis_data=pyecharts_time_data(df)).add_yaxis( y_axis=os_ma, series_name='os_ma', is_symbol_show=False, label_opts=None, is_smooth=True, ) # 资金曲线 equity_chart = equity_line_chart(df) grid_chart = Grid(init_opts=opts.InitOpts( width="1000px", height="600px", bg_color="#ffffff", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( ohlc_chart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="5%", height="30%"), ) grid_chart.add( os_ma_line, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="40%", height="20%"), ) grid_chart.add( equity_chart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="70%", height="18%"), ) return grid_chart
def draw_charts(): vtSymbol = 'CF005' fn = get_dss() + 'fut/bar/min5_' + vtSymbol + '.csv' df1 = pd.read_csv(fn) df1 = df1[df1.date >= '2019-11-20'] df1['datetime'] = df1['date'] + ' ' + df1['time'] # print(df1.head()) fn = get_dss() + 'fut/engine/rsiboll/signal_rsiboll_duo_deal_CF.csv' df2 = pd.read_csv(fn) kline = gen_kline(df1) line_rsi = gen_rsi(df1) line_atr = gen_atr(df1) scatter_deal_one = gen_poit_one(df2) scatter_deal_two = gen_poit_two(df2) scatter_deal_three = gen_poit_three(df2) kline_scatter = kline.overlap(scatter_deal_one) kline_scatter = kline_scatter.overlap(scatter_deal_two) kline_scatter = kline_scatter.overlap(scatter_deal_three) grid_chart = Grid(init_opts=opts.InitOpts( width="1000px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( kline_scatter, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="45%"), ) grid_chart.add( line_rsi, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="57%", height="17%"), ) grid_chart.add( line_atr, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="76%", height="17%"), ) grid_chart.render("k_deal_rsi_atr.html")
def draw_charts(): vtSymbol = 'm' fn = get_dss() + 'backtest/fut/m/day_' + vtSymbol + '.csv' df1 = pd.read_csv(fn) #df1 = df1[df1.date >= '2019-10-12'] df1['datetime'] = df1['date'] + ' ' + df1['time'] # print(df1.head()) kline = gen_kline(df1) line_rsi = gen_rsi(df1) line_atr = gen_atr(df1) grid_chart = Grid(init_opts=opts.InitOpts( width="1500px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="3%", pos_right="8%", height="45%"), ) grid_chart.add( line_rsi, grid_opts=opts.GridOpts(pos_left="3%", pos_right="8%", pos_top="57%", height="17%"), ) grid_chart.add( line_atr, grid_opts=opts.GridOpts(pos_left="3%", pos_right="8%", pos_top="76%", height="17%"), ) fn = get_dss() + 'backtest/render/bar_ti_ti.html' grid_chart.render(fn)
def kline_pro(kline: List[dict], fx: List[dict] = None, xd=None, bs: List[dict] = None, title: str = "缠中说禅K线分析", width: str = "1400px", height: str = '580px') -> Grid: """绘制缠中说禅K线分析结果 :param kline: K线 :param fx: 分型识别结果 :param bi: 笔识别结果 :param xd: 线段识别结果 :param zs: 中枢 :param bs: 买卖点 :param title: 图表标题 :param width: 图表宽度 :param height: 图表高度 :return: 用Grid组合好的图表 """ # 配置项设置 # ------------------------------------------------------------------------------------------------------------------ bg_color = "#1f212d" # 背景 up_color = "#F9293E" down_color = "#00aa3b" init_opts = opts.InitOpts(bg_color=bg_color, width=width, height=height, animation_opts=opts.AnimationOpts(False)) title_opts = opts.TitleOpts( title=title, pos_top="1%", title_textstyle_opts=opts.TextStyleOpts(color=up_color, font_size=20), subtitle_textstyle_opts=opts.TextStyleOpts(color=down_color, font_size=12)) label_not_show_opts = opts.LabelOpts(is_show=False) legend_not_show_opts = opts.LegendOpts(is_show=False) red_item_style = opts.ItemStyleOpts(color=up_color) green_item_style = opts.ItemStyleOpts(color=down_color) k_style_opts = opts.ItemStyleOpts(color=up_color, color0=down_color, border_color=up_color, border_color0=down_color, opacity=0.8) legend_opts = opts.LegendOpts(is_show=True, pos_top="1%", pos_left="30%", item_width=14, item_height=8, textstyle_opts=opts.TextStyleOpts( font_size=12, color="#0e99e2")) brush_opts = opts.BrushOpts(tool_box=["rect", "polygon", "keep", "clear"], x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX") axis_pointer_opts = opts.AxisPointerOpts(is_show=True, link=[{ "xAxisIndex": "all" }]) range_start = int(100 - 216 / len(kline) * 100) dz_inside = opts.DataZoomOpts(False, "inside", xaxis_index=[0, 1, 2], range_start=range_start, range_end=100) dz_slider = opts.DataZoomOpts(True, "slider", xaxis_index=[0, 1, 2], pos_top="96%", pos_bottom="0%", range_start=range_start, range_end=100) yaxis_opts = opts.AxisOpts(is_scale=True, axislabel_opts=opts.LabelOpts( color="#c7c7c7", font_size=8, position="inside")) grid0_xaxis_opts = opts.AxisOpts( type_="category", grid_index=0, axislabel_opts=label_not_show_opts, split_number=20, min_="dataMin", max_="dataMax", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False)) tool_tip_opts = opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", position=JsCode(""" function (pos, params, el, elRect, size) { var obj = {top: 10}; obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30; return obj; } """), textstyle_opts=opts.TextStyleOpts(color="#000"), ) # 数据预处理 # ------------------------------------------------------------------------------------------------------------------ # dts = [x.get('dt', x['date']) for x in kline] try: dts = [x['date'] for x in kline] except: dts = [x['dt'] for x in kline] # k_data = [[x['open'], x['close'], x['low'], x['high']] for x in kline] k_data = [ opts.CandleStickItem( name=i, value=[x['open'], x['close'], x['low'], x['high']]) for i, x in enumerate(kline) ] vol = [] for i, row in enumerate(kline): item_style = red_item_style if row['close'] > row[ 'open'] else green_item_style bar = opts.BarItem(name=i, value=row['volume'], itemstyle_opts=item_style, label_opts=label_not_show_opts) vol.append(bar) close = np.array([x['close'] for x in kline], dtype=np.double) diff, dea, macd = MACD(close) ma5 = SMA(close, timeperiod=5) ma34 = SMA(close, timeperiod=34) ma55 = SMA(close, timeperiod=55) ma233 = SMA(close, timeperiod=233) macd_bar = [] for i, v in enumerate(macd.tolist()): item_style = red_item_style if v > 0 else green_item_style bar = opts.BarItem(name=i, value=round(v, 4), itemstyle_opts=item_style, label_opts=label_not_show_opts) macd_bar.append(bar) diff = diff.round(4) dea = dea.round(4) # K 线主图 # ------------------------------------------------------------------------------------------------------------------ chart_k = Kline() chart_k.add_xaxis(xaxis_data=dts) chart_k.add_yaxis(series_name="Kline", y_axis=k_data, itemstyle_opts=k_style_opts) chart_k.set_global_opts(legend_opts=legend_opts, datazoom_opts=[dz_inside, dz_slider], yaxis_opts=yaxis_opts, tooltip_opts=tool_tip_opts, axispointer_opts=axis_pointer_opts, brush_opts=brush_opts, title_opts=title_opts, xaxis_opts=grid0_xaxis_opts) if xd: index = 0 zs_colors = [ "yellow", "white", '#f034c1', "#7944b7", "#468b58", "#c17f2f", "#9EA0A1" ] data = [] temp_xd = xd while temp_xd: zs_color = zs_colors[index % len(zs_colors)] data = data + [ opts.MarkAreaItem( name='XD{}'.format(index), x=(x['xd_list'][0]['date'], x['xd_list'][-1]['date']), y=(x['ZG']['value'], x['ZD']['value']), label_opts=opts.LabelOpts(color=zs_color), itemstyle_opts=opts.ItemStyleOpts( color=zs_color, opacity=0.2, )) for x in temp_xd.zs_list ] temp_xd = temp_xd.next index = index + 1 chart_k.set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True, data=data)) # 均线图 # ------------------------------------------------------------------------------------------------------------------ chart_ma = Line() chart_ma.add_xaxis(xaxis_data=dts) ma_keys = {"MA5": ma5, "MA34": ma34, "MA55": ma55, "MA233": ma233} ma_colors = ["#39afe6", "#da6ee8", "#A02128", "#00940b"] for i, (name, ma) in enumerate(ma_keys.items()): chart_ma.add_yaxis(series_name=name, y_axis=ma, is_smooth=True, is_selected=False, symbol_size=0, label_opts=label_not_show_opts, linestyle_opts=opts.LineStyleOpts( opacity=0.8, width=1.0, color=ma_colors[i])) chart_ma.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_ma) # 缠论结果 # ------------------------------------------------------------------------------------------------------------------ if fx: try: fx_dts = [x['date'] for x in fx] except: fx_dts = [x['dt'] for x in fx] fx_val = [x['value'] for x in fx] chart_fx = Scatter() chart_fx.add_xaxis(fx_dts) chart_fx.add_yaxis(series_name="FX", y_axis=fx_val, is_selected=False, symbol="circle", symbol_size=6, label_opts=label_not_show_opts, itemstyle_opts=opts.ItemStyleOpts( color="rgba(152, 147, 193, 1.0)", )) chart_fx.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_fx) if xd: index = 0 xd_colors = zs_colors while xd: xd_dts = [x['date'] for x in xd] xd_val = [x['value'] for x in xd] chart_xd = Line() chart_xd.add_xaxis(xd_dts) xd_color = xd_colors[index % len(xd_colors)] chart_xd.add_yaxis( series_name="XD{}".format(index), y_axis=xd_val, is_selected=True, symbol="triangle", symbol_size=10, linestyle_opts=opts.LineStyleOpts(color=xd_color, width=index + 1, type_="solid"), itemstyle_opts=opts.ItemStyleOpts(color=xd_color)) chart_xd.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_xd) xd = xd.next index = index + 1 if bs: b_dts = [x['date'] for x in bs if x['bs'] == 'buy'] if len(b_dts) > 0: b_val = [x['value'] for x in bs if x['bs'] == 'buy'] chart_b = Scatter() chart_b.add_xaxis(b_dts) chart_b.add_yaxis(series_name="BUY", y_axis=b_val, is_selected=False, symbol="arrow", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts( color="#f31e1e", )) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_b) s_dts = [x['date'] for x in bs if x['bs'] == 'sell'] if len(s_dts) > 0: s_val = [x['value'] for x in bs if x['bs'] == 'sell'] chart_s = Scatter() chart_s.add_xaxis(s_dts) chart_s.add_yaxis(series_name="SELL", y_axis=s_val, is_selected=False, symbol="pin", symbol_size=12, itemstyle_opts=opts.ItemStyleOpts( color="#45b97d", )) chart_s.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_s) # 成交量图 # ------------------------------------------------------------------------------------------------------------------ chart_vol = Bar() chart_vol.add_xaxis(dts) chart_vol.add_yaxis(series_name="Volume", y_axis=vol, bar_width='60%') chart_vol.set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=True, font_size=8, color="#9b9da9"), ), yaxis_opts=yaxis_opts, legend_opts=legend_not_show_opts, ) # MACD图 # ------------------------------------------------------------------------------------------------------------------ chart_macd = Bar() chart_macd.add_xaxis(dts) chart_macd.add_yaxis(series_name="MACD", y_axis=macd_bar, bar_width='60%') chart_macd.set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, color="#c7c7c7"), ), legend_opts=opts.LegendOpts(is_show=False), ) line = Line() line.add_xaxis(dts) line.add_yaxis(series_name="DIFF", y_axis=diff, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#da6ee8")) line.add_yaxis(series_name="DEA", y_axis=dea, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#39afe6")) chart_macd = chart_macd.overlap(line) grid0_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="12%", height="58%") grid1_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="74%", height="8%") grid2_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="86%", height="10%") grid_chart = Grid(init_opts) grid_chart.add(chart_k, grid_opts=grid0_opts) grid_chart.add(chart_vol, grid_opts=grid1_opts) grid_chart.add(chart_macd, grid_opts=grid2_opts) return grid_chart
def plot_kline(df, rendered=True, col=""): """ 针对 dataframe 直接画出标准看盘软件的上k线图下成交量图的形式 :param df: :param rendered: :param col: :return: """ kline = ( Kline() .add_xaxis(xaxis_data=list(df["date"])) .add_yaxis( series_name="", itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), y_axis=list(zip(df["open"], df["close"], df["high"], df["low"])), markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ], symbol="pin", symbol_size=[56, 40], # label_opts=opts.LabelOpts(color="#CCFFFF",position=["top", "bottom"]) ), ) .set_global_opts( datazoom_opts=[ opts.DataZoomOpts( is_show=True, type_="slider", range_start=50, range_end=100, xaxis_index=[0, 1], ), opts.DataZoomOpts( is_show=False, type_="inside", range_start=50, range_end=100, xaxis_index=1, ), ], tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", trigger_on="mousemove", axis_pointer_type="cross", ), ) ) if col: line = ( Line() .add_xaxis(xaxis_data=list(df["date"])) .add_yaxis( series_name="", y_axis=list(df[col]), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ) ) kline = kline.overlap(line) if "volume" in df.columns: vl = list(df["volume"]) elif "amount" in df.columns: vl = list(df["amount"]) else: vl = [0 for _ in range(len(df))] bar = ( Bar() .add_js_funcs("var barData = {}".format(list(df["close"] - df["open"]))) .add_xaxis(xaxis_data=list(df["date"])) .add_yaxis( series_name="", yaxis_data=vl, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (barData[params.dataIndex]>0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", trigger_on="mousemove", axis_pointer_type="cross", ), ) ) grid_chart = Grid() grid_chart.add_js_funcs("var barData = {}".format(list(df["close"] - df["open"]))) grid_chart.add( kline, grid_opts=opts.GridOpts( pos_left="10%", pos_right="1%", pos_top="2%", height="65%" ), ) grid_chart.add( bar, grid_opts=opts.GridOpts( pos_left="10%", pos_right="1%", pos_top="71%", height="22%" ), ) if rendered: return grid_chart.render_notebook() else: return grid_chart
def bar_base(self) -> Bar: # start = datetime.datetime.now() # # dispose_unit = [] # done = [] # undo = [] # count_dispose_unit = 30 # # event_counts = Event.objects.all().values('dispose_unit').annotate(count=Count('dispose_unit')).values('dispose_unit', 'count').order_by('-count') # print(event_counts) # event_counts = list(event_counts) # sum_of_done = 0 # sum_of_undo = 0 # # print(len(event_counts)) # # print(event_counts) # for i in range(0,count_dispose_unit): # undo_event = Event.objects.filter(Q(achieve=3) & Q(dispose_unit=event_counts[i]['dispose_unit'])) # undo_event_num = len(undo_event) # dispose_unit_name = DisposeUnit.objects.filter(id=event_counts[i]['dispose_unit']).values("name")[0]['name'] # dispose_unit.append(dispose_unit_name) # done.append(event_counts[i]['count']) # undo.append(undo_event_num) # for i in range(count_dispose_unit,len(event_counts)): # undo_event = Event.objects.filter(Q(achieve=3) & Q(dispose_unit=event_counts[i]['dispose_unit'])) # undo_event_num = len(undo_event) # sum_of_done = sum_of_done + event_counts[i]['count'] # sum_of_undo = sum_of_undo + undo_event_num # other_unit_num = len(event_counts) - count_dispose_unit # dispose_unit.append("其他"+str(other_unit_num)+"个部门总和") # done.append(sum_of_done) # undo.append(sum_of_undo) # c = ( # Bar() # .add_xaxis(dispose_unit) # .add_yaxis("按期完成", done, stack="stack1",category_gap="60%") # .add_yaxis("逾期完成", undo, stack="stack1",category_gap="60%") # .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # .set_global_opts( # xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), # # title_opts=opts.TitleOpts(title="处理事件最多的部门"), # datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], # # ) # ) # # grid = Grid() # # grid.add(c, grid_opts=opts.GridOpts(pos_bottom="20%")) # # c = grid.dump_options_with_quotes() # # end = datetime.datetime.now() # print("Bar: " + str(end - start)) start = datetime.date(2016, 6, 6) end = datetime.date(2019, 6, 6) y_lists = [] x_list = [] b = Bar() event_counts = DisposeUnit.objects.all().values( 'name', 'number').order_by('-number') for achieve in achieves: new_list = [achieve.name] limit = 0 for dispose_unit_node in event_counts: dispose_unit = DisposeUnit.objects.get( name=dispose_unit_node['name']) if limit < 30: new_len = len( Event.objects.filter( Q(create_time__range=(start, end)) & Q(dispose_unit=dispose_unit) & Q(achieve=achieve))) new_list.append(new_len) new_len = 0 else: new_len += len( Event.objects.filter( Q(create_time__range=(start, end)) & Q(dispose_unit=dispose_unit) & Q(achieve=achieve))) limit += 1 new_list.append(new_len) y_lists.append(new_list) limit = 0 for dispose_unit_node in event_counts: if limit >= 30: break x_list.append(dispose_unit_node['name']) limit += 1 x_list.append("其他") b.add_xaxis(x_list) for y_list in y_lists: b.add_yaxis(y_list[0], y_list[1:], stack="stack1", category_gap="60%") b.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) \ .set_global_opts( xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), # title_opts=opts.TitleOpts(title="处理事件最多的部门"), datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], ) c = (b) grid = Grid() grid.add(c, grid_opts=opts.GridOpts(pos_bottom="20%")) c = grid.dump_options_with_quotes() return c