Как поместить процентные бары в DataTable, похожие на pandas style.bar - PullRequest
2 голосов
/ 11 апреля 2019

У меня есть следующий код Python для рендеринга HTML-кода для кадра данных панды:

TIME_FRAMES = ["24h", "7d", "30d", "200d", "1y"]
# Set CSS properties for th elements in dataframe
th_props = [
    ('font-size', '11px'),
    ('text-align', 'center'),
    ('font-weight', 'bold'),
    ('color', '#6d6d6d'),
    ('background-color', '#f7f7f9')
]

# Set CSS properties for td elements in dataframe
td_props = [
    ('font-size', '11px')
]
# Set table styles
styles = [
    dict(selector="th", props=th_props),
    dict(selector="td", props=td_props)
]
results = (df.style.bar(subset=TIME_FRAMES, align='zero', color=['#d65f5f', '#5fba7d'])
                          .set_table_attributes('border="1" class="dataframe table table-hover table-bordered"')
                          .format({t: "{:,.2f}" for t in TIME_FRAMES})
                          .format({"Market Cap (Millions)": "{:,.2f}"})
                          .hide_index()
                          .set_table_styles(styles))

из которого я получаю следующее:

Table obtained using df.style.bar

Теперь я пытаюсь преобразовать эту таблицу в js DataTable, чтобы сделать ее более интерактивной и более привлекательной. Я использую flask только для проверки. Это мой app.py:

from flask import Flask, render_template
import pandas as pd

# Initialize the Flask application
app = Flask(__name__)


@app.route('/')
def index():

    df= pd.read_pickle("df")
    return render_template("index.html",
                           data=df.to_html(table_id="example",
                                           float_format="%.2f",
                                           na_rep="*",
                                           classes="display cell-border nowrap compact",
                                                   border=0,
                                                   index=False))


if __name__ == '__main__':
    app.run(debug=True)

А это index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    <link href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" rel="stylesheet">
    <link href="https://cdn.datatables.net/buttons/1.5.6/css/buttons.dataTables.min.css" rel="stylesheet">
  </head>
  <body>
    <div class="container">
      <div class="header">
      </div>
      {% block content %}
      <div>
        {{data | safe}}
      </div>
      {% endblock %}
    </div>
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    <script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js" type="text/javascript"></script>
    <script src="https://cdn.datatables.net/buttons/1.5.6/js/dataTables.buttons.min.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/pdfmake.min.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/vfs_fonts.js" type="text/javascript"></script>
    <script src="https://cdn.datatables.net/buttons/1.5.6/js/buttons.html5.min.js" type="text/javascript"></script>
    <script type="text/javascript">
    $(document).ready(function() {
        $('#example').DataTable( {
            dom: 'Blfrtip',
            iDisplayLength: 100,
            lengthMenu: [[50,100, -1], [50,100, "All"]],
            buttons: [
                'copyHtml5',
                'excelHtml5',
                'csvHtml5',
                'pdfHtml5'
            ],
            columnDefs: [
              {
                  targets: "_all",
                  className: 'dt-center'
              }
            ]
        } );
    } );
    </script>
  </body>
</html>

Отсюда я получаю эту таблицу:

DataTable

Как мне теперь добавить процентные столбцы, аналогичные тем, которые я получаю, когда генерирую HTML-код напрямую, используя df.style.bar()? Я знаю, что в DataTables есть плагин percentageBars (https://datatables.net/plug-ins/dataRender/percentageBars),, который я уже пробовал. Хотя он не подходит для моей конкретной цели, поскольку он просто отображает все, что больше 100%, как 100%, и я хочу, чтобы столбцы были пропорциональны друг другу, даже если проценты проходят 100%, как я получаю с df.style.bar(). Более того, percentageBars не различает положительные и отрицательные проценты, и мне это тоже нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...