dtale

Python 2025-08-22

  • 现场演示
  • 动画美国的covid-19死亡州死亡
  • 3D散点图
  • 表面图
  • 网络分析

这是什么?

D-Tale是烧瓶后端和React前端的组合,为您带来了一种简单的查看和分析熊猫数据结构的方法。它与ipython笔记本和python/ipython终端无缝集成。当前,该工具支持诸如DataFrame,Series,MultiIndex,DateTimeIndex和RangeIndex之类的熊猫对象。

起源

D-Tale是SAS到Python转换的产物。最初是SAS Insight功能之上的Perl脚本包装器现在是PANDAS数据结构之上的轻量级Web客户端。

在新闻中

  • 可以在Python代码的一行中执行EDA的4个库
  • 反应状态
  • kdnuggets
  • 人类研究所(警告:包含弃用的功能)
  • python字节
  • 烧瓶2020
  • 圣地亚哥Python
  • 媒介:迈向数据科学
  • 媒介:探索性数据分析 - 使用D-Tale
  • EOD注意:使用Python和dtale分析相关性
  • 数据探索现在非常容易带D/ d-Tale
  • 实用业务Python

教程

  • PIP安装Python YouTube频道
  • Machine_learning_2019
  • D-Tale是使用单行代码执行探索性数据分析的最佳库
  • 探索和分析带有d-tale的熊猫数据结构
  • 数据预处理最简单的方法

相关资源

  • 开发D故事时,在烧瓶中冒险
  • 将范围选择添加到反应虚拟化
  • 构建可拖动/可重大的模式
  • 将烧瓶应用程序嵌入流利

内容

  • 从哪里得到它
  • 入门
    • Python终端
    • 作为脚本
    • Jupyter笔记本
    • w/ jupyter服务器代理
    • jupyterhub w/ kubernetes
    • Docker容器
    • Google Colab
    • Kaggle
    • 活页夹
    • r网状
    • 没有数据的启动
    • 命令行
    • 自定义命令行加载程序
    • 嵌入您自己的烧瓶应用程序中
    • 嵌入您自己的Django应用程序中
    • 嵌入精简
    • 在枪支上运行D-Tale,带Redis
    • 配置
    • 验证
    • 预定义过滤器
    • 使用Swifter
    • 宽数据框的行为
  • UI
    • 尺寸/功能区菜单/主菜单
    • 标题
    • 调整列大小
    • 编辑单元
    • 将单元格复制到剪贴板
    • 主菜单功能
      • XArray Operations, Describe, Outlier Detection, Custom Filter, Dataframe Functions, Merge & Stack, Summarize Data, Duplicates, Missing Analysis, Correlations, Predictive Power Score, Heat Map, Highlight Dtypes, Highlight Missing, Highlight Outliers, Highlight Range, Low Variance Flag, Instances, Code Exports, Export CSV, Load Data & Sample Datasets, Refresh Widths, About, Theme, Reload Data, unvin/pin菜单,语言,关闭
    • 列菜单功能
      • 过滤,移动列,隐藏列,删除,重命名,替换,锁,解锁,排序,格式,描述(列分析)
    • 图表
    • 网络查看器
    • 热键
    • 菜单功能取决于浏览器尺寸
  • 对于开发人员
    • 克隆
    • 运行测试
    • 覆盖
    • 格式化JS
    • Docker Development
    • 添加语言支持
  • 全球状态/数据存储
  • 启动行为
  • 文档
  • 依赖性
  • 致谢
  • 执照

从哪里得到它

源代码当前在GitHub上托管:https://github.com/man-group/dtale

最新发布版本的二进制安装程序可在Python软件包索引和Conda-Forge上获得Conda。

dtale -c conda-forge # if you want to also use "Export to PNG" for charts conda install -c plotly python-kaleido">
 # conda
conda install dtale -c conda-forge
# if you want to also use "Export to PNG" for charts
conda install -c plotly python-kaleido
 # or PyPI
pip install dtale 

入门

Pycharm Jupyter

Python终端

这是由Pycharm提供的

Windows防火墙的问题

如果您遇到在Windows上浏览器中查看D-Tale的问题,请尝试在防火墙配置中以“允许应用程序”的方式公开Python。这是一篇不错的文章:如何允许应用程序通过Windows防火墙进行通信

以编程方式可用的其他功能

dtale import pandas as pd df = pd.DataFrame([dict(a=1,b=2,c=3)]) # Assigning a reference to a running D-Tale process. d = dtale .show(df) # Accessing data associated with D-Tale process. tmp = d.data.copy() tmp['d'] = 4 # Altering data associated with D-Tale process # FYI: this will clear any front-end settings you have at the time for this process (filter, sorts, formatting) d.data = tmp # Get raw dataframe w/ any sorting or edits made through the UI d.data # Get raw dataframe similar to '.data' along with any filters applied using the UI d.view_data # Shutting down D-Tale process d.kill() # Using Python's `webbrowser` package it will try and open your server's default browser to this process. d.open_browser() # There is also some helpful metadata about the process. d._data_id # The process's data identifier. d._url # The url to access the process. d2 = dtale .get_instance(d._data_id) # Returns a new reference to the instance running at that data_id. dtale .instances() # Prints a list of all ids & urls of running D-Tale sessions. ">
 import dtale
import pandas as pd

df = pd . DataFrame ([ dict ( a = 1 , b = 2 , c = 3 )])

# Assigning a reference to a running D-Tale process.
d = dtale . show ( df )

# Accessing data associated with D-Tale process.
tmp = d . data . copy ()
tmp [ 'd' ] = 4

# Altering data associated with D-Tale process
# FYI: this will clear any front-end settings you have at the time for this process (filter, sorts, formatting)
d . data = tmp

# Get raw dataframe w/ any sorting or edits made through the UI
d . data

# Get raw dataframe similar to '.data' along with any filters applied using the UI
d . view_data

# Shutting down D-Tale process
d . kill ()

# Using Python's `webbrowser` package it will try and open your server's default browser to this process.
d . open_browser ()

# There is also some helpful metadata about the process.
d . _data_id  # The process's data identifier.
d . _url  # The url to access the process.

d2 = dtale . get_instance ( d . _data_id )  # Returns a new reference to the instance running at that data_id.

dtale . instances ()  # Prints a list of all ids & urls of running D-Tale sessions. 

重复数据检查

为了防止用户多次加载相同数据到D-Tale的用户,从而吞噬了宝贵的记忆,我们对重复输入数据进行了宽松的检查。支票运行以下内容:

  • 行和列计数是否与先前加载的数据相同?
  • 列的名称和顺序是否与先前加载的数据相同?

如果这两个条件都是正确的,则将向您呈现错误以及指向先前加载的数据的链接。这是互动外观的示例:

作为脚本

D-Tale可以通过在您的dtale .show命令中添加subprocess = false作为脚本运行。这是一个示例脚本:

dtale import pandas as pd if __name__ == '__main__': dtale .show(pd.DataFrame([1,2,3,4,5]), subprocess=False)">
 import dtale
import pandas as pd

if __name__ == '__main__' :
      dtale . show ( pd . DataFrame ([ 1 , 2 , 3 , 4 , 5 ]), subprocess = False )

Jupyter笔记本

在任何jupyter(ipython)内部执行这样的单元格中,将在输出单元格中显示d-tale的小实例。这里有一些例子:

dtale .show 任务 实例

如果您正在运行ipython <= 5.0,则还可以在显示的最新实例中调整输出单元的大小:

值得注意的一件事是,您在标准浏览器版本中看到的许多模态弹出窗口现在都将打开单独的浏览器窗口以进行空间相关:

列菜单 相关性 描述 列分析 实例

w/ jupyter服务器代理

JupyterHub具有一个扩展名,允许使用用户代理端口,JupyterHub Server代理

对我来说,这个扩展似乎是在Kubernetes中运行D-Tale的最佳解决方案。这是使用它的方法:

dtale import dtale .app as dtale _app dtale _app.JUPYTER_SERVER_PROXY = True dtale .show(pd.DataFrame([1,2,3]))">
 import pandas as pd

import dtale
import dtale . app as dtale _app

dtale _app . JUPYTER_SERVER_PROXY = True

dtale . show ( pd . DataFrame ([ 1 , 2 , 3 ]))

请注意,命令dtale _app.jupyter_server_proxy = true这将确保将与Jupyter Server Proxy Application root Prefix一起使用任何D-Tale实例:

/user/{jupyter用户名}/proxy/{ dtale实例port}/

要注意的一件事是,如果您尝试在笔记本中查看d-tale实例的_main_url,它将不包括主机名或端口:

dtale import dtale .app as dtale _app dtale _app.JUPYTER_SERVER_PROXY = True d = dtale .show(pd.DataFrame([1,2,3])) d._main_url # /user/johndoe/proxy/40000/ dtale /main/1">
 import pandas as pd

import dtale
import dtale . app as dtale _app

dtale _app . JUPYTER_SERVER_PROXY = True

d = dtale . show ( pd . DataFrame ([ 1 , 2 , 3 ]))
d . _main_url # /user/johndoe/proxy/40000/ dtale /main/1

这是因为很难漫长地找出笔记本上运行的主机/端口。因此,如果您想查看_main_url,请务必将其序列:

http [s]:// [jupyterhub主机]:[jupyterhub端口]

如果出于某种原因,JupyterHub更改其API,以使应用程序root更改您也可以通过将app_root参数用于show()函数:

dtale import dtale .app as dtale _app dtale .show(pd.DataFrame([1,2,3]), app_root='/user/johndoe/proxy/40000/`)">
 import pandas as pd

import dtale
import dtale . app as dtale _app

dtale . show ( pd . DataFrame ([ 1 , 2 , 3 ]), app_root = ' / user / johndoe / proxy / 40000 / ` )

使用此参数仅将应用程序根应用于该特定实例,因此您必须将其包含在每个呼叫show()中。

jupyterhub w/ kubernetes

请阅读这篇文章

Docker容器

如果您在Docker容器中安装了D-Tale,请在Docker Run命令中添加以下参数。

在Mac上

docker run -h ` hostname ` -p 40000:40000
  • - h这将允许主机名(而不是docker容器的PID)在构建d-tale URL时可用
  • -p访问端口40000,这是运行D-Tale的默认端口

在Windows上

docker run -p 40000:40000
  • -p访问端口40000,这是运行D-Tale的默认端口
  • D-Tale URL将为http://127.**0.*0.1:40000/

其他一切

docker run -h ` hostname ` --network host
  • - h这将允许主机名(而不是docker容器的PID)在构建d-tale URL时可用
  • - 网络主机,这将允许运行D-Tale流程所需的尽可能多的端口

Google Colab

这是一个托管的笔记本网站,感谢Colab的内部功能Google.colab.output.eval_js和JS功能Google.colab.kernel.kernel.proexyport用户可以在其笔记本中运行D-Tale。

免责声明:在此服务中使用d-tale时,将use_colab设置为true很重要。这是一个示例:

dtale import dtale .app as dtale _app dtale _app.USE_COLAB = True dtale .show(pd.DataFrame([1,2,3]))">
 import pandas as pd

import dtale
import dtale . app as dtale _app

dtale _app . USE_COLAB = True

dtale . show ( pd . DataFrame ([ 1 , 2 , 3 ]))

如果这对您不起作用,请尝试使用use_ngrok,这将在下一部分中描述。

Kaggle

这是另一个托管的笔记本网站,由于烧瓶_NGrok的工作,用户可以在笔记本中运行D-Tale。

免责声明:在此服务中使用d-tale时,您将use_ngrok设置为true是导入的。在运行此示例之前,请确保运行PIP安装烧瓶-ngrok。这是一个示例:

dtale import dtale .app as dtale _app dtale _app.USE_NGROK = True dtale .show(pd.DataFrame([1,2,3]))">
 import pandas as pd

import dtale
import dtale . app as dtale _app

dtale _app . USE_NGROK = True

dtale . show ( pd . DataFrame ([ 1 , 2 , 3 ]))

这是每个视频教程:

服务 教程 addtl注释
Google Colab
Kaggle 确保在笔记本的设置下将“ Internet”切换切换为“ On”,以便您可以从PIP中安装鸡蛋

重要的是要注意,使用NGrok将限制您每台连接20个连接,因此,如果您看到此错误:

等待一会儿,应该让您再次工作。我正在积极寻找与我为Google Colab所做的类似的更可持续的解决方案。

活页夹

我已经建立了一个存储库,其中显示了如何在粘合剂内运行D-Tale的示例。

重要的应付是:

  • 您必须安装Jupyter-Server-Proxy
  • 查看环境.yml文件以查看如何将其添加到您的环境中
  • 查看后构建文件,以了解如何在启动时激活它

r网状

我能够使用网状启用R在R中运行D-Tale。这是一个示例:

dtale ') df <- read.csv('https://vincentarelbundock.g*ith*u*b.io/Rdatasets/csv/boot/acme.csv') dtale $show(df, subprocess=FALSE, open_browser=TRUE)">
library('reticulate')
dtale <- import(' dtale ')
df <- read.csv('https://vincentarelbundock.g*ith*u*b.io/Rdatasets/csv/boot/acme.csv')
dtale $show(df, subprocess=FALSE, open_browser=TRUE)

现在,这样做的问题是D-Tale并未作为子过程运行,因此它将阻止您的R控制台,并且您将丢失以下功能:

  • 从R控制台操纵数据状态
  • 将更多数据添加到D故事

Open_Browser =不需要True,如果您在计算机上没有安装默认的浏览器,则将无法使用。如果您不使用该参数,请简单地复制并粘贴在您选择的浏览器中打印到控制台的URL。

我将对为什么R似乎不喜欢使用Python子流程(不确定是否具有网状管理Python状态)并在此线程中发布任何发现。

这是一些有用的设置链接:

网状

安装Python软件包

没有数据的启动

现在可以在没有前面加载数据的情况下运行D-Tale。因此,只需致电dtale .show(),这将为您启动应用程序,当您去查看它时,您将提供一个屏幕,您可以在其中上传CSV或TSV文件以获取数据。

加载文件后,它将带您直接进入由您加载的文件中的数据组成的标准数据网格。这可能会使在像Kubernetes这样的容器管理系统中将其用作按需应用程序。您开始并按需停止这些,并向您提供一个新实例,以将任何CSV或TSV文件加载到!

命令行

基本CLI选项(运行dtale - 查看所有可用选项)

支柱 描述
- 主持人 您要使用的主机的名称(由于socket.gethostname(),最可能不需要)
- 港口 您要分配给D-Tale实例的端口
- 姓名 您可以分配给D-Tale实例的可选名称(这将显示在&Instances弹出窗口中)</td> </tr> <tr> <td align="left"> - 调试</td> <td align="left">为您的D-Tale实例打开烧瓶的“调试”模式</td> </tr> <tr> <td align="left"> - 不加</td> <td align="left">旗帜以关闭自动扑克次级进程(一个小时的不活动后杀死D-Tale实例),适用于长期展示</td> </tr> <tr> <td align="left"> - 开机浏览器</td> <td align="left">标志以自动打开服务器的默认浏览器到D-Tale实例</td> </tr> <tr> <td align="left"> - 力量</td> <td align="left">标志迫使d-tale尝试在您指定的端口上杀死任何预先存在的过程,以便它可以使用它</td> </tr> </tbody> </table></markdown-accessiblity-table><p dir="auto">从<strong>ArcticDB</strong> (高性能,无服务器数据框数据库)加载数据(这需要安装<strong>arcticdb</strong>或<strong>dtale [arcticdb]</strong> ) </p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="dtale --arcticdb-uri lmdb:///<path> --arcticdb-library jdoe.my_lib --arcticdb-symbol my_symbol"><pre> <span class="notranslate keguazi">dtale --arcticdb-uri lmdb:/// <span class="pl-k"><</span> path <span class="pl-k">></span> --arcticdb-library jdoe.my_lib --arcticdb-symbol my_symbol</span></pre></div> <p dir="auto">如果您想将存储机制更改为ArcticDB,请添加-arcticdb-use_store标志</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="dtale --arcticdb-uri lmdb:///<path> --arcticdb-library my_lib --arcticdb-symbol my_symbol --arcticdb-use_store"><pre> <span class="notranslate keguazi">dtale --arcticdb-uri lmdb:/// <span class="pl-k"><</span> path <span class="pl-k">></span> --arcticdb-library my_lib --arcticdb-symbol my_symbol --arcticdb-use_store</span></pre></div> <p dir="auto">从<strong>北极</strong>加载数据(PANDAS DataFrames的高性能数据存储)(这需要安装<strong>北极</strong>或<strong>dtale [Arctic]</strong> ) </p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="dtale --arctic-uri mongodb://localhost:27027 --arctic-library my_lib --arctic-symbol my_symbol --arctic-start 20130101 --arctic-end 20161231"><pre> <span class="notranslate keguazi">dtale --arctic-uri mongodb://localhost:27027 --arctic-library my_lib --arctic-symbol my_symbol --arctic-start 20130101 --arctic-end 20161231</span></pre></div> <p dir="auto">从<strong>CSV</strong>加载数据</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="dtale --csv-path /home/jdoe/my_csv.csv --csv-parse_dates date"><pre> <span class="notranslate keguazi">dtale --csv-path /home/jdoe/my_csv.csv --csv-parse_dates date</span></pre></div> <p dir="auto">从<strong>Excel</strong>加载数据</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="<span class=" notranslate keguazi>dtale --excel-path /home/jdoe/my_csv.xlsx --excel-parse_dates date dtale --excel-path /home/jdoe/my_csv.xls --excel-parse_dates date"><pre> dtale --excel-path /home/jdoe/my_csv.xlsx --excel-parse_dates date dtale --excel-path /home/jdoe/my_csv.xls --excel-parse_dates date</pre> </div> <p dir="auto">从<strong>JSON</strong>加载数据</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="dtale --json-path /home/jdoe/my_json.json --json-parse_dates date"><pre> <span class="notranslate keguazi">dtale --json-path /home/jdoe/my_json.json --json-parse_dates date</span></pre></div> <p dir="auto">或者</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="dtale --json-path http://*json-*e*ndpoint --json-parse_dates date"><pre>dtale --json-path http://*json-*e*ndpoint --json-parse_dates date</pre></div> <p dir="auto">从<strong>R数据集</strong>加载数据</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="<span class=" notranslate keguazi>dtale --r-path /home/jdoe/my_dataset.rda"><pre> <span class="notranslate keguazi">dtale --r-path /home/jdoe/my_dataset.rda</span></pre> </div> <p dir="auto">从<strong>sqlite DB文件</strong>加载数据</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="dtale --sqlite-path /home/jdoe/test.sqlite3 --sqlite-table test_table"><pre> <span class="notranslate keguazi">dtale --sqlite-path /home/jdoe/test.sqlite3 --sqlite-table test_table</span></pre></div> <div class="markdown-heading" dir="auto"><h3>自定义命令行加载程序</h3></div> <p dir="auto">从自<strong>定义</strong>加载器加载数据</p> <ul dir="auto"> <li>使用dtale _cli_loaders环境变量,为包含一些Python模块的位置指定路径</li> <li>任何包含全局变量loader_key&loader_props的Python模块都将被选为自定义加载程序<ul dir="auto"> <li>LOADER_KEY:将与加载程序关联的键。默认情况下,您将获得<strong>北极</strong>和<strong>CSV</strong> (如果使用其中之一是您的关键之一,它将覆盖这些)</li> <li> LOADER_PROPS:可供指定的单个道具。<ul dir="auto"> <li>例如,使用北极,我们有主机,库,符号,开始和结束。</li> <li>如果您将此属性作为空列表留下,那么您的加载程序将被视为标志。例如,我们不使用所有北极属性,而是我们简单地指定 - arctic(这在北极的情况下都无法正常工作,因为这取决于所有这些属性)</li> </ul> </li> </ul> </li> <li>您还需要指定一个具有以下签名def find_loader(kwargs)的函数,该函数返回返回dataframe或无的函数</li> <li>这是自定义加载程序的示例: </li> </ul> <div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="from <span class=" notranslate keguazi>dtale.cli.clickutils import get_loader_options ''' IMPORTANT!!! This global variable is required for building any customized CLI loader. When find loaders on startup it will search for any modules containing the global variable LOADER_KEY. ''' LOADER_KEY = 'testdata' LOADER_PROPS = ['rows', 'columns'] def test_data(rows, columns): import pandas as pd import numpy as np import random from past.utils import old_div from pandas.tseries.offsets import Day from dtale .utils import dict_merge import string now = pd.Timestamp(pd.Timestamp('now').date()) dates = pd.date_range(now - Day(364), now) num_of_securities = max(old_div(rows, len(dates)), 1) # always have at least one security securities = [ dict(security_id=100000 + sec_id, int_val=random.randint(1, 100000000000), str_val=random.choice(string.ascii_letters) * 5) for sec_id in range(num_of_securities) ] data = pd.concat([ pd.DataFrame([dict_merge(dict(date=date), sd) for sd in securities]) for date in dates ], ignore_index=True)[['date', 'security_id', 'int_val', 'str_val']] col_names = ['Col{}'.format(c) for c in range(columns)] return pd.concat([data, pd.DataFrame(np.random.randn(len(data), columns), columns=col_names)], axis=1) # IMPORTANT!!! This function is required for building any customized CLI loader. def find_loader(kwargs): test_data_opts = get_loader_options(LOADER_KEY, LOADER_PROPS, kwargs) if len([f for f in test_data_opts.values() if f]): def _testdata_loader(): return test_data(int(test_data_opts.get('rows', 1000500)), int(test_data_opts.get('columns', 96))) return _testdata_loader return None"><pre> <span class="pl-k">from</span> <span class="pl-s1">dtale</span> . <span class="pl-s1">cli</span> . <span class="pl-s1">clickutils</span> <span class="pl-k">import</span> <span class="pl-s1">get_loader_options</span> <span class="pl-s">'''</span> <span class="pl-s"> IMPORTANT!!! This global variable is required for building any customized CLI loader.</span> <span class="pl-s"> When find loaders on startup it will search for any modules containing the global variable LOADER_KEY.</span> <span class="pl-s">'''</span> <span class="pl-c1">LOADER_KEY</span> <span class="pl-c1">=</span> <span class="pl-s">'testdata'</span> <span class="pl-c1">LOADER_PROPS</span> <span class="pl-c1">=</span> [ <span class="pl-s">'rows'</span> , <span class="pl-s">'columns'</span> ] <span class="pl-k">def</span> <span class="pl-en">test_data</span> ( <span class="pl-s1">rows</span> , <span class="pl-s1">columns</span> ): <span class="pl-k">import</span> <span class="pl-s1">pandas</span> <span class="pl-k">as</span> <span class="pl-s1">pd</span> <span class="pl-k">import</span> <span class="pl-s1">numpy</span> <span class="pl-k">as</span> <span class="pl-s1">np</span> <span class="pl-k">import</span> <span class="pl-s1">random</span> <span class="pl-k">from</span> <span class="pl-s1">past</span> . <span class="pl-s1">utils</span> <span class="pl-k">import</span> <span class="pl-s1">old_div</span> <span class="pl-k">from</span> <span class="pl-s1">pandas</span> . <span class="pl-s1">tseries</span> . <span class="pl-s1">offsets</span> <span class="pl-k">import</span> <span class="pl-v">Day</span> <span class="pl-k">from</span> <span class="pl-s1">dtale</span> . <span class="pl-s1">utils</span> <span class="pl-k">import</span> <span class="pl-s1">dict_merge</span> <span class="pl-k">import</span> <span class="pl-s1">string</span> <span class="pl-s1">now</span> <span class="pl-c1">=</span> <span class="pl-s1">pd</span> . <span class="pl-c1">Timestamp</span> ( <span class="pl-s1">pd</span> . <span class="pl-c1">Timestamp</span> ( <span class="pl-s">'now'</span> ). <span class="pl-c1">date</span> ()) <span class="pl-s1">dates</span> <span class="pl-c1">=</span> <span class="pl-s1">pd</span> . <span class="pl-c1">date_range</span> ( <span class="pl-s1">now</span> <span class="pl-c1">-</span> <span class="pl-en">Day</span> ( <span class="pl-c1">364</span> ), <span class="pl-s1">now</span> ) <span class="pl-s1">num_of_securities</span> <span class="pl-c1">=</span> <span class="pl-en">max</span> ( <span class="pl-en">old_div</span> ( <span class="pl-s1">rows</span> , <span class="pl-en">len</span> ( <span class="pl-s1">dates</span> )), <span class="pl-c1">1</span> ) <span class="pl-c"># always have at least one security</span> <span class="pl-s1">securities</span> <span class="pl-c1">=</span> [ <span class="pl-en">dict</span> ( <span class="pl-s1">security_id</span> <span class="pl-c1">=</span> <span class="pl-c1">100000</span> <span class="pl-c1">+</span> <span class="pl-s1">sec_id</span> , <span class="pl-s1">int_val</span> <span class="pl-c1">=</span> <span class="pl-s1">random</span> . <span class="pl-c1">randint</span> ( <span class="pl-c1">1</span> , <span class="pl-c1">100000000000</span> ), <span class="pl-s1">str_val</span> <span class="pl-c1">=</span> <span class="pl-s1">random</span> . <span class="pl-c1">choice</span> ( <span class="pl-s1">string</span> . <span class="pl-c1">ascii_letters</span> ) <span class="pl-c1">*</span> <span class="pl-c1">5</span> ) <span class="pl-k">for</span> <span class="pl-s1">sec_id</span> <span class="pl-c1">in</span> <span class="pl-en">range</span> ( <span class="pl-s1">num_of_securities</span> ) ] <span class="pl-s1">data</span> <span class="pl-c1">=</span> <span class="pl-s1">pd</span> . <span class="pl-c1">concat</span> ([ <span class="pl-s1">pd</span> . <span class="pl-c1">DataFrame</span> ([ <span class="pl-en">dict_merge</span> ( <span class="pl-en">dict</span> ( <span class="pl-s1">date</span> <span class="pl-c1">=</span> <span class="pl-s1">date</span> ), <span class="pl-s1">sd</span> ) <span class="pl-k">for</span> <span class="pl-s1">sd</span> <span class="pl-c1">in</span> <span class="pl-s1">securities</span> ]) <span class="pl-k">for</span> <span class="pl-s1">date</span> <span class="pl-c1">in</span> <span class="pl-s1">dates</span> ], <span class="pl-s1">ignore_index</span> <span class="pl-c1">=</span> <span class="pl-c1">True</span> )[[ <span class="pl-s">'date'</span> , <span class="pl-s">'security_id'</span> , <span class="pl-s">'int_val'</span> , <span class="pl-s">'str_val'</span> ]] <span class="pl-s1">col_names</span> <span class="pl-c1">=</span> [ <span class="pl-s">'Col{}'</span> . <span class="pl-c1">format</span> ( <span class="pl-s1">c</span> ) <span class="pl-k">for</span> <span class="pl-s1">c</span> <span class="pl-c1">in</span> <span class="pl-en">range</span> ( <span class="pl-s1">columns</span> )] <span class="pl-k">return</span> <span class="pl-s1">pd</span> . <span class="pl-c1">concat</span> ([ <span class="pl-s1">data</span> , <span class="pl-s1">pd</span> . <span class="pl-c1">DataFrame</span> ( <span class="pl-s1">np</span> . <span class="pl-c1">random</span> . <span class="pl-c1">randn</span> ( <span class="pl-en">len</span> ( <span class="pl-s1">data</span> ), <span class="pl-s1">columns</span> ), <span class="pl-s1">columns</span> <span class="pl-c1">=</span> <span class="pl-s1">col_names</span> )], <span class="pl-s1">axis</span> <span class="pl-c1">=</span> <span class="pl-c1">1</span> ) <span class="pl-c"># IMPORTANT!!! This function is required for building any customized CLI loader.</span> <span class="pl-k">def</span> <span class="pl-en">find_loader</span> ( <span class="pl-s1">kwargs</span> ): <span class="pl-s1">test_data_opts</span> <span class="pl-c1">=</span> <span class="pl-en">get_loader_options</span> ( <span class="pl-c1">LOADER_KEY</span> , <span class="pl-c1">LOADER_PROPS</span> , <span class="pl-s1">kwargs</span> ) <span class="pl-k">if</span> <span class="pl-en">len</span> ([ <span class="pl-s1">f</span> <span class="pl-k">for</span> <span class="pl-s1">f</span> <span class="pl-c1">in</span> <span class="pl-s1">test_data_opts</span> . <span class="pl-c1">values</span> () <span class="pl-k">if</span> <span class="pl-s1">f</span> ]): <span class="pl-k">def</span> <span class="pl-en">_testdata_loader</span> (): <span class="pl-k">return</span> <span class="pl-en">test_data</span> ( <span class="pl-en">int</span> ( <span class="pl-s1">test_data_opts</span> . <span class="pl-c1">get</span> ( <span class="pl-s">'rows'</span> , <span class="pl-c1">1000500</span> )), <span class="pl-en">int</span> ( <span class="pl-s1">test_data_opts</span> . <span class="pl-c1">get</span> ( <span class="pl-s">'columns'</span> , <span class="pl-c1">96</span> ))) <span class="pl-k">return</span> <span class="pl-s1">_testdata_loader</span> <span class="pl-k">return</span> <span class="pl-c1">None</span></pre> </div> <p dir="auto">在此示例中,我们简单地基于命令行中指定的维度来构建一个带有一些虚拟数据的数据框:</p> <ul dir="auto"> <li> - 测台data行</li> <li> - 测塔塔柱</li> </ul> <p dir="auto">您将如何使用此加载程序: </p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="dtale_CLI_LOADERS=./path_to_loaders bash -c ' <span class=" notranslate keguazi>dtale --testdata-rows 10 --testdata-columns 5'"><pre> dtale _CLI_LOADERS=./path_to_loaders bash -c <span class="pl-s"><span class="pl-pds">'</span> dtale --testdata-rows 10 --testdata-columns 5 <span class="pl-pds">'</span></span></pre> </div> <div class="markdown-heading" dir="auto"><h3>验证</h3></div> <p dir="auto">您可以选择通过将以下内容添加到您的d-tale .Ini文件(在此处说明)来选择可选身份验证: </p> <div class="highlight highlight-source-ini notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="[auth] active = True username = johndoe password = 1337h4xOr"><pre> <span class="pl-en">[auth]</span> <span class="pl-k">active</span> = True <span class="pl-k">username</span> = johndoe <span class="pl-k">password</span> = 1337h4xOr</pre></div> <p dir="auto">或者您可以致电以下内容: </p> <div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import <span class=" notranslate keguazi>dtale.global_state as global_state global_state.set_auth_settings({'active': True, 'username': 'johndoe', 'password': '1337h4x0r'})"><pre> <span class="pl-k">import</span> <span class="pl-s1">dtale</span> . <span class="pl-s1">global_state</span> <span class="pl-k">as</span> <span class="pl-s1">global_state</span> <span class="pl-s1">global_state</span> . <span class="pl-c1">set_auth_settings</span> ({ <span class="pl-s">'active'</span> : <span class="pl-c1">True</span> , <span class="pl-s">'username'</span> : <span class="pl-s">'johndoe'</span> , <span class="pl-s">'password'</span> : <span class="pl-s">'1337h4x0r'</span> })</pre> </div> <p dir="auto">如果您在最初启动d-tale之前已经这样做,则将应用身份验证。如果您在开始D-Tale后添加此内容,则必须杀死您的服务并重新开始。</p> <p dir="auto">打开您的D-Tale会话时,您将提供这样的屏幕:</p> <p dir="auto"></p> <p dir="auto">从那里,您可以输入您在.ini文件中设置的凭据或在dtale .global_state.set_auth_settings的呼叫中,您将被带到正常网格中。现在,您将在主菜单中有一个其他选项可以注销:</p> <p dir="auto"></p> <div class="markdown-heading" dir="auto"><h3>实例设置</h3></div> <p dir="auto">用户可以在dtale函数中以编程方式在其实例中以编程方式设置前端属性,也可以通过在其实例上调用update_settings函数来设置前端属性。例如: </p> <div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import <span class=" notranslate keguazi>dtale import pandas as pd df = pd.DataFrame(dict( a=[1,2,3,4,5], b=[6,7,8,9,10], c=['a','b','c','d','e'] )) dtale .show( df, locked=['c'], column_formats={'a': {'fmt': '0.0000'}}, nan_display='...', background_mode='heatmap-col', sort=[('a','DESC')], vertical_headers=True, )"><pre> <span class="pl-k">import</span> <span class="pl-s1">dtale</span> <span class="pl-k">import</span> <span class="pl-s1">pandas</span> <span class="pl-k">as</span> <span class="pl-s1">pd</span> <span class="pl-s1">df</span> <span class="pl-c1">=</span> <span class="pl-s1">pd</span> . <span class="pl-c1">DataFrame</span> ( <span class="pl-en">dict</span> ( <span class="pl-s1">a</span> <span class="pl-c1">=</span> [ <span class="pl-c1">1</span> , <span class="pl-c1">2</span> , <span class="pl-c1">3</span> , <span class="pl-c1">4</span> , <span class="pl-c1">5</span> ], <span class="pl-s1">b</span> <span class="pl-c1">=</span> [ <span class="pl-c1">6</span> , <span class="pl-c1">7</span> , <span class="pl-c1">8</span> , <span class="pl-c1">9</span> , <span class="pl-c1">10</span> ], <span class="pl-s1">c</span> <span class="pl-c1">=</span> [ <span class="pl-s">'a'</span> , <span class="pl-s">'b'</span> , <span class="pl-s">'c'</span> , <span class="pl-s">'d'</span> , <span class="pl-s">'e'</span> ] )) <span class="pl-s1">dtale</span> . <span class="pl-c1">show</span> ( <span class="pl-s1">df</span> , <span class="pl-s1">locked</span> <span class="pl-c1">=</span> [ <span class="pl-s">'c'</span> ], <span class="pl-s1">column_formats</span> <span class="pl-c1">=</span> { <span class="pl-s">'a'</span> : { <span class="pl-s">'fmt'</span> : <span class="pl-s">'0.0000'</span> }}, <span class="pl-s1">nan_display</span> <span class="pl-c1">=</span> <span class="pl-s">'...'</span> , <span class="pl-s1">background_mode</span> <span class="pl-c1">=</span> <span class="pl-s">'heatmap-col'</span> , <span class="pl-s1">sort</span> <span class="pl-c1">=</span> [( <span class="pl-s">'a'</span> , <span class="pl-s">'DESC'</span> )], <span class="pl-s1">vertical_headers</span> <span class="pl-c1">=</span> <span class="pl-c1">True</span> , )</pre> </div> <p dir="auto">或者</p> <div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import <span class=" notranslate keguazi>dtale import pandas as pd df = pd.DataFrame(dict( a=[1,2,3,4,5], b=[6,7,8,9,10], c=['a','b','c','d','e'] )) d = dtale .show( df ) d.update_settings( locked=['c'], column_formats={'a': {'fmt': '0.0000'}}, nan_display='...', background_mode='heatmap-col', sort=[('a','DESC')], vertical_headers=True, ) d"><pre> <span class="pl-k">import</span> <span class="pl-s1">dtale</span> <span class="pl-k">import</span> <span class="pl-s1">pandas</span> <span class="pl-k">as</span> <span class="pl-s1">pd</span> <span class="pl-s1">df</span> <span class="pl-c1">=</span> <span class="pl-s1">pd</span> . <span class="pl-c1">DataFrame</span> ( <span class="pl-en">dict</span> ( <span class="pl-s1">a</span> <span class="pl-c1">=</span> [ <span class="pl-c1">1</span> , <span class="pl-c1">2</span> , <span class="pl-c1">3</span> , <span class="pl-c1">4</span> , <span class="pl-c1">5</span> ], <span class="pl-s1">b</span> <span class="pl-c1">=</span> [ <span class="pl-c1">6</span> , <span class="pl-c1">7</span> , <span class="pl-c1">8</span> , <span class="pl-c1">9</span> , <span class="pl-c1">10</span> ], <span class="pl-s1">c</span> <span class="pl-c1">=</span> [ <span class="pl-s">'a'</span> , <span class="pl-s">'b'</span> , <span class="pl-s">'c'</span> , <span class="pl-s">'d'</span> , <span class="pl-s">'e'</span> ] )) <span class="pl-s1">d</span> <span class="pl-c1">=</span> <span class="pl-s1">dtale</span> . <span class="pl-c1">show</span> ( <span class="pl-s1">df</span> ) <span class="pl-s1">d</span> . <span class="pl-c1">update_settings</span> ( <span class="pl-s1">locked</span> <span class="pl-c1">=</span> [ <span class="pl-s">'c'</span> ], <span class="pl-s1">column_formats</span> <span class="pl-c1">=</span> { <span class="pl-s">'a'</span> : { <span class="pl-s">'fmt'</span> : <span class="pl-s">'0.0000'</span> }}, <span class="pl-s1">nan_display</span> <span class="pl-c1">=</span> <span class="pl-s">'...'</span> , <span class="pl-s1">background_mode</span> <span class="pl-c1">=</span> <span class="pl-s">'heatmap-col'</span> , <span class="pl-s1">sort</span> <span class="pl-c1">=</span> [( <span class="pl-s">'a'</span> , <span class="pl-s">'DESC'</span> )], <span class="pl-s1">vertical_headers</span> <span class="pl-c1">=</span> <span class="pl-c1">True</span> , ) <span class="pl-s1">d</span></pre> </div> <p dir="auto">这是可用的每个实例设置的简短描述:</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"> show_columns</h4></div> <p dir="auto">您想要在网格中显示的列名列表。其他任何东西都会被隐藏。</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"> hide_columns</h4></div> <p dir="auto">您最初希望从网格显示中隐藏的列名列表。</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"> column_formats</h4></div> <p dir="auto">列名称键的字典及其前端显示配置。以下是不同格式配置的示例:</p> <ul dir="auto"> <li>数字:{'fmt':'0.00000'}</li> <li>细绳:<ul dir="auto"> <li> {'fmt':{'truncate':10}}截断字符串值不超过10个字符,然后是椭圆</li> <li>{'fmt':{'link':true}}如果您的字符串是URL将它们转换为可单击的链接</li> <li>{'fmt':{'html':true}}如果您的字符串是HTML片段,则将其呈现为HTML</li> </ul> </li> <li>日期:{'fmt':'嗯</li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"> nan_display</h4></div> <p dir="auto">将数据框中的所有NAN值发送到浏览器时,将其转换为此(实际上并没有更改数据框的状态)</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"> 种类</h4></div> <p dir="auto">对数据框进行排序(例如:[('a','asc'),('b','desc'))的元组列表))</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"> 锁定</h4></div> <p dir="auto">在向左滚动时,将锁定在网格右侧的列名列表。</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"> background_mode</h4></div> <p dir="auto">一个字符串,表示D-Tale中可用的众多背景显示之一。选项是:</p> <ul dir="auto"> <li> Heatmap-All:打开所有数字列的热图,其中颜色由所有数字列的值范围确定</li> <li>Heatmap-Col:打开所有数字列的热图,其中颜色由列中的值范围确定</li> <li>热图表 - [列名]:打开特定列的热图突出显示</li> <li>dtypes:基于数据类型的突出显示列</li> <li>缺少:突出显示所有缺失的值(np.nan,空字符串,所有空间的字符串)</li> <li>离群值:突出显示任何异常值</li> <li>范围:突出显示在“ range_highlights”选项中输入的任何匹配器的值</li> <li>低变量:突出显示差异较低的值</li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"> range_highlights</h4></div> <p dir="auto">列名称键和范围配置的字典,如果存在该列的值,则将其遮蔽该颜色。这是一个示例输入: </p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="'a': { 'active': True, 'equals': {'active': True, 'value': 3, 'color': {'r': 255, 'g': 245, 'b': 157, 'a': 1}}, # light yellow 'greaterThan': {'active': True, 'value': 3, 'color': {'r': 80, 'g': 227, 'b': 194, 'a': 1}}, # mint green 'lessThan': {'active': True, 'value': 3, 'color': {'r': 245, 'g': 166, 'b': 35, 'a': 1}}, # orange }"><pre class="notranslate">'a': { 'active': True, 'equals': {'active': True, 'value': 3, 'color': {'r': 255, 'g': 245, 'b': 157, 'a': 1}}, # light yellow 'greaterThan': {'active': True, 'value': 3, 'color': {'r': 80, 'g': 227, 'b': 194, 'a': 1}}, # mint green 'lessThan': {'active': True, 'value': 3, 'color': {'r': 245, 'g': 166, 'b': 35, 'a': 1}}, # orange } </pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Vertical_headers</h4></div> <p dir="auto">如果设置为true,则网格中的标头将垂直旋转90度以节省宽度。</p> <div class="markdown-heading" dir="auto"><h3>预定义过滤器</h3></div> <p dir="auto">用户可以使用以下代码段来构建自己的自定义过滤器,可以从前端使用: </p> <div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import pandas as pd import <span class=" notranslate keguazi>dtale import dtale .predefined_filters as predefined_filters import dtale .global_state as global_state global_state.set_app_settings(dict(open_predefined_filters_on_startup=True)) predefined_filters.set_filters([ { "name": "A and B > 2", "column": "A", "description": "Filter A with B greater than 2", "handler": lambda df, val: df[(df["A"] == val) & (df["B"] > 2)], "input_type": "input", "default": 1, "active": False, }, { "name": "A and (B % 2) == 0", "column": "A", "description": "Filter A with B mod 2 equals zero (is even)", "handler": lambda df, val: df[(df["A"] == val) & (df["B"] % 2 == 0)], "input_type": "select", "default": 1, "active": False, }, { "name": "A in values and (B % 2) == 0", "column": "A", "description": "A is within a group of values and B mod 2 equals zero (is even)", "handler": lambda df, val: df[df["A"].isin(val) & (df["B"] % 2 == 0)], "input_type": "multiselect", "default": [1], "active": True, } ]) df = pd.DataFrame( ([[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]), columns=['A', 'B', 'C', 'D', 'E', 'F'] ) dtale .show(df)"><pre> <span class="pl-k">import</span> <span class="pl-s1">pandas</span> <span class="pl-k">as</span> <span class="pl-s1">pd</span> <span class="pl-k">import</span> <span class="pl-s1">dtale</span> <span class="pl-k">import</span> <span class="pl-s1">dtale</span> . <span class="pl-s1">predefined_filters</span> <span class="pl-k">as</span> <span class="pl-s1">predefined_filters</span> <span class="pl-k">import</span> <span class="pl-s1">dtale</span> . <span class="pl-s1">global_state</span> <span class="pl-k">as</span> <span class="pl-s1">global_state</span> <span class="pl-s1">global_state</span> . <span class="pl-c1">set_app_settings</span> ( <span class="pl-en">dict</span> ( <span class="pl-s1">open_predefined_filters_on_startup</span> <span class="pl-c1">=</span> <span class="pl-c1">True</span> )) <span class="pl-s1">predefined_filters</span> . <span class="pl-c1">set_filters</span> ([ { <span class="pl-s">"name"</span> : <span class="pl-s">"A and B > 2"</span> , <span class="pl-s">"column"</span> : <span class="pl-s">"A"</span> , <span class="pl-s">"description"</span> : <span class="pl-s">"Filter A with B greater than 2"</span> , <span class="pl-s">"handler"</span> : <span class="pl-k">lambda</span> <span class="pl-s1">df</span> , <span class="pl-s1">val</span> : <span class="pl-s1">df</span> [( <span class="pl-s1">df</span> [ <span class="pl-s">"A"</span> ] <span class="pl-c1">==</span> <span class="pl-s1">val</span> ) <span class="pl-c1">&</span> ( <span class="pl-s1">df</span> [ <span class="pl-s">"B"</span> ] <span class="pl-c1">></span> <span class="pl-c1">2</span> )], <span class="pl-s">"input_type"</span> : <span class="pl-s">"input"</span> , <span class="pl-s">"default"</span> : <span class="pl-c1">1</span> , <span class="pl-s">"active"</span> : <span class="pl-c1">False</span> , }, { <span class="pl-s">"name"</span> : <span class="pl-s">"A and (B % 2) == 0"</span> , <span class="pl-s">"column"</span> : <span class="pl-s">"A"</span> , <span class="pl-s">"description"</span> : <span class="pl-s">"Filter A with B mod 2 equals zero (is even)"</span> , <span class="pl-s">"handler"</span> : <span class="pl-k">lambda</span> <span class="pl-s1">df</span> , <span class="pl-s1">val</span> : <span class="pl-s1">df</span> [( <span class="pl-s1">df</span> [ <span class="pl-s">"A"</span> ] <span class="pl-c1">==</span> <span class="pl-s1">val</span> ) <span class="pl-c1">&</span> ( <span class="pl-s1">df</span> [ <span class="pl-s">"B"</span> ] <span class="pl-c1">%</span> <span class="pl-c1">2</span> <span class="pl-c1">==</span> <span class="pl-c1">0</span> )], <span class="pl-s">"input_type"</span> : <span class="pl-s">"select"</span> , <span class="pl-s">"default"</span> : <span class="pl-c1">1</span> , <span class="pl-s">"active"</span> : <span class="pl-c1">False</span> , }, { <span class="pl-s">"name"</span> : <span class="pl-s">"A in values and (B % 2) == 0"</span> , <span class="pl-s">"column"</span> : <span class="pl-s">"A"</span> , <span class="pl-s">"description"</span> : <span class="pl-s">"A is within a group of values and B mod 2 equals zero (is even)"</span> , <span class="pl-s">"handler"</span> : <span class="pl-k">lambda</span> <span class="pl-s1">df</span> , <span class="pl-s1">val</span> : <span class="pl-s1">df</span> [ <span class="pl-s1">df</span> [ <span class="pl-s">"A"</span> ]. <span class="pl-c1">isin</span> ( <span class="pl-s1">val</span> ) <span class="pl-c1">&</span> ( <span class="pl-s1">df</span> [ <span class="pl-s">"B"</span> ] <span class="pl-c1">%</span> <span class="pl-c1">2</span> <span class="pl-c1">==</span> <span class="pl-c1">0</span> )], <span class="pl-s">"input_type"</span> : <span class="pl-s">"multiselect"</span> , <span class="pl-s">"default"</span> : [ <span class="pl-c1">1</span> ], <span class="pl-s">"active"</span> : <span class="pl-c1">True</span> , } ]) <span class="pl-s1">df</span> <span class="pl-c1">=</span> <span class="pl-s1">pd</span> . <span class="pl-c1">DataFrame</span> ( ([[ <span class="pl-c1">1</span> , <span class="pl-c1">2</span> , <span class="pl-c1">3</span> , <span class="pl-c1">4</span> , <span class="pl-c1">5</span> , <span class="pl-c1">6</span> ], [ <span class="pl-c1">7</span> , <span class="pl-c1">8</span> , <span class="pl-c1">9</span> , <span class="pl-c1">10</span> , <span class="pl-c1">11</span> , <span class="pl-c1">12</span> ], [ <span class="pl-c1">13</span> , <span class="pl-c1">14</span> , <span class="pl-c1">15</span> , <span class="pl-c1">16</span> , <span class="pl-c1">17</span> , <span class="pl-c1">18</span> ]]), <span class="pl-s1">columns</span> <span class="pl-c1">=</span> [ <span class="pl-s">'A'</span> , <span class="pl-s">'B'</span> , <span class="pl-s">'C'</span> , <span class="pl-s">'D'</span> , <span class="pl-s">'E'</span> , <span class="pl-s">'F'</span> ] ) <span class="pl-s1">dtale</span> . <span class="pl-c1">show</span> ( <span class="pl-s1">df</span> )</pre> </div> <p dir="auto">该代码说明了前端可以拥有的输入类型:</p> <ul dir="auto"> <li> <strong>输入</strong>:只是一个简单的文本输入框,用户可以输入所需的任何值(如果“列”的值是int或float,它将尝试将字符串转换为该数据类型),并且将传递给处理程序</li> <li> <strong>选择</strong>:这将创建一个列出的下拉列表,该下拉列表填充了“列”的唯一值(如果列有大量唯一值,则异步下拉列表)</li> <li> <strong>多选择</strong>:与“选择”相同,但它可以选择多个值(如果要在过滤器中执行ISIN操作,请提供方便)</li> </ul> <p dir="auto">这是功能的演示:</p> <p dir="auto">如果您希望有任何新类型的输入类型,请随时在存储库的“问题”页面上提交请求。</p> <div class="markdown-heading" dir="auto"><h3>使用Swifter</h3></div> <p dir="auto"> Swifter是一个软件包,它将在PANDAS系列或DataFrame上提高任何Apply()功能的性能。如果在虚拟环境中安装软件包</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="pip install swifter # or pip install <span class=" notranslate keguazi>dtale[swifter]"><pre>pip install swifter <span class="pl-c"><span class="pl-c">#</span> or</span> pip install dtale [swifter]</pre> </div> <p dir="auto">它将用于以下操作:</p> <ul dir="auto"> <li>主网格和图表显示中的标准数据帧格式</li> <li>列构建器<ul dir="auto"> <li>类型转换<ul dir="auto"> <li>弦六角 - > int或float</li> <li> int或float->十六进制</li> <li>混合 - >布尔</li> <li>int->时间戳</li> <li>日期 - > int</li> </ul> </li> <li>相似性距离计算</li> </ul> </li> <li>计算缺失计数时处理空字符串</li> <li>通过“描述”弹出的数据类型构建唯一值</li> </ul> <div class="markdown-heading" dir="auto"><h3>宽数据框的行为</h3></div> <p dir="auto">加载“宽数据框”(带许多列的数据框)时,前端的性能瓶颈当前有一个性能瓶颈。当前解决此问题的解决方案是,在这些数据范围的初始负载到d-tale时,索引大于100(从左到右)的任何列将隐藏在前端。您仍然可以像其他任何方式一样解开这些列的方式,并且仍然可以选择使用“描述”弹出窗口显示所有列。这是这种行为的示例:</p> <p dir="auto">假设您将此数据框加载到D-Tale中。 </p> <div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import pandas as pd import <span class=" notranslate keguazi>dtale dtale .show(pd.DataFrame( {'col{}'.format(i): list(range(1000)) for i in range(105)} ))"><pre> <span class="pl-k">import</span> <span class="pl-s1">pandas</span> <span class="pl-k">as</span> <span class="pl-s1">pd</span> <span class="pl-k">import</span> <span class="pl-s1">dtale</span> <span class="pl-s1">dtale</span> . <span class="pl-c1">show</span> ( <span class="pl-s1">pd</span> . <span class="pl-c1">DataFrame</span> ( { <span class="pl-s">'col{}'</span> . <span class="pl-c1">format</span> ( <span class="pl-s1">i</span> ): <span class="pl-en">list</spa </article> <!-- --> <div class="shadow_box bg-white rounded-xl shadow-sm p-8"> <div class="title text-lg"><i class="fa fa-download text-primary mr-2"></i>下载源码</div> <div class="share_box"> <div class="share_item"> <span class="share_list active github"><i class="fa fa-github mr-2 text-xl"></i><a href="https://github.com/man-group/dtale.git" id="btnPos" rel="noreferrer nofollow" target="_blank">从 GitHub 克隆</a></span> </div> </div> <div class="copy_box"> <p>通过命令行克隆项目:</p> <div class="input_box"> <span class="text">git clone https://github.com/man-group/dtale.git</span> <span title="复制" class="copy_btn"></span> </div> </div> </div> </div> <!-- right-aside --> <div class="space-y-8"> <!-- 搜索框(移动端) --> <div class="md:hidden bg-white rounded-xl shadow-sm p-4 mb-8"> <div class="relative"> <input type="text" placeholder="搜索Python文章..." class="w-full pl-10 pr-4 py-2 rounded-full border border-gray-200 focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20 text-sm"> <button class="absolute left-3 top-1/2 transform -translate-y-1/2 text-muted"> <i class="fa fa-search"></i> </button> </div> </div> <!-- 最新文章 --> <div class="bg-white rounded-xl shadow-sm p-6" style="margin-top: 0;"> <h3 class="text-lg font-bold mb-4 border-b pb-3">相关文章</h3> <div class="space-y-4"> <a href="/download/212662.html" class="flex group"> <div class="flex-shrink-0 w-20 h-20 bg-primary/10 rounded-lg overflow-hidden flex items-center justify-center" style="position: relative;"> <div class="lazy-src" lazy-src="https://images.downcodes.com/uploads/20250821/logo_68a6e804948ca1.png" alt="pygorithm"> </div> </div> <div class="ml-4"> <h4 class="font-medium text-dark group-hover:text-primary transition-colors line-clamp-2"> pygorithm</h4> <p class="text-sm text-muted mt-1">2025-08-22</p> </div> </a> <a href="/download/212661.html" class="flex group"> <div class="flex-shrink-0 w-20 h-20 bg-primary/10 rounded-lg overflow-hidden flex items-center justify-center" style="position: relative;"> <div class="lazy-src" lazy-src="https://images.downcodes.com/uploads/20250821/logo_68a6e7e0396551.png" alt="pythonguis examples"> </div> </div> <div class="ml-4"> <h4 class="font-medium text-dark group-hover:text-primary transition-colors line-clamp-2"> pythonguis examples</h4> <p class="text-sm text-muted mt-1">2025-08-22</p> </div> </a> <a href="/download/212660.html" class="flex group"> <div class="flex-shrink-0 w-20 h-20 bg-primary/10 rounded-lg overflow-hidden flex items-center justify-center" style="position: relative;"> <div class="lazy-src" lazy-src="https://images.downcodes.com/uploads/20250821/logo_68a6e7ace15fd1.png" alt="pdfarranger"> </div> </div> <div class="ml-4"> <h4 class="font-medium text-dark group-hover:text-primary transition-colors line-clamp-2"> pdfarranger</h4> <p class="text-sm text-muted mt-1">2025-08-22</p> </div> </a> <a href="/download/212659.html" class="flex group"> <div class="flex-shrink-0 w-20 h-20 bg-primary/10 rounded-lg overflow-hidden flex items-center justify-center" style="position: relative;"> <div class="lazy-src" lazy-src="https://images.downcodes.com/uploads/20250821/logo_68a6e781112ca1.png" alt="EagleEye"> </div> </div> <div class="ml-4"> <h4 class="font-medium text-dark group-hover:text-primary transition-colors line-clamp-2"> EagleEye</h4> <p class="text-sm text-muted mt-1">2025-08-22</p> </div> </a> </div> </div> <!-- 推荐阅读 --> <div class="bg-white rounded-xl shadow-sm p-6"> <h3 class="text-lg font-bold mb-4 border-b pb-3">推荐阅读</h3> <div class="space-y-4"> <a href="/download/226184.html" class="flex group"> <div class="flex-shrink-0 w-20 h-20 bg-primary/10 rounded-lg overflow-hidden flex items-center justify-center" style="position: relative;"> <div class="lazy-src" lazy-src="https://images.downcodes.com/uploads/20260115/logo_69687066211c51.jpg" alt="向上:银河游戏免安装正式版"> </div> </div> <div class="ml-4"> <h4 class="font-medium text-dark group-hover:text-primary transition-colors line-clamp-2"> 向上:银河游戏免安装正式版</h4> <p class="text-sm text-muted mt-1">2026-01-23</p> </div> </a> <a href="/download/226185.html" class="flex group"> <div class="flex-shrink-0 w-20 h-20 bg-primary/10 rounded-lg overflow-hidden flex items-center justify-center" style="position: relative;"> <div class="lazy-src" lazy-src="https://images.downcodes.com/uploads/20260115/logo_6968706c955e21.jpg" alt="风暴驭使正式中文版"> </div> </div> <div class="ml-4"> <h4 class="font-medium text-dark group-hover:text-primary transition-colors line-clamp-2"> 风暴驭使正式中文版</h4> <p class="text-sm text-muted mt-1">2026-01-23</p> </div> </a> <a href="/download/226206.html" class="flex group"> <div class="flex-shrink-0 w-20 h-20 bg-primary/10 rounded-lg overflow-hidden flex items-center justify-center" style="position: relative;"> <div class="lazy-src" lazy-src="https://images.downcodes.com/uploads/20260115/logo_696876727dcb61.jpg" alt="冥河:贪婪之刃中文试玩版"> </div> </div> <div class="ml-4"> <h4 class="font-medium text-dark group-hover:text-primary transition-colors line-clamp-2"> 冥河:贪婪之刃中文试玩版</h4> <p class="text-sm text-muted mt-1">2026-01-23</p> </div> </a> <a href="/download/226207.html" class="flex group"> <div class="flex-shrink-0 w-20 h-20 bg-primary/10 rounded-lg overflow-hidden flex items-center justify-center" style="position: relative;"> <div class="lazy-src" lazy-src="https://images.downcodes.com/uploads/20260115/logo_6968767dddbfc1.jpg" alt="超级键盘侠免安装绿色中文版"> </div> </div> <div class="ml-4"> <h4 class="font-medium text-dark group-hover:text-primary transition-colors line-clamp-2"> 超级键盘侠免安装绿色中文版</h4> <p class="text-sm text-muted mt-1">2026-01-23</p> </div> </a> </div> </div> </div> </div> </main> <!-- footer --> <footer class="bg-neutral-800 text-white pt-12 pb-6"> <div class="container mx-auto px-4 sm:px-6 lg:px-8"> <div class="copyright"> <a href="javascript:void(0)">关于本站</a> |  <a href="javascript:void(0)">版权声明</a> | <a href="javascript:void(0)">合作联系</a> | <a href="/download/allcategory.html">网站地图</a> |  <a href="javascript:void(0)">帮助中心</a>  </div> <p class="text_info">Copyright © 2006-2025 downcodes.com | 联系:ymdowncodes@163.com</p> <p class="text_info">备案:<a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">湘ICP备2022016001号-1</a> </p> </div> </footer> </body> <script type="text/javascript" src="/index/js/jquery-1.8.3.min.js"></script> <script src="/assets/ymzy/js/index.js"></script> <script src="/assets/ymzy/prism.min.js"></script> <script> // document.querySelectorAll('.copy-btn').forEach(btn => { btn.addEventListener('click', function() { const textElement = this.closest('.code-block').querySelector('.code-body pre code'); const textarea = document.createElement('textarea'); textarea.value = textElement.textContent; document.body.appendChild(textarea); textarea.select(); document.execCommand('copy'); document.body.removeChild(textarea); const originalHTML = this.innerHTML; this.innerHTML = '✓ Copied!'; setTimeout(() => { this.innerHTML = originalHTML; }, 3000); }); }); // document.querySelectorAll('.copy_btn').forEach(btn => { btn.addEventListener('click', function() { const textElement = this.closest('.input_box').querySelector('.text'); const textarea = document.createElement('textarea'); textarea.value = textElement.textContent; document.body.appendChild(textarea); textarea.select(); document.execCommand('copy'); document.body.removeChild(textarea); const originalHTML = this.innerHTML; this.innerHTML = '✓ Copied!'; this.classList.add('copied'); setTimeout(() => { this.innerHTML = originalHTML; this.classList.remove('copied'); }, 3000); }); }); </script> </html>