特邀博文 / 独立研究员 Rising Odegua 与来自 Data Science Nigeria 的 Stephen Oni

Danfo.js 是个 JavaScript 开源库,提供了高性能、直观易用的数据结构,支持结构化数据的操作和处理。Danfo.js 深受 Python Pandas 库的启发,并提供了类似的接口/API。因此熟悉 Pandas API 且了解 JavaScript 的用户可以轻松上手。

Danfo.js 的一大目标是为 JavaScript 开发者提供数据处理、机器学习和 AI 工具。这与我们的愿景一致,本质上也符合 TensorFlow.js 团队向 Web 引入 ML 的目标。Numpy 和 Pandas 等开源库全面革新了 Python 中数据操作的便利性。因此很多工具都围绕它们构建,进一步推动了 Python 中 ML 生态系统的蓬勃发展。

  • Danfo.jshttps://danfo.jsdata.org/

Danfo.js 建立在 TensorFlow.js 上。也就是说,就像 Numpy 为 Pandas 的算术运算提供技术支持一样,我们是利用 TensorFlow.js 为我们的低级算术运算提供技术支持。

Danfo.js 的主要特性

Danfo.js 速度快。它基于 TensorFlow.js 构建,与张量无缝兼容。您可以在 Danfo 中加载张量,也可以将 Danfo 数据结构转换为张量。利用这两个库,既有了数据处理库 (Danfo.js),也有了强大的 ML 库 (TensorFlow.js)。

以下示例将展示如何从张量对象创建 Danfo DataFrame:

const dfd = require("danfojs-node")const tf = require("@tensorflow/tfjs-node")

let data = tf.tensor2d([[20,30,40], [23,90, 28]])let df = new dfd.DataFrame(data)let tf_tensor = df.tensorconsole.log(tf_tensor);tf_tensor.print()

输出:

Tensor {kept: false,isDisposedInternal: false,shape: [ 2, 3 ],dtype: 'float32',size: 6,strides: [ 3 ],dataId: {},id: 3,rankType: '2'}Tensor    [[20, 30, 40],     [23, 90, 28]]

您可以轻松地将数组、JSON 或对象转换为 DataFrame 对象操作。

JSON 对象到 DataFrame:

const dfd = require("danfojs-node")json_data = [{ A: 0.4612, B: 4.28283, C: -1.509, D: -1.1352 },            { A: 0.5112, B: -0.22863, C: -3.39059, D: 1.1632 },            { A: 0.6911, B: -0.82863, C: -1.5059, D: 2.1352 },            { A: 0.4692, B: -1.28863, C: 4.5059, D: 4.1632 }]df = new dfd.DataFrame(json_data)df.print()

输出:

带列标签的对象数组到 DataFrame:

const dfd = require("danfojs-node")obj_data = {'A': [“A1”, “A2”, “A3”, “A4”],'B': ["bval1", "bval2", "bval3", "bval4"],'C': [10, 20, 30, 40],'D': [1.2, 3.45, 60.1, 45],'E': ["test", "train", "test", "train"]            }df = new dfd.DataFrame(obj_data)df.print()

输出:

您可以轻松处理浮点和非浮点数据中的缺失数据(以 NaN 表示):

const dfd = require("danfojs-node")let data = {"Name":["Apples", "Mango", "Banana", undefined],"Count": [NaN, 5, NaN, 10],"Price": [200, 300, 40, 250]}let df = new dfd.DataFrame(data)let df_filled = df.fillna({columns: ["Name", "Count"], values: ["Apples",df["Count"].mean()]})df_filled.print()

输出:

基于智能标签的切片、花式索引和大数据集查询:

const dfd = require("danfojs-node")let data = { "Name": ["Apples", "Mango", "Banana", "Pear"] ,"Count": [21, 5, 30, 10],"Price": [200, 300, 40, 250] }

let df = new dfd.DataFrame(data)let sub_df = df.loc({ rows: ["0:2"], columns: ["Name", "Price"] })sub_df.print()

输出:

强大的 IO 工具,用于从平面文件(CSV 和分隔)加载数据。完整和分块均可:

const dfd = require("danfojs-node")//read the first 10000 rowsdfd.read_csv("file:///home/Desktop/bigdata.csv", chunk=10000)  .then(df => {    df.tail().print()  }).catch(err=>{console.log(err);  })

DataFrame 和 Series 支持 OneHotEncoders、LabelEncoders 等强大的数据预处理函数和 StandardScaler 和 MinMaxScaler 等 Scaler:

const dfd = require("danfojs-node")let data = ["dog","cat","man","dog","cat","man","man","cat"]let series = new dfd.Series(data)let encode = new dfd.LabelEncoder()encode.fit(series)let sf_enc = encode.transform(series)let new_sf = encode.transform(["dog","man"])

输出:

交互式、灵活且直观的 API,用于在浏览器中绘制 DataFrame 和 Series:



Document

输出:

示例:泰坦尼克号幸存预测

以下是使用 Danfo.js 和 TensorFlow.js 的简单端到端分类任务。使用 Danfo 进行数据集的数据加载、操作和预处理,然后导出张量对象。

const dfd = require("danfojs-node")const tf = require("@tensorflow/tfjs-node")

async function load_process_data() {let df = await dfd.read_csv("https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv")

//A feature engineering: Extract all titles from names columnslet title = df['Name'].apply((x) => { return x.split(".")[0] }).values//replace in df    df.addColumn({ column: "Name", value: title })

//label Encode Name featurelet encoder = new dfd.LabelEncoder()let cols = ["Sex", "Name"]    cols.forEach(col => {        encoder.fit(df[col])        enc_val = encoder.transform(df[col])        df.addColumn({ column: col, value: enc_val })    })

let Xtrain,ytrain;    Xtrain = df.iloc({ columns: [`1:`] })    ytrain = df['Survived']

// Standardize the data with MinMaxScalerlet scaler = new dfd.MinMaxScaler()    scaler.fit(Xtrain)    Xtrain = scaler.transform(Xtrain)

return [Xtrain.tensor, ytrain.tensor] //return the data as tensors}

接下来使用 TensorFlow.js 创建一个简单的神经网络。

function get_model() {const model = tf.sequential();    model.add(tf.layers.dense({ inputShape: [7], units: 124, activation: 'relu', kernelInitializer: 'leCunNormal' }));    model.add(tf.layers.dense({ units: 64, activation: 'relu' }));    model.add(tf.layers.dense({ units: 32, activation: 'relu' }));    model.add(tf.layers.dense({ units: 1, activation: "sigmoid" }))    model.summary();return model}

最后进行训练,首先将模型和处理后的数据加载为张量。这可以直接馈送到神经网络。

async function train() {const model = await get_model()const data = await load_process_data()const Xtrain = data[0]const ytrain = data[1]

    model.compile({optimizer: "rmsprop",loss: 'binaryCrossentropy',metrics: ['accuracy'],    });

console.log("Training started....")await model.fit(Xtrain, ytrain,{batchSize: 32,epochs: 15,validationSplit: 0.2,callbacks:{onEpochEnd: async(epoch, logs)=>{console.log(`EPOCH (${epoch + 1}): Train Accuracy: ${(logs.acc * 100).toFixed(2)},                                                     Val Accuracy:  ${(logs.val_acc * 100).toFixed(2)}\n`);            }        }    });};

train()

您可能注意到 Danfo 的 API 与 Pandas 非常相似,即使不是 Javascript 程序员也可以轻松阅读和理解代码。您可参考以上演示的完整源代码 (https://gist.github.com/risenW/f54e4e5b6d92e7b1b9b1f30e884ca83c)。

结语

基于网络的机器学习已经日趋成熟,对应的专用高效数据科学工具必不可少。类似 Danfo.js 的工具让基于网络的应用可以轻松支持 ML 特性,从而让应用生态系统更加丰富多彩。

这场变革始于 TensorFlow.js 为 Python 带来的 ML 功能。我们希望为 Danfo.js 作为高效的同伴一路提供支持。我们对 Danfo.js 的发展充满期待!希望它也能成为网络社区的关键成员。

  • 在 CodePen 上操作 Danfo.jshttps://codepen.io/risingodegua/pen/bGpwyYW

  • 官方入门指南https://danfo.jsdata.org/getting-started

  • Github 仓库https://github.com/opensource9ja/danfojs

  • OneHotEncodershttps://danfo.jsdata.org/api-reference/general-functions/danfo.onehotencoder

  • LabelEncodershttps://danfo.jsdata.org/api-reference/general-functions/danfo.labelencoder

  • StandardScalerhttps://danfo.jsdata.org/api-reference/general-functions/danfo.standardscaler

  • MinMaxScalerhttps://danfo.jsdata.org/api-reference/general-functions/danfo.minmaxscaler

—推荐阅读—

分享 ?  点赞 ?  在看 ❤️

以“三连”行动支持优质内容!

js中的new file_深受 Pandas 启发的 JavaScript 开源库 — Danfo.js 现已推出!相关推荐

  1. react-native 为本地js和开源库的js编写.d.ts声明文件

    读书不觉已春深 !明日清明节 在使用Typescript编写程序RN过程中遇到困扰,且不论react,不论在浏览器中,只论写react-native的APP,怎么使用 declare声明文件 和 na ...

  2. 强大的Canvas开源库Fabric.js简介与开发指南

    什么是Fabric.js? Fabric.js 是一个强大且简单的Javascript HTML5 Canvas库. 官网地址:http://fabricjs.com/ 为什么要使用Fabric.js ...

  3. JavaScript中的scrollTop(js中的scrollTop,滚动到顶部,javascript滚动到顶部)

    简述:scrollTop是JavaScript中一个非常有用且重要的方法,它用于获取或设置元素的垂直滚动条位置,实现各种滚动相关的功能,无论是回到顶部.滚动到指定位置还是监听滚动事件,都需要用到scr ...

  4. js中如何将object转化为json数据,json数据转js对象

    js对象转json数据:  JSON.stringify(); json数据转js对象:  JSON.parse();

  5. 谈谈JS中的拷贝Copy复制的方法(Javascript拷贝)

    拷贝(Copy),都是基于引用类数据来说的,基本数据类型直接在Heap中直接拷贝一份,引用数据类型分为浅拷贝和深拷贝: 虽然现在有很多数据库,直接封装好了一部分代码,我们直接引用就可以,比如Lodas ...

  6. JavaScript音频库-Dancer.js

    Dancer.js是一个高级的音频API,旨在创建炫酷的可视化效果,可以和Mozilla的Audio Data API以及Webkit的Web Audio API结合使用. Dancer.js主要功能 ...

  7. JavaScript学习笔记——JS中的变量复制、参数传递和作用域链

    今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...

  8. Js中的数据属性和访问器属性

    Js中的数据属性和访问器属性 在javaScript中,对象的属性分为两种类型:数据属性和访问器属性. 一.数据属性 1.数据属性:它包含的是一个数据值的位置,在这可以对数据值进行读写. 2.数据属性 ...

  9. node MySQL buffer_node.js中buffer方法使用说明

    熟悉JavaScript的童鞋应该对Node.js都不陌生,没错Node.js是一个基于Chrome JavaScript运行时建立的平台,用于方便地搭建响应速度快.易于扩展的网络应用.Node.js ...

最新文章

  1. softmax layer 简单理解以及实际例子【有白话讲解】
  2. I need to follow my heart.
  3. vijos 1030 重叠的方框
  4. WDS使用捕获映像制作企业自定义映像
  5. idea调试怎么跳出循环_使用IDEA的Debug调试功能,查看程序的运行过程
  6. unreal world 皮革_UnRealWorld 进阶游戏教程
  7. 【NetApp】ROOT VOLUME NOT WORKING PROPERLY: RECOVERY REQUIRED
  8. SAP Spartacus 启动时 Chrome 里观察到的 product.js
  9. Python—实训day4—爬虫案例3:贴吧图片下载
  10. 【ffmpeg】基本使用方法总结
  11. 网站跨域访问解决方法
  12. awk学习笔记(16) - 字符串函数
  13. matplotlib——饼状图pie函数
  14. 关于getX()getY()就可以获取到位置,找不到方法问题
  15. fcntl函数详解-文件锁
  16. Autodesk 首届中国开发者训练营将开始报名,5月24日前报名6折优惠!
  17. libpng 处理png图片
  18. SM4-ECB加解密
  19. Android一行代码去掉百度导航的底部工具箱菜单
  20. CDN(内容分发网络)

热门文章

  1. UITextView 取消键盘方法
  2. 维度变换--首先将矩阵倒过来
  3. 亚洲诚信联合又拍云升级云端SSL证书服务
  4. 【转】C#生成验证码
  5. 持久层框架之MyBatis
  6. jquery file upload ajax上传图片 简单使用
  7. js中==与===的区别
  8. Sphinx武林秘籍(上)
  9. 国内外有名的安全扫描工具,你知道几个?
  10. Windows server backup笔记 WSB