【问题标题】:Save configuration of pivottablejs in Jupyter notebook在 Jupyter notebook 中保存 pivottablejs 的配置
【发布时间】:2020-02-15 13:20:46
【问题描述】:

我正在使用 google Colab(服务器上的 Jupyter python notebook)来运行数据透视表。

这段代码:

pivot_ui(d1,outfile_path='pivottablejs.html')
HTML('pivottablejs.html')

在这个空白数据透视表中产生:

我可以操纵它来获得这个所需的图表:

但是当我刷新页面时,一切都会回到空白枢轴。我想要的是存储所需图表的配置,以便我可以在刷新后取回它。

我知道JavaScript 中有关于如何执行此操作的说明,但我无法弄清楚如何在 Jupyter 笔记本中执行此操作。有什么想法吗?

编辑看来我不是第一个尝试过的人:https://github.com/nicolaskruchten/jupyter_pivottablejs/issues/34,目前的设置是不可能的。

【问题讨论】:

    标签: python jupyter-notebook google-colaboratory pivottable.js


    【解决方案1】:

    我的 hacky 解决方案

    我重写了部分 pivottablejs 包以添加“复制配置”按钮。我将这段代码放在 Jupyter notebook 的早期单元格中,以便稍后可以访问该函数:

    Google Colab 版本:

    !pip install pivottablejs
    from pivottablejs import pivot_ui
    from IPython.display import HTML
    from IPython.display import IFrame
    import json, io
    
    TEMPLATE = u"""
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>PivotTable.js</title>
    
            <!-- external libs from cdnjs -->
            <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.11/c3.min.css">
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.11/c3.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-csv/0.71/jquery.csv-0.71.min.js"></script>
    
    
            <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/pivottable/2.19.0/pivot.min.css">
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pivottable/2.19.0/pivot.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pivottable/2.19.0/d3_renderers.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pivottable/2.19.0/c3_renderers.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pivottable/2.19.0/export_renderers.min.js"></script>
    
            <style>
                body {font-family: Verdana;}
                .node {
                  border: solid 1px white;
                  font: 10px sans-serif;
                  line-height: 12px;
                  overflow: hidden;
                  position: absolute;
                  text-indent: 2px;
                }
                .c3-line, .c3-focused {stroke-width: 3px !important;}
                .c3-bar {stroke: white !important; stroke-width: 1;}
                .c3 text { font-size: 12px; color: grey;}
                .tick line {stroke: white;}
                .c3-axis path {stroke: grey;}
                .c3-circle { opacity: 1 !important; }
                .c3-xgrid-focus {visibility: hidden !important;}
            </style>
        </head>
        <body>
            <script type="text/javascript">
                $(function(){
    
                    $("#output").pivotUI(
                        $.csv.toArrays($("#output").text())
                        , $.extend({
                            renderers: $.extend(
                                $.pivotUtilities.renderers,
                                $.pivotUtilities.c3_renderers,
                                $.pivotUtilities.d3_renderers,
                                $.pivotUtilities.export_renderers
                                ),
                            hiddenAttributes: [""]
                        } 
                        , {
                            onRefresh: function(config) {
                                var config_copy = JSON.parse(JSON.stringify(config));
                                //delete some values which are functions
                                delete config_copy["aggregators"];
                                delete config_copy["renderers"];
                                //delete some bulky default values
                                delete config_copy["rendererOptions"];
                                delete config_copy["localeStrings"];
                                $("#output2").text(JSON.stringify(config_copy, undefined, 2));
                            }
                        }
                        , %(kwargs)s
                        , %(json_kwargs)s)
                    ).show();
                 });
            </script>
            <div id="output" style="display: none;">%(csv)s</div>
    
            <textarea id="output2"
            style="float: left; width: 0px; height: 0px; margin: 0px; opacity:0;" readonly>
            </textarea>
    
            <button onclick="copyTextFunction()">Copy settings</button>
            <script>
            function copyTextFunction() {
                        var copyText = document.getElementById("output2");
                        copyText.select();
                        document.execCommand("copy");
                        }
            </script>
    
        </body>
    </html>
    """
    
    
    def pivot_cht_html(df, outfile_path = "pivottablejs.html", url="",
        width="100%", height="500",json_kwargs='',  **kwargs):
      with io.open(outfile_path, 'wt', encoding='utf8') as outfile:
          csv = df.to_csv(encoding='utf8')
          if hasattr(csv, 'decode'):
              csv = csv.decode('utf8')
          outfile.write(TEMPLATE %
                dict(csv=csv, kwargs=json.dumps(kwargs),json_kwargs=json_kwargs))
      
      IFrame(src=url or outfile_path, width=width, height=height)
      return HTML(outfile_path)
    

    标准 Jupyter 笔记本的版本:

    #this is my custom version of pivottablejs, it allows you to save your analysis
    !pip install pivottablejs
    from pivottablejs import pivot_ui
    from IPython.display import HTML
    from IPython.display import IFrame
    import json, io
    
    TEMPLATE = u"""
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>PivotTable.js</title>
    
            <!-- external libs from cdnjs -->
            <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.11/c3.min.css">
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.11/c3.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-csv/0.71/jquery.csv-0.71.min.js"></script>
    
    
            <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/pivottable/2.19.0/pivot.min.css">
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pivottable/2.19.0/pivot.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pivottable/2.19.0/d3_renderers.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pivottable/2.19.0/c3_renderers.min.js"></script>
            <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pivottable/2.19.0/export_renderers.min.js"></script>
    
            <style>
                body {font-family: Verdana;}
                .node {
                  border: solid 1px white;
                  font: 10px sans-serif;
                  line-height: 12px;
                  overflow: hidden;
                  position: absolute;
                  text-indent: 2px;
                }
                .c3-line, .c3-focused {stroke-width: 3px !important;}
                .c3-bar {stroke: white !important; stroke-width: 1;}
                .c3 text { font-size: 12px; color: grey;}
                .tick line {stroke: white;}
                .c3-axis path {stroke: grey;}
                .c3-circle { opacity: 1 !important; }
                .c3-xgrid-focus {visibility: hidden !important;}
            </style>
        </head>
        <body>
            <script type="text/javascript">
                $(function(){
    
                    $("#output").pivotUI(
                        $.csv.toArrays($("#output").text())
                        , $.extend({
                            renderers: $.extend(
                                $.pivotUtilities.renderers,
                                $.pivotUtilities.c3_renderers,
                                $.pivotUtilities.d3_renderers,
                                $.pivotUtilities.export_renderers
                                ),
                            hiddenAttributes: [""]
                        } 
                        , {
                            onRefresh: function(config) {
                                var config_copy = JSON.parse(JSON.stringify(config));
                                //delete some values which are functions
                                delete config_copy["aggregators"];
                                delete config_copy["renderers"];
                                //delete some bulky default values
                                delete config_copy["rendererOptions"];
                                delete config_copy["localeStrings"];
                                $("#output2").text(JSON.stringify(config_copy, undefined, 2));
                            }
                        }
                        , %(kwargs)s
                        , %(json_kwargs)s)
                    ).show();
                 });
            </script>
            <div id="output" style="display: none;">%(csv)s</div>
    
            <textarea id="output2"
            style="float: left; width: 0px; height: 0px; margin: 0px; opacity:0;" readonly>
            </textarea>
    
            <button onclick="copyTextFunction()">Copy settings</button>
            <script>
            function copyTextFunction() {
                        var copyText = document.getElementById("output2");
                        copyText.select();
                        document.execCommand("copy");
                        }
            </script>
    
        </body>
    </html>
    """
    
    
    def pivot_cht_ui(df, name, url="",
        width="100%", height="500",json_kwargs='',  **kwargs):
      print(name)
      outfile_path = name + '.html'
      with io.open(outfile_path, 'wt', encoding='utf8') as outfile:
          csv = df.to_csv(encoding='utf8')
          if hasattr(csv, 'decode'):
              csv = csv.decode('utf8')
          outfile.write(TEMPLATE %
                dict(csv=csv, kwargs=json.dumps(kwargs),json_kwargs=json_kwargs))
      
      return IFrame(src=url or outfile_path, width=width, height=height)
    

    这使您可以制作图表(google colab 版本,Jupyter notebook 版本略有不同):

    pivot_cht_html(d1)
    

    加载一个空白图表,您可以手动配置(下图已配置)。注意“复制设置”按钮: 如果您按下按钮,它会复制配置的 JSON,然后您可以将其放回图表函数中,以便它运行您配置的图表:

    pivot_cht_html(d1,json_kwargs="""
    {
      "derivedAttributes": {},
      "hiddenAttributes": [
        ""
      ],
      "hiddenFromAggregators": [],
      "hiddenFromDragDrop": [],
      "menuLimit": 500,
      "cols": [
        "weeks"
      ],
      "rows": [],
      "vals": [
        "resurrected_90d"
      ],
      "rowOrder": "key_a_to_z",
      "colOrder": "key_a_to_z",
      "exclusions": {},
      "inclusions": {},
      "unusedAttrsVertical": 85,
      "autoSortUnusedAttrs": false,
      "sorters": {},
      "inclusionsInfo": {},
      "aggregatorName": "Average",
      "rendererName": "Line Chart"
    }
    """)
    

    这远非理想...理想情况下,这应该作为 PR 添加到 pivottablejs 包中。如果我有时间,我会尝试这样做!

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 2017-04-25
      • 2020-12-10
      相关资源
      最近更新 更多