JavaScript 中的 PythonPandas 等价物

以 CSV 为例:

   Source,col1,col2,col3
foo,1,2,3
bar,3,4,5

我使用熊猫的标准方法是这样的:

  1. 解析 CSV

  2. 选择数据框架中的列(col1col3)

  3. 处理列(例如,平均 col1col3的值)

有没有类似于熊猫的 JavaScript 库?

110735 次浏览

Ceaveat 以下内容仅适用于 d3 v3,不适用于最新的 d4v4!

我偏爱 D3.js,虽然它不会完全取代熊猫,如果你花一些时间学习它的范例,它应该能够照顾你所有的数据争论为你。(如果你最终想要在浏览器中显示结果,它非常适合。)

例如,我的 CSV 文件 data.csv:

name,age,color
Mickey,65,black
Donald,58,white
Pluto,64,orange

在同一目录中,创建一个包含以下内容的 index.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>My D3 demo</title>


<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>


<script charset="utf-8" src="demo.js"></script>
</body>
</html>

以及一个包含以下内容的 demo.js文件:

d3.csv('/data.csv',


// How to format each row. Since the CSV file has a header, `row` will be
// an object with keys derived from the header.
function(row) {
return {name : row.name, age : +row.age, color : row.color};
},


// Callback to run once all data's loaded and ready.
function(data) {
// Log the data to the JavaScript console
console.log(data);


// Compute some interesting results
var averageAge = data.reduce(function(prev, curr) {
return prev + curr.age;
}, 0) / data.length;


// Also, display it
var ulSelection = d3.select('body').append('ul');
var valuesSelection =
ulSelection.selectAll('li').data(data).enter().append('li').text(
function(d) { return d.age; });
var totalSelection =
ulSelection.append('li').text('Average: ' + averageAge);
});

在该目录中,运行 python -m SimpleHTTPServer 8181,并在浏览器中打开 http://localhost:8181,查看年龄及其平均值的简单列表。

这个简单的例子展示了 d3的一些相关特性:

  • 优秀的在线数据摄取支持(CSV、 TSV、 JSON 等)
  • 数据争论的聪明才智
  • 数据驱动的 DOM 操作(可能是最难理解的事情) : 将数据转换为 DOM 元素。

在 javascript 中解析 CSV 非常容易,因为每一行本质上都是一个 javascript 数组。如果将 csv 加载到一个字符串数组(每行一个字符串)中,那么很容易加载一个包含值的数组数组:

var pivot = function(data){
var result = [];
for (var i = 0; i < data.length; i++){
for (var j=0; j < data[i].length; j++){
if (i === 0){
result[j] = [];
}
result[j][i] = data[i][j];
}
}
return result;
};


var getData = function() {
var csvString = $(".myText").val();
var csvLines = csvString.split(/\n?$/m);


var dataTable = [];


for (var i = 0; i < csvLines.length; i++){
var values;
eval("values = [" + csvLines[i] + "]");
dataTable[i] = values;
}


return pivot(dataTable);
};

然后,getData()按列返回值的多维数组。

我已经用 JsFiddle给你演示过了。

当然,如果你不信任输入,你就不能这么轻松地完成它——如果你的数据中有可能被 eval 检测到的脚本,等等。

我认为最接近的是图书馆,比如:

Recline 特别拥有一个 Dataset 对象,其结构有点类似于 Panda 数据帧。然后,它允许您连接您的数据与“视图”,如数据网格,图形,地图等。视图通常是现有最好的可视化库(如 D3、 Flot、 SlickGrid 等)的薄包装器。

这里有一个例子:

// Load some data
var dataset = recline.Model.Dataset({
records: [
{ value: 1, date: '2012-08-07' },
{ value: 5, b: '2013-09-07' }
]
// Load CSV data instead
// (And Recline has support for many more data source types)
// url: 'my-local-csv-file.csv',
// backend: 'csv'
});


// get an element from your HTML for the viewer
var $el = $('#data-viewer');


var allInOneDataViewer = new recline.View.MultiView({
model: dataset,
el: $el
});
// Your new Data Viewer will be live!

我一直在为 JavaScript 开发一个叫做 data-forge 的数据争论库,它的灵感来自于 LINQ 和 Panda。

它可以这样安装:

npm install --save data-forge

你的例子是这样的:

var csvData = "Source,col1,col2,col3\n" +
"foo,1,2,3\n" +
"bar,3,4,5\n";


var dataForge = require('data-forge');
var dataFrame =
dataForge.fromCSV(csvData)
.parseInts([ "col1", "col2", "col3" ])
;

如果你的数据在一个 CSV 文件中,你可以这样加载它:

var dataFrame = dataForge.readFileSync(fileName)
.parseCSV()
.parseInts([ "col1", "col2", "col3" ])
;

可以使用 select方法转换行。

您可以使用 getSeries提取列,然后使用 select方法转换该列中的值。

你可以这样把数据从数据框架中取出来:

var data = dataFrame.toArray();

对一列进行平均:

 var avg = dataFrame.getSeries("col1").average();

你还可以用这个做很多事情。

您可以在 Npm上找到更多的文档。

这个 wiki 将总结和比较许多类似 pandas的 Javascript 库。

通常,您应该查看 d3 Javascript 库。d3是用于在 Javascript 中处理数据的非常有用的“瑞士军刀”,就像 pandas对 Python 非常有用一样。即使 d3d31(即 d3没有相同的 API; d3没有具有与 pandas行为匹配的方法的 Series/DataFrame类) ,您也可以看到 d3经常被使用,就像 pandas一样

Ahmed 的回答解释了如何使用 d3来实现一些 DataFrame 功能,下面的一些库受到了使用 d3lodashLearnJsData的启发。

至于 DataFrame 风格的数据转换(分割、联接、分组等) ,下面是一些 Javascript 库的快速列表。

注意,有些库是 Node.js,又称为服务器端 Javascript,有些库是浏览器兼容的,又称为客户端 Javascript,还有一些库是 Type 脚本。所以选择适合你的选项。

  • Danfo-js (浏览器支持和节点支持)
    • Vignesh 的回答

    • Danfo (通常作为 dfd导入和别名) ; 具有基本的 DataFrame 类型的数据结构,能够直接绘图

    • Tensorflow 的队伍构建: “ Danfo.js 的主要目标之一是为 JavaScript 开发人员带来数据处理、机器学习和人工智能工具。... 开源图书馆,比如 Numpy 和 Panda...”

    • pandas构建在 numpy之上; 同样,danfo-js构建在 tensorflow-js之上

    • 请注意,danfo may 没有(yet?)支持 < a href = “ https://github.com/javascriptdata/danfojs/questions/496”rel = “ nofollow noReferrer”> 多列索引

  • 熊猫
    • 熊猫 -js 回购已经有一段时间没有更新了
    • 钢铁费拉斯的答案
    • Js 是一个模仿 Python Pandas 库的开源(实验性)库。它依赖 Immutable.js 作为 NumPy 的逻辑等价物。Js 中的主要数据对象,就像 Python Pandas 中的 Series 和 DataFrame 一样。”
  • Dataframe-js
    • DataFrame-js 为 javascript 和数据科学提供了一个不可变的数据结构—— DataFrame,它允许使用受 sql 和函数式编程启发的 api 处理行和列
  • 数据伪造
  • Jsdataframe
    • “ Jsdataframe 是一个受到 R 和 PythonPandas 中数据框架功能启发的 JavaScript 数据处理库。”
  • 数据帧
    • “通过分组和减少来探索数据”
  • SQL 框架
    • “ DataFrames meet SQL,in the Browser”
    • “ SQL Frames 是一个低代码的数据管理框架,可以直接嵌入到浏览器中,提供丰富的数据可视化和用户体验。复杂数据框架可以使用熟悉的 SQL 构造组合。凭借其强大的内置分析引擎,数据源可以以任何形式、形式和频率出现,并且可以在浏览器中直接进行分析。它允许通过将组合的 DataFrame 逻辑转换为 SQL 来扩展到大数据后端。”

回到这个问题,在这里检查其他的答案,做更多的搜索,我发现了这样的选项:

  • JS 中的 Apache Arrow
    • 感谢用户 Back2Basics 的建议:
    • ”Apache Arrow 是一个用于编码向量和类似表的平面和嵌套数据容器的列式内存布局规范。Apache Arrow 是大型内存柱状数据(Spark,熊猫,Drill,Graphhistry,...)的新兴标准。”
  • 北极
  • 显而易见
    • 乍一看,似乎是 IPython/Jupiter “笔记本”JS替代品
    • Observer able 的页面承诺: “响应式编程”、“社区”、“网络平台”
    • 见5分钟介绍 给你
  • Portal.js (以前是 recline; 来自 Rufus 的回答)
    • 可能过期: 不使用“ DataFrame”API
    • 可能过时: 相反,强调它的“ Multiview”(UI) API,(类似于 jQuery/DOM 模型) ,它不需要 jQuery,但需要一个浏览器!更多例子
    • 可能过时: 也强调它的 MVC 风格的架构; 包括后端的东西(即数据库连接)
  • Js-data
    • 真的更多的是一个 ORM! 大多数 它的模块对应不同的数据 储藏室问题(js-data-mongodbjs-data-redisjs-data-cloud-datastore) ,排序,过滤等。
    • 积极的一面确实作为优先级在 Node.js 上工作; “在 Node.js 和浏览器中工作”
  • 味噌 (来自 鲁弗斯的另一个建议)
  • 阿拉斯加
    • “ AlaSQL”是一个用于 Javascript 的开源 SQL 数据库,强调查询速度和关系数据和无模式数据的数据源灵活性。它可以在你的浏览器,Node.js 和 Cordova 中工作。”
  • 一些思维实验:

下面是我们用来考虑上述选择的标准

  • 一般准则
    • 语言(NodeJS vs 浏览器 JS vs 类型脚本)
    • 依赖关系(例如,如果它使用底层库/AJAX/远程 API)
    • 主动支持(主动用户库、主动源存储库等)
    • JS 库的大小/速度
  • 熊猫比较中的标准
    • 表演
    • 功能/灵活性
    • 易于使用
  • 与熊猫/数据框架 API 的相似之处
    • 特别是他们的 主要特征
    • 强调数据科学
    • 内置的可视化功能
    • 演示了与其他工具(如 Jupyter)的结合 (互动笔记本)等

下面是一个动态方法,假设第1行中有一个现有的头文件。

function csvToColumnArrays(csv) {


var mainObj = {},
header = Object.keys(csv[0]);


for (var i = 0; i < header.length; i++) {


mainObj[header[i]] = [];
};


csv.map(function(d) {


for (key in mainObj) {
mainObj[key].push(d[key])
}


});


return mainObj;


}




d3.csv(path, function(csv) {


var df = csvToColumnArrays(csv);


});

然后,您就能够使用 df.column_header[row_number]访问类似于 R、 python 或 Matlab 数据框架的数据的每一列。

下面是 Python numpy 和熊猫

```

import numpy as np
import pandas as pd


data_frame = pd.DataFrame(np.random.randn(5, 4), ['A', 'B', 'C', 'D', 'E'], [1, 2, 3, 4])


data_frame[5] = np.random.randint(1, 50, 5)


print(data_frame.loc[['C', 'D'], [2, 3]])


# axis 1 = Y | 0 = X
data_frame.drop(5, axis=1, inplace=True)


print(data_frame)

```

在 JavaScript * [ Numjs 只能用于 Node.js]中也可以实现同样的功能 但是 D3.js 有很多先进的数据文件设置选项。 numjs 和 Pandas-js 仍然在工作。

import np from 'numjs';
import { DataFrame } from 'pandas-js';


const df = new DataFrame(np.random.randn(5, 4), ['A', 'B', 'C', 'D', 'E'], [1, 2, 3, 4])


// df
/*


1         2         3         4
A  0.023126  1.078130 -0.521409 -1.480726
B  0.920194 -0.201019  0.028180  0.558041
C -0.650564 -0.505693 -0.533010  0.441858
D -0.973549  0.095626 -1.302843  1.109872
E -0.989123 -1.382969 -1.682573 -0.637132


*/

熊猫 目前是一个实验性的库,但似乎非常有前途,它使用的引擎盖 immutable.js 和 NumpPy 逻辑,都有数据对象序列和 DataFrame。.

正如@jarthur 所提到的,过去4年似乎没有关于这份回购协议的更新

@ 永远不要忘记,你的等待已经结束。欢迎来到 Danfo.js,这是一个像 Javascript 库一样建立在 tensorflow.js 之上的大熊猫,它支持开箱即用的张量。这意味着您可以将 danfo 数据结构转换为 Tensors。还可以进行 groupby、合并、连接、绘图和其他数据处理。

Arquero 是一个用于处理关系数据的库,其语法类似于流行的 R 包 dplyr(类似于 SQL)。 Https://observablehq.com/@uwdata/introducing-arquero