Com este exemplo CSV:
Source,col1,col2,col3
foo,1,2,3
bar,3,4,5
O método padrão que uso o Pandas é este:
Analisar CSV
Selecione colunas em um quadro de dados (
col1
ecol3
)- Processe a coluna (por exemplo, média dos valores de
col1
ecol3
)
Existe uma biblioteca JavaScript que faz isso como o Pandas?
javascript
python
pandas
neversaint
fonte
fonte
Respostas:
Todas as respostas são boas. Esperando que minha resposta seja abrangente (ou seja, tenta listar todas as opções). Espero retornar e revisar esta resposta com quaisquer critérios para ajudar a fazer uma escolha.
Espero que alguém que venha aqui conheça
d3
.d3
é um "canivete suíço" muito útil para lidar com dados em Javascript, comopandas
é útil para Python. Você pode verd3
usado com frequência comopandas
, mesmo que nãod3
seja exatamente uma substituição do DataFrame / Pandas (ou sejad3
, não tem a mesma API;d3
não temSeries
/DataFrame
que se comporta como empandas
)A resposta de Ahmed explica como d3 pode ser usado para obter algumas funcionalidades do DataFrame, e algumas das bibliotecas abaixo foram inspiradas em coisas como LearnJsData que usa
d3
elodash
.Quanto aos recursos focados em DataFrame, fiquei sobrecarregado com bibliotecas JS que ajudam. Aqui está uma lista rápida de algumas das opções que você pode ter encontrado. Eu não verifiquei nenhum deles em detalhes ainda (a maioria eu encontrei na combinação de pesquisa Google + NPM).
Tenha cuidado ao usar uma variedade com a qual possa trabalhar; alguns são Node.js, também conhecido como Javascript do lado do servidor, outros são compatíveis com o navegador, também conhecido como Javascript do lado do cliente. Alguns são datilografados.
Então, depois de chegar a esta pergunta, verificando outras respostas aqui e fazendo mais pesquisas, encontrei opções como:
JS
alternativa aos "notebooks" IPython / Jupyterpreservar de Rdocumentar a sua substituição / melhoria / correspondência a todas as funções R .a maneira jQuery de obter dados no DOMsua (incrível) Multiview (a IU), que não requer jQuery, mas requer um navegador! Mais exemplosjs-data-mongodb
,js-data-redis
,js-data-cloud-datastore
), triagem, filtragem, etc.Espero que esta postagem se torne um wiki da comunidade e avalie (ou seja, compare as diferentes opções acima) em relação a diferentes critérios como:
Jupyter
(notebooks interativos), etcAlgumas coisas que uma biblioteca JS pode nunca fazer (mas poderia?)
fonte
Tenho trabalhado em uma biblioteca de organização de dados para JavaScript chamada data-forge. É inspirado em LINQ e Pandas.
Ele pode ser instalado assim:
npm install --save data-forge
Seu exemplo funcionaria assim:
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" ]) ;
Se seus dados estiverem em um arquivo CSV, você poderá carregá-lo assim:
var dataFrame = dataForge.readFileSync(fileName) .parseCSV() .parseInts([ "col1", "col2", "col3" ]) ;
Você pode usar o
select
método para transformar linhas.Você pode extrair uma coluna usando
getSeries
oselect
método para transformar os valores dessa coluna.Você obtém seus dados de volta do data-frame assim:
var data = dataFrame.toArray();
Para calcular a média de uma coluna:
var avg = dataFrame.getSeries("col1").average();
Você pode fazer muito mais com isso.
Você pode encontrar mais documentação sobre npm .
fonte
Ceaveat O seguinte é aplicável apenas ao d3 v3, e não ao d4v4 mais recente!
Eu tenho uma preferência pelo d3.js e, embora não seja uma substituição total do Pandas, se você passar algum tempo aprendendo seu paradigma, ele deve ser capaz de cuidar de todas as suas disputas de dados para você. (E se você quiser exibir os resultados no navegador, ele é ideal para isso.)
Exemplo. Meu arquivo CSV
data.csv
:name,age,color Mickey,65,black Donald,58,white Pluto,64,orange
No mesmo diretório, crie um
index.html
contendo o seguinte:<!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>
e também um
demo.js
arquivo contendo o seguinte: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); });
No diretório, execute
python -m SimpleHTTPServer 8181
e abra http: // localhost: 8181 em seu navegador para ver uma lista simples das idades e sua média.Este exemplo simples mostra alguns recursos relevantes do d3:
fonte
Abaixo está Python entorpecido e pandas
`` `
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)
`` `
O mesmo pode ser alcançado em JavaScript * [ numjs funciona apenas com Node.js ] Mas D3.js tem opções muito avançadas de conjunto de arquivos de dados. Tanto numjs quanto Pandas-js ainda em obras ..
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 */
fonte
No momento, o Pandas.js é uma biblioteca experimental, mas parece muito promissor, pois usa sob o capô immutable.js e lógica NumpPy, ambas séries de objetos de dados e DataFrame estão lá.
fonte
@neversaint sua espera acabou. diga bem-vindo ao Danfo.js que é um pandas como a biblioteca Javascript construída em tensorflow.js e oferece suporte a tensores prontos para uso. Isso significa que você pode converter a estrutura de dados danfo em tensores. E você pode fazer agrupamento, fusão, união, plotagem e outro processamento de dados.
fonte
Acho que o mais próximo são bibliotecas como:
Recline, em particular, tem um objeto Dataset com uma estrutura um pouco semelhante aos data frames do Pandas. Em seguida, ele permite que você conecte seus dados com "Visualizações", como uma grade de dados, gráficos, mapas, etc. As visualizações são geralmente pacotes finos em torno das melhores bibliotecas de visualização existentes, como D3, Flot, SlickGrid etc.
Aqui está um exemplo para Reclinar:
fonte
É muito fácil analisar CSV em javascript porque cada linha já é essencialmente um array de javascript. Se você carregar seu csv em um array de strings (um por linha), é muito fácil carregar um array de arrays com os valores:
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); };
Em seguida,
getData()
retorna uma matriz multidimensional de valores por coluna.Eu demonstrei isso em um jsFiddle para você.
Claro, você não pode fazer isso tão facilmente se não confiar na entrada - se pudesse haver um script em seus dados que a avaliação poderia pegar, etc.
fonte
Aqui está uma abordagem dinâmica assumindo um cabeçalho existente na linha 1. O csv é carregado com
d3.js
.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); });
Então você pode acessar cada coluna dos dados de forma semelhante a um dataframe R, python ou Matlab com
df.column_header[row_number]
.fonte