Danfo.js与Dnotebook
—— pandas、jupyter的JavaScript版本
【前言】:谷歌公司不仅推出了tensorflow的JavaScript版本tensorflow.js,在2020年又相继推出了pandas和jupyter notebook的JavaScript端替代品——Danfo.js和D notebook,它们和python端具有类似的接口,熟悉python中相关工具的开发者可以很快上手对应的工具。本文将追随者最新的相关内容不断更新系列博客。
1.数据分析 - 为什么有转向JavaScript的呼声?
Python做数据分析仍然是首选,但在某些地方也不尽如人意。
在python中有大量的和数据分析相关的第三方模块,如numpy(数值python)、scipy(科学计算)、sympy(符号数学)、matplotlib(matlab风格的绘图)。由于python是杰丝型语言,有团队基于其开发了使用方便的jupyter notebook,使得python用作数据分析十分方便。
数据分析除了数学运算外、往往还需要通过图表来呈现,除了已经提到了matplotlib外,还有很多大量的第三方库,能够独立或者辅助matplotlib进行绘图,如seaborn等。
matplotlib——经典、强大、功能齐全。但缺乏动态逻辑
熟悉python的开发者在做一些需要进行数据展示的时候其实一直有很多困扰,很多的绘图库,包括著名的matplotlib,都只能够绘制静态的效果图。matplotlib还拥有大量的相关第三方库,在其基础上进行了封装。在数据分析领域,最常用的莫过于seaborn了。不过随着时间的流逝,在当下matplotlib总让人觉得缺少了啥——那就是图片一旦生成它就是固定的,没有逻辑的动态效果。如果研究一下matplotlib的源码,发现其底层也是通过web前端相关的技术实现的,如svg、canvas。可想而知,python其实在者方面远远没有任何优势可言。
Bokeh——让python数据可视化看到了新的希望
那么毕竟很多这些库已经做好了,那就用呗。不过当你想要使得你的数据有更多的动态效果,甚至能够进行人机交互,比如图片上有按钮,这时候你可能发现了也有一些优秀的库作为支撑,比如Bokeh。与matplotlib不同,Bokeh绘制的图片是具有JavaScript的前端逻辑的,
您可以通过此链接尝试一下下面Bokeh的demo:
可以看到,Bokeh除了能显示图像外还可以使用进度条等工具动态地调整参数,其人机效果非matplotlib可比。虽然我们一直对Bokeh包邮很多期望,可是暂时遗憾的是目前该库的绘图样式种类目前仍却远远少于matplotlib,很多类型的图暂时无法绘制。
Node.js出现——让JavaScript不再仅仅能运用于前端
以往,JavaScript只能在浏览器中解释执行,并且在处理文件等方面有诸多的限制,这将其限制成为了一款完全是前端逻辑的语言。然而Node.js的出现打破了这一切。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。它使得JavaScript 像python、java等语言一样,具有编写后端的能力。同时Node.js给JavaScript带来了像Python中Pip工具那样的方便的包管理工具npm,可以请见下一节。
2.Node.js(简介)
Node.js 教程 简单的说 Node.js 就是运行在服务端的 JavaScript,是一个基于Chrome V8引擎的JavaScript运行环境。有了Node.js以后,开发者可以使用JavaScript编写以前不能编写的功能,比如从前JS在读取文件方面是及其受限或者说是不能够做到的(即所谓安全的语言),现在不仅能完成这些事情,Node.js还像Python、Java等语言一样提供了丰富的类库,类库都包含了十分丰富的各类函数。因此说Node.js让JavaScript成为与Python、Ruby等服务端语言平起平坐的脚本语言。
3.Dnotebook - Jupyter的JavaScript版本
Danfo Notebook(Dnotebook)是一个开源项目,它源于使用Danfo.js执行快速且交互式的实验/原型制作的需要。DNotebook与流行的Jupyter Notebook相似, 但已针对JavaScript环境进行了自定义。Dnotebook是JSdata宏伟愿景的一部分,该愿景 旨在为JavaScript生态系统带来更多的数据科学和机器学习工具。
想学习Danfo Notebook的读者可以在附录1:Dnotebook(Danfo Notebook)单机资源与汉化文档中学习文档快速上手
4.Danfo.js - pandas的JavaScript
如果你熟悉Python中的pandas库,那么Danfo会让你有不仅是似曾相识的感觉——你会觉得:TM的劳资用过Danfo,就是这么亲切。因为它的和pandas确实有高度的一致,并且是参照pandas中的接口进行开发的。
Danfo 入门级API解析
1. 通用功能
1.1 数据操作
merge |
将数据框或命名系列对象与数据库样式的联接合并。 |
concat |
沿着特定轴连接danfo对象,沿着其他轴连接可选的设置逻辑。 |
get_dummies |
将分类变量转换为虚拟/指示变量。类似于OneHotEncoding(独热码)。 |
1.2 数据处理/标准化
LabelEncoder | 用0到n _ classes之间的值对目标标签进行编码。 |
OneHotEncoder | 将分类特征编码为一个热数值数组。 |
StandardScaler | 通过去除均值和单位方差的缩放来标准化特征。 |
MinMaxScaler |
通过将每个要素缩放到给定范围来转换要素。 |
1.3 日期时间的顶层处理
to_datetime |
将参数转换为日期时间。 |
date_range |
返回固定频率的日期时间索引。 |
2. I/O
将表格/结构化数据轻松读入DataFrame和Series对象的功能和方法
2.1 read_csv
将逗号分隔值(CSV)文件读入数据框。还支持文件的迭代或分段。
danfo.read_csv(source, chunk) [source]
参数 | 类型 | 描述 | 默认值 |
source: | str, path 或者 URL | 任何有效的字符串路径都是可以接受的。该字符串可以是一个URL。 有效的URL包括http、ftp、s3、gs和file。对于本地文件路径,应以“file://”为前缀,例如,“file:///home/path/to/table.CSV”。 |
|
chunk: | int | (可选)要读取的文件行数。对读取大文件很有用。 |
返回值:
Promise 解析为DataFrame
示例
read_csv方法可以从本地磁盘或通过互联网读取csv文件。如果要在节点环境中从本地磁盘读取文件,则必须在完整路径名称前添加前缀“file://”。例如,要读取路径为/home/Desktop/user_names.csv的csv文件,您可以执行以下操作:
Node.js
const dfd = require("danfojs-node") dfd.read_csv("file:///home/Desktop/user_names.csv") .then(df => { df.head().print() }).catch(err=>{ console.log(err); })
读取大文件
对于无法立即放入内存的超大文件,您可以分块读取顶部。例如,这个[数据集](http://forexcel . com/WP/WP-content/uploads/2017/07/1500000 Sales Records . 7z)有超过150万行,如果您试图一次加载所有内容,将会引发内存错误。要读取这些类型的文件,可以使用read_csv。
JavaScript
const dfd = require("danfojs-node") //read the first 10000 rows dfd.read_csv("file:///home/Desktop/bigdata.csv", chunk=10000) .then(df => { df.tail().print() }).catch(err=>{ console.log(err); })
2.2 read_excel
将Excel值(xls)文件读入DataFrame。
danfo.read_excel(kwargs) [source]
参数 | 类型 | 描述 |
kwargs | Object | { source: string, URL 或索引向Excel文件的本地文件的路径。 sheet_name: string, (可选) 要解析的工作表(sheet)的名称。默认为第一个表。 header_index: int, (可选) 代表数据标题(列)的行的索引。默认值将是第一个非空行。 data_index: int, (可选)实际数据(内容)开始的行的索引。默认值将是 标题_索引 的下一行} |
返回值:
return DataFrame
示例
read_excel方法可以读取从本地磁盘或通过互联网保存的excel文件。
const dfd = require("danfojs-node") local_xcel = 'testexcel.xls' async function load_process_data() { let df = await dfd.read_excel({source: local_xcel}) df.head().print() } load_process_data()
2.3 read_json
将json值(JSON)文件读入DataFrame。
danfo.read_json(source,) [source]
参数 | 类型 | 描述 |
source: | string, path 或 URL | 任何有效的字符串路径都是可以接受的。该字符串可以是一个网址。有效的网址方案包括http、https、ftp、s3、gs或本地路径。支持相对路径和绝对路径 |
返回值:
Promise: 解析为DataFrame
示例
read_json方法可以从本地磁盘或通过互联网读取json文件。例如,在下面的例子中,user_names.json是一个json文件,与我们的脚本位于同一个目录中。要将其读入为danfo DataFrame,您可以指定相对路径:
const dfd = require("danfojs-node") dfd.read_json("user_names.json") .then(df => { df.head().print() }).catch(err=>{ console.log(err); })
附录1:Dnotebook(Danfo Notebook)单机资源与汉化文档
这部分文档分为两个部分,一个是
demo部分
,另外一个是Getting Started
部分,由于内容过长和其它原因,现已整体成单独的文章,请点击下方链接跳转之:
跳转链接:Dnotebook(Danfo Notebook)单机资源与汉化文档
附录2:Dnotebook 汉化修改版本(打包资源)
如果在我国内地使用原版的Dnotebook是无法正常加载的,甚至连官方文档的demo也执行不了。但这并不意味着Dnotebook自身的错误,只是由于总所周知的原因,内地无法加载相关的js文件和数据文件对运行进行支持。
博主通过简单修改,将引用域外文件嵌入本地,使得能够在没有网络的环境下使用Dbotebook。
资源上传到CSDN,无需支付任何费用,点击链接即可获取。
效果图:
资源下载链接地址: