def test_boxplot_item_base(fake_writer):
    x_axis = ["expr1", "expr2"]
    v1 = [
        [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980],
        [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790],
    ]
    v2 = [
        [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920],
        [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870],
    ]
    c = Boxplot()

    series_a = [
        opts.BoxplotItem(name=x_axis[0], value=d) for d in c.prepare_data(v1)
    ]
    series_b = [
        opts.BoxplotItem(name=x_axis[1], value=d) for d in c.prepare_data(v2)
    ]

    c.add_xaxis(xaxis_data=x_axis).add_yaxis("A", series_a).add_yaxis(
        "B", series_b)
    c.render()
    _, content = fake_writer.call_args[0]
    assert_equal(c.theme, "white")
    assert_equal(c.renderer, "canvas")
Exemple #2
0
def district_score_box_plot(df, district, school_name):
    try:
        # school_name=None
        middle_score = middle_school_data4box(df)
        labels = list(middle_score.columns)
        c = Boxplot(init_opts=opts.InitOpts(width='1750px'))
        c.add_xaxis([""])
        for col in labels:
            value = [list(middle_score[col].dropna())]
            c.add_yaxis(col, c.prepare_data(value))
        c.set_global_opts(
            title_opts=opts.TitleOpts(title=f"{district}-{school_name}成绩分布"),
            legend_opts=opts.LegendOpts(is_show=False),
            yaxis_opts=opts.AxisOpts(min_=400, max_=750))
        return c
    except:
        v2 = [Faker.values(450, 650)]
        v1 = [Faker.values(500, 700)]
        c = Boxplot(init_opts=opts.InitOpts(width='1750px'))
        c.add_xaxis([''])
        c.add_yaxis("中学A",
                    c.prepare_data(v1)).add_yaxis("中学B", c.prepare_data(v2))
        c.set_global_opts(title_opts=opts.TitleOpts(
            title=f"{district}初中成绩分布(示例)", subtitle="当看到此页面,说明所选区目前无数据"))
        return c
Exemple #3
0
 def boxplot(self, column:str):
     if self.check_col_type(column, "number"):
         series = self.data[column]
         boxplot = Boxplot()
         boxplot.add_xaxis([column]).add_yaxis("", boxplot.prepare_data([list(series)]))
         boxplot.set_global_opts(title_opts=opts.TitleOpts(title="{}-箱线图".format(column)))
         return boxplot.dump_options()
     else:
         return None
def boxpolt_base() -> Boxplot:
    v1 = [
        [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980],
        [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790],
    ]
    v2 = [
        [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920],
        [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870],
    ]
    c = Boxplot()
    c.add_xaxis(["expr1", "expr2"]).add_yaxis("A", c.prepare_data(v1)).add_yaxis(
        "B", c.prepare_data(v2)
    ).set_global_opts(title_opts=opts.TitleOpts(title="BoxPlot-基本示例"))
    return c
def paintBoxPlot(datadict, xtitle, ytitle, title):
    graph = Boxplot(init_opts=opts.InitOpts(page_title=title))
    graph.set_global_opts(
        title_opts=opts.TitleOpts(title=title),
        yaxis_opts=opts.AxisOpts(name='Accuracy')
    )

    graph.add_xaxis([xtitle])
    for key, value in sorted(datadict.items()):
        # 为了画图的标准性,小于5人的年级图片将不会被加入盒图
        if len(value) > 4:
            graph.add_yaxis(key, graph.prepare_data([value]))
    
    graph.render('buctoj2_boxplot.html')
Exemple #6
0
def test_boxpolt_base():
    v1 = [
        [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980],
        [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790],
    ]
    v2 = [
        [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920],
        [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870],
    ]
    c = Boxplot()
    c.add_xaxis(["expr1", "expr2"]).add_yaxis("A", c.prepare_data(v1)).add_yaxis(
        "B", c.prepare_data(v2)
    )
    assert c.theme == "white"
    assert c.renderer == "canvas"
    c.render("render.html")
def test_boxpolt_base(fake_writer):
    v1 = [
        [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980],
        [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790],
    ]
    v2 = [
        [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920],
        [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870],
    ]
    c = Boxplot()
    c.add_xaxis(["expr1", "expr2"]).add_yaxis("A",
                                              c.prepare_data(v1)).add_yaxis(
                                                  "B", c.prepare_data(v2))
    c.render()
    _, content = fake_writer.call_args[0]
    eq_(c.theme, "white")
    eq_(c.renderer, "canvas")
Exemple #8
0
def box_plot(data: dict,
             title: str = "箱线图",
             width: str = "900px",
             height: str = "680px") -> Boxplot:
    """

    :param data: 数据
        样例:
        data = {
            "expr 0": [960, 850, 830, 880],
            "expr 1": [960, 850, 830, 880],
        }
    :param title:
    :param width:
    :param height:
    :return:
    """
    x_data = []
    y_data = []
    for k, v in data.items():
        x_data.append(k)
        y_data.append(v)

    init_opts = opts.InitOpts(page_title=title, width=width, height=height)

    chart = Boxplot(init_opts=init_opts)
    chart.add_xaxis(xaxis_data=x_data)
    chart.add_yaxis(series_name="", y_axis=y_data)
    chart.set_global_opts(title_opts=opts.TitleOpts(pos_left="center", title=title),
                          tooltip_opts=opts.TooltipOpts(trigger="item", axis_pointer_type="shadow"),
                          xaxis_opts=opts.AxisOpts(
                              type_="category",
                              boundary_gap=True,
                              splitarea_opts=opts.SplitAreaOpts(is_show=False),
                              axislabel_opts=opts.LabelOpts(formatter="{value}"),
                              splitline_opts=opts.SplitLineOpts(is_show=False),
                          ),
                          yaxis_opts=opts.AxisOpts(
                              type_="value",
                              name="",
                              splitarea_opts=opts.SplitAreaOpts(
                                  is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
                              )
                          ))
    return chart
def boxplot_product_price_base():
    """
    此函数用于获取产品价格的箱线图的参数。

    Returns
    -------
    c : TYPE-echarts parameters
        return echarts parameters.

    """
    # data query
    dataX, dataY = product_price_query()
    # Declare objects, render pictures
    c = Boxplot()
    c.add_xaxis(dataX)
    c.add_yaxis("Pricing",c.prepare_data(dataY))
    c.set_global_opts(title_opts=opts.TitleOpts(title="Distribution of Product Pricing", subtitle="Unit:$"))
    return c
Exemple #10
0
    def salary(self):
        sql = 'SELECT workYear,replace(salary,\'k\',\'\') s FROM jobs group by workYear,salary order by workYear'
        results = self.query(sql)
        sum = {}
        for r in results:
            rs = r[1].split('-')
            a = sum.get(r[0], [])
            a.extend(rs)
            sum[r[0]] = a

        for k in sum:
            numbers = list(map(int, sum[k]))
            v = list(set(numbers))
            sum[k] = v

        print(list(sum.values()))

        c = Boxplot()
        c.add_xaxis(list(sum.keys()))
        c.add_yaxis("薪资与工作经验", c.prepare_data(list(sum.values())))
        c.set_global_opts(title_opts=opts.TitleOpts(title="薪资与工作经验"))
        c.render("拉勾薪资.html")
Exemple #11
0
def draw_project_cost_boxplot():
    row_dict = request_data.get_project_cost()
    return_code = row_dict['code']
    if return_code == 0:
        x_data = ['Success', 'Failed']
        success_data = row_dict['stateProjectCost']['state']['success']
        y_data1 = [[success_data['min'], success_data['25%'], success_data['mean'], success_data['75%'],
                   success_data['max']]]
        failed_data = row_dict['stateProjectCost']['state']['failed']
        y_data2 = [[failed_data['min'], failed_data['25%'], failed_data['mean'], failed_data['75%'], failed_data['max']]]

        print('boxplot')
        print(x_data)
        print(y_data1)
        print(y_data2)
        project_cost_boxplot = Boxplot()
        project_cost_boxplot.add_xaxis(x_data)
        project_cost_boxplot.add_yaxis("成功项目", y_data1)
        project_cost_boxplot.add_yaxis("失败项目", y_data2)

        project_cost_boxplot.set_global_opts(title_opts=opts.TitleOpts(title="项目花费"))
        return project_cost_boxplot
    else:
        return 0
Exemple #12
0
# In[94]:

look_support_money = article[['看一看', '点赞', '赞赏']]

# 箱型图绘制
from pyecharts import options as opts
from pyecharts.charts import Boxplot

v1 = [
    list(look_support_money['看一看']),
    list(look_support_money['点赞']),
    list(look_support_money['赞赏'])
]

c = Boxplot(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE, chart_id=4))
c.add_xaxis(["看一看", "点赞", '赞赏'])
c.add_yaxis("", c.prepare_data(v1))
c.set_global_opts(title_opts=opts.TitleOpts(title="看一看,点赞,赞赏分布"))
c.render("../output/看一看,点赞,赞赏.html")
c.render_notebook()

# ## 文章类型占比

# In[95]:

kind = article['文章类型'].value_counts()

# 绘制玫瑰图
from pyecharts import options as opts
from pyecharts.charts import Pie
Exemple #13
0
dom1, dom2, dom3 = [], [], []

list1 = []
for date, AQI in zip(data['Date'], data['AQI']):
    year = date.split('-')[0]
    if year in ['2015', '2016']:
        dom1.append(AQI)
    elif year in ['2017', '2018']:
        dom2.append(AQI)
    elif year in ['2019', '2020']:
        dom3.append(AQI)

x = ['2015-2016年', '2017-2018年', '2019-2020年']
y = [dom1, dom2, dom3]

boxplot = Boxplot()

boxplot.add_xaxis(x)
boxplot.add_yaxis('Delhi', boxplot.prepare_data(y))

boxplot.set_global_opts(title_opts=opts.TitleOpts(
    title='2015-2020印度德里AQI箱型图',
    pos_left='center',
),
                        legend_opts=opts.LegendOpts(
                            pos_left='left',
                            orient='vertical',
                        ))

boxplot.render('boxplot_AQI.html')
# In[138]:

# vis
from pyecharts import options as opts
from pyecharts.charts import Boxplot

v1 = [
    [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980],
    [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790],
]
v2 = [
    [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920],
    [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870],
]
c = Boxplot()
c.add_xaxis(["expr1", "expr2"])
c.add_yaxis("A", c.prepare_data(v1))
c.add_yaxis("B", c.prepare_data(v2))
c.set_global_opts(title_opts=opts.TitleOpts(title="BoxPlot-基本示例"))
c.render_notebook()

# ## WordCloud

# In[156]:

# vis
import pyecharts.options as opts
from pyecharts.charts import WordCloud

import jieba.analyse
import numpy as np
Exemple #15
0
y3 = [400, 388, 397, 352, 423, 447, 378, 377, 395, 387]
y4 = [278, 288, 254, 213, 256, 278, 267, 256, 278, 266]
y5 = [213, 215, 234, 232, 278, 188, 223, 234, 225, 231]

# 绘制箱线图
boxplot = Boxplot()
# 生成绘箱线图图用的y轴数据(即每一组yi)的[下限值,下四分位点,中位数,上四分位点,上限值]
yData = boxplot.prepare_data([y1, y2, y3, y4, y5])
# print(y_data)
# 得到绘制5组温度下对应箱线图的[下限值,下四分位点,中位数,上四分位点,上限值]数据
# [[312, 366.75, 380.0, 388.25, 432], [354, 388.5, 409.5, 416.5, 432], [352, 377.75, 391.5, 405.75, 447],
# [213, 255.5, 266.5, 278.0, 288], [188, 214.5, 228.0, 234.0, 278]]

# 执行绘图
# 添加x轴数据
boxplot.add_xaxis(xaxis_data=xData)
# 添加y轴数据
boxplot.add_yaxis(series_name="实验组数据", y_axis=yData)

# 保存路径
resultPath = "./result"
if not os.path.exists(path=resultPath):
    os.mkdir(path=resultPath)
# 保存文件名
resultFilePath = "experiment_gp_boxplot.html"
# 设置标题和副标题
boxplot.set_global_opts(title_opts=opts.TitleOpts(title="探究温度对化肥有效成分含量的影响",
                                                  subtitle="每种温度下共采集10组数据"),
                        xaxis_opts=opts.AxisOpts(name="温度"),
                        yaxis_opts=opts.AxisOpts(name="有效含量值(单位: g/500g)"))
Exemple #16
0
          ]]

scatter_data = [650, 620, 720, 720, 950, 970]

box_plot = Boxplot()
box_plot = (box_plot.add_xaxis(
    xaxis_data=["expr 0", "expr 1", "expr 2", "expr 3", "expr 4"]).add_yaxis(
        series_name="", y_axis=box_plot.prepare_data(y_data)).set_global_opts(
            title_opts=opts.TitleOpts(pos_left="center",
                                      title="Michelson-Morley Experiment"),
            tooltip_opts=opts.TooltipOpts(trigger="item",
                                          axis_pointer_type="shadow"),
            xaxis_opts=opts.AxisOpts(
                type_="category",
                boundary_gap=True,
                splitarea_opts=opts.SplitAreaOpts(is_show=False),
                axislabel_opts=opts.LabelOpts(formatter="expr {value}"),
                splitline_opts=opts.SplitLineOpts(is_show=False),
            ),
            yaxis_opts=opts.AxisOpts(
                type_="value",
                name="km/s minus 299,000",
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True,
                    areastyle_opts=opts.AreaStyleOpts(opacity=1)),
            ),
        ).set_series_opts(tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}")))

scatter = (Scatter().add_xaxis(
    xaxis_data=["expr 0", "expr 1", "expr 2", "expr 3", "expr 4"]).add_yaxis(
        series_name="", y_axis=scatter_data).set_global_opts(
            title_opts=opts.TitleOpts(
Exemple #17
0
def find_distribution_render(x,Y,x_name,query,table_path,answer):
    Max=0
    y=[]
    data=[]
    label=[]
    boxplot = Boxplot()
    boxplot.add_xaxis(xaxis_data=label)
    for i in range(len(Y)):
        data.append(Y[i][1])
        label.append(Y[i][0])
        # boxplot.add_yaxis(series_name=Y[i][0],y_axis=boxplot.prepare_data(data))
        for j in Y[i][1]:
            y.append(j)
    boxplot.add_yaxis(series_name="", y_axis=boxplot.prepare_data(data))
    boxplot.set_global_opts(
        yaxis_opts=opts.AxisOpts(name="Distribution",axislabel_opts=opts.LabelOpts(font_size="100%"),name_textstyle_opts=opts.TextStyleOpts(font_size="100%")),
        legend_opts=opts.LegendOpts(is_show=False),
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=40,interval=0,font_size='100%'),name="Category",name_textstyle_opts=opts.TextStyleOpts(font_size="100%")),
        graphic_opts=[opts.GraphicText(
            graphic_item=opts.GraphicItem(
                left="center",
                top="bottom",
                z=100,
            ),
            graphic_textstyle_opts=opts.GraphicTextStyleOpts(
                # 可以通过jsCode添加js代码,也可以直接用字符串
                text=['\n' + "Q:" + ' ' + query + '\n'+"\n" + 'A:' + ' ' + answer],
                font="14px Microsoft YaHei",
                graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(
                    fill="#333"
                )
            )
        )]
    )

    bar=Bar({"theme": ThemeType.MACARONS})
    bar.add_xaxis(xaxis_data=x)
    for i in range(len(Y)):
        max_index, max_number = max(enumerate(Y[i][1]), key=operator.itemgetter(1))
        min_index, min_number = min(enumerate(Y[i][1]), key=operator.itemgetter(1))
        if max_number>Max:
            Max=max_number
        bar.add_yaxis(Y[i][0],label_opts=opts.LabelOpts(is_show=False),y_axis=Y[i][1],markpoint_opts=opts.MarkPointOpts(
            data=[opts.MarkPointItem(coord=[max_index,max_number*1.01],value="MAX",name="最大值",itemstyle_opts=opts.ItemStyleOpts(opacity=0.6)),opts.MarkPointItem(coord=[min_index,min_number*1.05],value="MIN",name="最小值",itemstyle_opts=opts.ItemStyleOpts(opacity=0.6))]
        ),
                      markline_opts=opts.MarkLineOpts(
                          data=[opts.MarkLineItem(type_="average",name="平均值")]
                      ))
    bar.set_global_opts(
        datazoom_opts=[opts.DataZoomOpts(range_start=10, range_end=90),
                       opts.DataZoomOpts(type_="inside")],
        yaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(font_size="100%"),
                                 name_textstyle_opts=opts.TextStyleOpts(font_size="100%")),
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=40, interval=0, font_size='100%'),
                                 name=x_name, name_textstyle_opts=opts.TextStyleOpts(font_size="100%")),
        graphic_opts=[opts.GraphicText(
            graphic_item=opts.GraphicItem(
                left="center",
                top="bottom",

            ),
            graphic_textstyle_opts=opts.GraphicTextStyleOpts(
                # 可以通过jsCode添加js代码,也可以直接用字符串
                text=['\n' + "Q:" + ' ' + query + '\n' + "\n"+'A:' + ' ' + answer],
                font="14px Microsoft YaHei",
                graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(
                    fill="#333"
                )
            )
        )]
    )
    grid = Grid( init_opts=opts.InitOpts(
        width="100%",
        height="100%",
        renderer= globals.RenderType.SVG,))
    grid.add(boxplot,  grid_opts={'left':'20%','bottom':'34%'})
    grid1 = Grid( init_opts=opts.InitOpts(
        width="100%",
        height="100%",
        renderer= globals.RenderType.SVG,))
    grid1.add(bar,grid_opts={'left':'20%','bottom':'34%'})
    option1=grid.dump_options_with_quotes()
    option1=json.loads(option1)
    option2=grid1.dump_options_with_quotes()
    option2=json.loads(option2)
    option={"option":[option1,option2],"query":query}
    return option
Exemple #18
0
    def pollsummary(self,subset='masterCandle',dat_cursor=None,renderfile=False):
        # 初始化交易时间x轴
        heartbeat = 300
        # 如果未提供复盘时间游标,则默认使用最近交易日至收盘收盘时间的数据
        if dat_cursor is None:
            dat_cursor = datetime.now().astimezone(timezone(cfg.STR_TIMEZONE))
            int_latestViewDate = self.da.int_findClosestTradeDate(datetime.strftime(dat_cursor,'%Y%m%d') )
            int_cursorDateTime = int(str(int_latestViewDate)+'150100')
            int_cursorDateStart = int(str(int_latestViewDate)+'000000')
        # 如提供复盘游标时间,则该时间为游标卡尺的最后时间,如日期为非交易日则自动调整为最近交易日的收盘时间
        else:
            int_cursorDate = datetime.strftime(dat_cursor,'%Y%m%d')
            int_latestViewDate = self.da.int_findClosestTradeDate(int_cursorDate)
            if int_cursorDate==int_latestViewDate: # 如相等说明提供日期为有效交易日,则使用提供的小时分钟秒为游标终点时间,否则将自动替换为最近交易日的收盘时间点
                int_cursorDateTime = int(datetime.strftime(dat_cursor,'%Y%m%d%H%M%S'))
                int_cursorDateStart = int(datetime.strftime(dat_cursor,'%Y%m%d')+'000000')
            else:
                int_cursorDateTime = int(str(int_latestViewDate) +'150100')
                int_cursorDateStart = int(str(int_latestViewDate) +'000000')
        beatRange = Radar.pop_pulseRange(int_latestViewDate,heartbeat)
        df_stockPoll = pd.read_sql(DataAgent.dbsession.query(Stock_poll).filter(Stock_poll.time_index>=int_cursorDateStart,
                                        Stock_poll.time_index<=int_cursorDateTime,
                                        Stock_poll.volume!=0).statement, 
                                    DataAgent.dbsession.bind)
        df_indexPoll = pd.read_sql(DataAgent.dbsession.query(Index_poll).filter(Index_poll.time_index>=int_cursorDateStart,
                                        Index_poll.time_index<=int_cursorDateTime,
                                        Index_poll.volume!=0).statement, 
                                    DataAgent.dbsession.bind)
        '''
        data_store = libs.tryOpenH5(cfg.H5_FILE_POLL,mode='r')
        if 'stockPoll' in data_store:
            df_stockPoll = data_store['stockPoll']
            df_stockPoll = df_stockPoll[df_stockPoll['volume']!=0] # 过滤掉数据中非交易中的证券
            df_stockPoll = df_stockPoll[(df_stockPoll['time_index']<=int_cursorDateTime)&(df_stockPoll['time_index']>=int_cursorDateStart)] # 过滤掉和画图期间无关的数据
        else:
            df_stockPoll = pd.DataFrame()
        df_indexPoll = data_store['indexPoll'] if 'indexPoll' in data_store else pd.DataFrame()
        data_store.close()
        '''

        data_store = libs.tryOpenH5(cfg.H5_FILE_PRE,mode='r')
        # 如果按照输入日期没有找到当日任何盘中数据,则从入库历史数据中找到当日收盘数据用于填充
        if len(df_indexPoll)==0:
            df_indexPoll = data_store['masterCandle'][data_store['masterCandle']['trade_date']==int_latestViewDate]
            df_indexPoll['time_index'] = int_cursorDateTime
            df_indexPoll['pct_change'] = round(df_indexPoll['adj_close']/df_indexPoll['pre_close']*100,2)
            df_indexPoll['per'] = np.nan
        if len(df_stockPoll)==0:
            df_stockPoll = data_store['masterCandle'][data_store['masterCandle']['trade_date']==int_latestViewDate]
            df_stockPoll['time_index'] = int_cursorDateTime
            df_stockPoll['pct_change'] = round((df_stockPoll['adj_close']-df_stockPoll['pre_close'])/df_stockPoll['pre_close']*100,2)
            df_stockPoll.rename(columns={'pe': 'per'}, inplace=True)
        # 如果入库历史数据中仍未找到任何数据则退出分析程序
        if any([len(df_stockPoll)==0,len(df_indexPoll)==0]):
                data_store.close()
                print('stockPoll or indexPoll does not exist for the cursor date in the offline data store, process exiting...')
                return False
        
        ''' ------读取security code级别的聚合数据------- '''
        if subset=='masterCandle': 
            pass #data_store = libs.tryOpenH5(cfg.H5_FILE_PRE,mode='r')
        else:
            data_store.close() # 关闭之前打开的master data file
            data_store = libs.tryOpenH5('{}{}.dat'.format(cfg.H5_FILE_PATH,subset),mode='r')
        df_histRec = data_store['AggByCode']
        data_store.close()
        self.poll_aggHistRec = df_histRec # sec code 级别的聚合数据,集合包含证券及指数,输出至对象变量
        ''' ------读取security code级别的聚合结束------- '''

        sr_intBeatIndex = pd.Series(beatRange.strftime('%Y%m%d%H%M%S').astype('int64')).rename(index='time_index')
        df_index = pd.merge(sr_intBeatIndex,df_indexPoll,how='left',left_on='time_index',right_on='time_index',suffixes=['','1'])
        
        df_stock = pd.merge(sr_intBeatIndex,df_stockPoll,how='left',left_on='time_index',right_on='time_index',suffixes=['','1'])
        df_stock = pd.merge(df_stock,df_histRec,how='left',left_on='ts_code',right_index=True,suffixes=['','1'])

        self.poll_index = df_index #将结果输出至analyitics对象用于方法外的访问
        self.poll_stock = df_stock #将结果输出至analyitics对象用于方法外的访问
        # libs.df_csv(cfg.PATH_BUGFILE,(df_stock,))
        ''' --------所有by time index级别的聚合在这里完成 -----'''
        def popPctList(x):
            # 移除涨跌幅超过+- 10%的, 新股不受10%涨跌幅限制因此会干扰box chart显示
            return [0]*3 if len(x)<3 else [i for i in x if abs(i)<11]
        def bigBox(x, up=True):
            # 中阳(阴)以上k线数量
            if up:
                return list(x.loc[(x['box_size']>0) & (x['klineSML'].str.match(DataAgent.re_bigUpBoxPat))]['ts_code'])
            else:
                return list(x.loc[(x['box_size']<0) & (x['klineSML'].str.match(DataAgent.re_bigDnBoxPat))]['ts_code'])
        def breakThrough(x,up=True):
            if up: # 找到上穿有效末跌高点的
                return list(x.loc[x['close']>=x['validPiv_dnHigh']]['ts_code'])
            else: # 找到跌破有效末升低点的
                return list(x.loc[x['close']<=x['validPiv_upLow']]['ts_code'])   
        df_stockBeatGrp = df_stock.groupby('time_index')
        df_stockBeatRollup = df_stockBeatGrp.agg({'ts_code': ['count'],
                                'pct_change': [popPctList],
                                'per': ['median']}) # function放入中括号内会生成两个层级列名,方便后面join成新列名.如无中括号将只产生一层列名
        df_stockBeatRollup.columns = ['_'.join(x) for x in df_stockBeatRollup.columns.ravel()]
        df_stockBeatRollup['upThruList'] = df_stockBeatGrp.apply(lambda x: breakThrough(x,up=True)) if len(df_histRec) > 0 else np.nan
        df_stockBeatRollup['dnThruList']= df_stockBeatGrp.apply(lambda x: breakThrough(x,up=False)) if len(df_histRec) > 0 else np.nan
        df_stockBeatRollup['upThruCount'] = df_stockBeatRollup.apply(lambda row: len(row['upThruList']),axis=1) if len(df_histRec) > 0 else np.nan
        df_stockBeatRollup['dnThruCount']= df_stockBeatRollup.apply(lambda row: len(row['dnThruList']),axis=1) if len(df_histRec) > 0 else np.nan

        df_stockBeatRollup['upBigBoxList'] = df_stockBeatGrp.apply(lambda x: bigBox(x,up=True))
        df_stockBeatRollup['dnBigBoxList'] = df_stockBeatGrp.apply(lambda x: bigBox(x,up=False))
        df_stockBeatRollup['upBigBoxCount'] = df_stockBeatRollup.apply(lambda row: len(row['upBigBoxList']),axis=1) if len(df_histRec) > 0 else np.nan
        df_stockBeatRollup['dnBigBoxCount'] = df_stockBeatRollup.apply(lambda row: len(row['dnBigBoxList']),axis=1) if len(df_histRec) > 0 else np.nan        
        ''' --------by time index级别的聚合结束 -------------------------------'''
        
        df_stockBeatRollup.astype(dtype= {'ts_code_count':'int32','upThruCount':'int32','dnThruCount':'int32','upBigBoxCount':'int32','dnBigBoxCount':'int32'})
        self.poll_aggStkPoll = df_stockBeatRollup.loc[df_stockBeatRollup['ts_code_count']>0] # 只将有效结果输出到analytics对象属性中用于function以外的调用

        ''' ------------------作图区域---------------------------'''
        per_median = round(self.poll_aggStkPoll.loc[self.poll_aggStkPoll.index==self.poll_aggStkPoll.index.max()].per_median.values[0],2)
        
        lst_xaxis = ['{}:{}:{}'.format(i.hour,i.minute,i.second) for i in beatRange]
        marketSummaryBoxPlot = Boxplot()
        lst_yaxis = np.around(marketSummaryBoxPlot.prepare_data(df_stockBeatRollup['pct_change_popPctList'].values), decimals=2).tolist()
        
        marketSummaryBoxPlot.add_xaxis(lst_xaxis)
        marketSummaryBoxPlot.add_yaxis("%", lst_yaxis)
        marketSummaryBoxPlot.set_global_opts(title_opts=opts.TitleOpts(title='整体涨跌幅分布 - {} (最后市盈率中位数:{})'.format(int_latestViewDate,str(per_median))),
            yaxis_opts=opts.AxisOpts(name="涨幅",min_=-10,max_=10),
            xaxis_opts=opts.AxisOpts(name="",
                axislabel_opts=opts.LabelOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(is_show=True),
                axistick_opts=opts.AxisTickOpts(is_show=True),
                splitline_opts=opts.SplitLineOpts(is_show=False),),
            legend_opts=opts.LegendOpts(is_show=False),
        )
        
        lst_upThruBar = df_stockBeatRollup['upThruCount'].values.tolist()
        lst_dnThruBar = df_stockBeatRollup['dnThruCount'].values.tolist()
        lst_bigUpBoxBar = df_stockBeatRollup['upBigBoxCount'].values.tolist()
        lst_bigDnBoxBar = df_stockBeatRollup['dnBigBoxCount'].values.tolist()
        
        pivotCountChart = (
            Bar()
            .add_xaxis(lst_xaxis)
            .add_yaxis(
                series_name="向上突破数量",
                yaxis_data=lst_upThruBar,
                label_opts=opts.LabelOpts(is_show=False),
                itemstyle_opts=opts.ItemStyleOpts(color="#FD625E"),
            )
            .add_yaxis(
                series_name="向下突破数量",
                xaxis_index=1,
                yaxis_index=1,
                yaxis_data=lst_dnThruBar,
                label_opts=opts.LabelOpts(is_show=False),
                itemstyle_opts=opts.ItemStyleOpts(color="#01B8AA"),
            )
            .add_yaxis(
                series_name="长阳线数量",
                xaxis_index=1,
                yaxis_index=1,
                yaxis_data=lst_bigUpBoxBar,
                label_opts=opts.LabelOpts(is_show=False),
                itemstyle_opts=opts.ItemStyleOpts(color="red"),
            )
            .add_yaxis(
                series_name="长阴线数量",
                xaxis_index=1,
                yaxis_index=1,
                yaxis_data=lst_bigDnBoxBar,
                label_opts=opts.LabelOpts(is_show=False),
                itemstyle_opts=opts.ItemStyleOpts(color="green"),
            )
            .set_global_opts(
                xaxis_opts=opts.AxisOpts(name="小时/分钟",),
                yaxis_opts=opts.AxisOpts(
                    axislabel_opts=opts.LabelOpts(is_show=True),
                    axisline_opts=opts.AxisLineOpts(is_show=True),
                    axistick_opts=opts.AxisTickOpts(is_show=True),
                    splitline_opts=opts.SplitLineOpts(is_show=True),
                ),
                legend_opts=opts.LegendOpts(is_show=True,pos_bottom='0%', pos_left="center"),
            )
        )
        gridChart = Grid()
        gridChart.add(
            marketSummaryBoxPlot,
            grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_bottom='45%'),
        )
        gridChart.add(
            pivotCountChart,
            grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="55%"),
        )
        fname = '{}marketSummary{}.html'.format(cfg.PATH_ANAFILE,int_latestViewDate)
        gridChart.render(fname) if renderfile else None       
        return gridChart
Exemple #19
0
    slope = "{:0.2f}".format(slope)
    if slope <= str(0.1):
        list_5.append(df['height'][i])
    if str(0.1) < slope <= str(0.5):
        list_10.append(df['height'][i])
    if str(0.5) < slope <= str(0.9):
        list_15.append(df['height'][i])
    if str(0.9) < slope <= str(1.3):
        list_20.append(df['height'][i])
    if slope > str(1.3):
        list_30.append(df['height'][i])

sum_list = []
sum_list.append(list_5)
sum_list.append(list_10)
sum_list.append(list_15)
sum_list.append(list_20)
sum_list.append(list_30)

c = Boxplot()
c.add_xaxis(["0-0.1", "0.1-0.5", "0.5-0.9", "0.9-1.3", "1.3以上"])
c.add_yaxis("ATLAS Elevation-Airborne LiDAR Elevation(m)",
            c.prepare_data(sum_list))

c.set_global_opts(
    title_opts=opts.TitleOpts(title="All data"),
    xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)),
    yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)),
)
c.render("boxplot.html")
Exemple #20
0
)
scatter.render_notebook()

# %% [markdown]
# #### EffectScatter -- 涟漪散点图

effect_scatter = EffectScatter()
effect_scatter.add_xaxis(Faker.choose())
effect_scatter.add_yaxis("", Faker.values(), symbol=SymbolType.ARROW)
effect_scatter.render_notebook()

# %% [markdown]
# ### Boxplot -- 箱线图

boxplot = Boxplot()
boxplot.add_xaxis(Faker.choose())
# 计算数据的最大、最小、中位、四分位数
dt1 = boxplot.prepare_data(list(zip(*[Faker.values() for i in range(20)])))
dt2 = boxplot.prepare_data(list(zip(*[Faker.values() for i in range(20)])))
boxplot.add_yaxis("cat1", dt1)
boxplot.add_yaxis("cat2", dt2)
boxplot.render_notebook()

# %% [markdown]
# ### Polar -- 极坐标

import math
data=[]
# 生成数据,满足格式`[r, \theta]`,即可以认为角度为自变量、径向为因变量
for i in range(0, 360):
    data.append([100 * math.sin(i/180 * math.pi), i])