Con este ejemplo de CSV:
Source,col1,col2,col3
foo,1,2,3
bar,3,4,5
El método estándar que uso Pandas es este:
Analizar CSV
Seleccionar columnas en un marco de datos (
col1
ycol3
)- Procesar la columna (por ejemplo, promediar los valores de
col1
ycol3
)
¿Existe una biblioteca de JavaScript que le guste Pandas?
javascript
python
pandas
nunca santo
fuente
fuente
Respuestas:
Todas las respuestas son buenas. Espero que mi respuesta sea completa (es decir, intenta enumerar todas las opciones). Espero volver y revisar esta respuesta con cualquier criterio para ayudar a tomar una decisión.
Espero que cualquiera que venga aquí esté familiarizado
d3
.d3
es una "navaja suiza" muy útil para manejar datos en Javascript, comopandas
es útil para Python. Es posible que sed3
use con frecuencia comopandas
, incluso si nod3
es exactamente un reemplazo de DataFrame / Pandas (es decird3
, no tiene la misma API;d3
no tieneSeries
/DataFrame
que se comporta como enpandas
)La respuesta de Ahmed explica cómo se puede usar d3 para lograr algunas funciones de DataFrame, y algunas de las bibliotecas a continuación se inspiraron en cosas como LearnJsData que usa
d3
ylodash
.En cuanto a las características centradas en DataFrame, me sentí abrumado con las bibliotecas JS que ayudan. Aquí hay una lista rápida de algunas de las opciones que puede haber encontrado. Todavía no he comprobado ninguno de ellos en detalle (la mayoría los encontré en una combinación de búsqueda de Google + NPM).
Tenga cuidado de utilizar una variedad con la que pueda trabajar; algunos son Node.js, también conocido como Javascript del lado del servidor, algunos son compatibles con el navegador, también conocido como Javascript del lado del cliente. Algunos son mecanografiados.
Luego, después de llegar a esta pregunta, verificar otras respuestas aquí y hacer más búsquedas, encontré opciones como:
JS
alternativa a los "cuadernos" de IPython / Jupyterpreservar de Rdocumentar su sustitución / mejora / correspondencia a cada función R .la forma jQuery de introducir datos en el DOMsu (increíble) Multiview (la interfaz de usuario), que no requiere jQuery pero sí requiere un navegador. Más ejemplosjs-data-mongodb
,js-data-redis
,js-data-cloud-datastore
), la clasificación, filtrado, etc.Espero que esta publicación pueda convertirse en una wiki de la comunidad y evaluar (es decir, comparar las diferentes opciones anteriores) con diferentes criterios como:
Jupyter
(cuadernos interactivos), etc.Algunas cosas que una biblioteca JS puede que nunca haga (pero ¿podría?)
fuente
He estado trabajando en una biblioteca de lucha de datos para JavaScript llamada data-forge. Está inspirado en LINQ y Pandas.
Se puede instalar así:
npm install --save data-forge
Su ejemplo funcionaría así:
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" ]) ;
Si sus datos estaban en un archivo CSV, podría cargarlo así:
var dataFrame = dataForge.readFileSync(fileName) .parseCSV() .parseInts([ "col1", "col2", "col3" ]) ;
Puede utilizar el
select
método para transformar filas.Puede extraer una columna usando y
getSeries
luego usar elselect
método para transformar los valores en esa columna.Obtienes tus datos fuera del marco de datos de esta manera:
var data = dataFrame.toArray();
Para promediar una columna:
var avg = dataFrame.getSeries("col1").average();
Hay mucho más que puedes hacer con esto.
Puede encontrar más documentación en npm .
fuente
Ceaveat ¡ Lo siguiente es aplicable solo a d3 v3, y no al último d4v4!
Soy parcial a d3.js , y aunque no será un reemplazo total para Pandas, si pasa algún tiempo aprendiendo su paradigma, debería poder encargarse de todos sus datos por usted. (Y si termina queriendo mostrar los resultados en el navegador, es ideal para eso).
Ejemplo. Mi archivo CSV
data.csv
:name,age,color Mickey,65,black Donald,58,white Pluto,64,orange
En el mismo directorio, cree un que
index.html
contenga lo siguiente:<!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>
y también un
demo.js
archivo que contiene lo siguiente: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); });
En el directorio, ejecute
python -m SimpleHTTPServer 8181
y abra http: // localhost: 8181 en su navegador para ver una lista simple de las edades y su promedio.Este sencillo ejemplo muestra algunas características relevantes de d3:
fuente
Pandas.js en este momento es una biblioteca experimental, pero parece muy prometedor que usa bajo el capó inmutable.js y lógica NumpPy, tanto la serie de objetos de datos como DataFrame están ahí.
fuente
A continuación se muestra Python numpy y 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)
''
Lo mismo se puede lograr en JavaScript * [ numjs solo funciona con Node.js ] Pero D3.js tiene opciones de conjunto de archivos de datos mucho más avanzadas. Tanto numjs como Pandas-js todavía están en funcionamiento.
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 */
fuente
Creo que lo más parecido son bibliotecas como:
Recline, en particular, tiene un objeto Dataset con una estructura algo similar a los marcos de datos de Pandas. A continuación, le permite conectar sus datos con "Vistas", como una cuadrícula de datos, gráficos, mapas, etc. Las vistas suelen ser envolturas finas alrededor de las mejores bibliotecas de visualización existentes, como D3, Flot, SlickGrid, etc.
Aquí hay un ejemplo de reclinarse:
fuente
@ neversaint, tu espera ha terminado. da la bienvenida a Danfo.js, que es pandas como la biblioteca Javascript construida en tensorflow.js y admite tensores listos para usar. Esto significa que puede convertir la estructura de datos danfo en tensores. Y puede hacer grupos, fusionar, unir, trazar y otros procesos de datos.
fuente
Es bastante fácil analizar CSV en javascript porque cada línea ya es esencialmente una matriz de javascript. Si carga su csv en una matriz de cadenas (una por línea), es bastante fácil cargar una matriz de matrices con los 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); };
Luego
getData()
devuelve una matriz multidimensional de valores por columna.He demostrado esto en un jsFiddle para ti.
Por supuesto, no puede hacerlo tan fácilmente si no confía en la entrada, si pudiera haber un script en sus datos que eval podría recoger, etc.
fuente
Aquí hay un enfoque dinámico asumiendo un encabezado existente en la línea 1. El csv está cargado con
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); });
Luego, puede acceder a cada columna de datos similar a un marco de datos R, python o Matlab con
df.column_header[row_number]
.fuente