Avec cet exemple CSV:
Source,col1,col2,col3
foo,1,2,3
bar,3,4,5
La méthode standard que j'utilise avec les pandas est la suivante:
Analyse CSV
Sélectionner des colonnes dans un cadre de données (col1
et col3
)
col1
et col3
)Existe-t-il une bibliothèque JavaScript qui aime les pandas?
Toutes les réponses sont bonnes. En espérant que ma réponse soit complète (c’est-à-dire essayer de répertorier toutes les options). J'espère revenir et réviser cette réponse avec tous critères pour aider à faire un choix.
J'espère que tous ceux qui viennent ici connaissent d3
. Je pense que c'est indispensable en soi, indépendamment de la recherche d'un remplaçant pour DataFrame/Pandas. La réponse d'Ahmed explique comment utiliser d3 pour obtenir certaines fonctionnalités de DataFrame, et certaines des bibliothèques ci-dessous ont été inspirées par des éléments comme LearnJsData qui utilise d3
et lodash
.
En ce qui concerne dataframe-ish, le choix me manquait. Voici une liste rapide de certaines des options que vous pourriez avoir rencontrées. Je n'ai pas encore vérifié l'un d'entre eux en détail (la plupart que j'ai trouvés en combinaison avec la recherche Google + NPM).
Veillez à utiliser une variété avec laquelle vous pouvez travailler; certains sont Node.js, également appelé Javascript côté serveur, certains sont compatibles avec un navigateur, aussi appelé Javascript côté client. Certains sont en TypeScript.
Puis, après être venu à cette question, en vérifiant d’autres réponses ici et en effectuant davantage de recherches, j’ai trouvé des options telles que:
JS
à IPython/Jupyter "notebooks"js-data-mongodb
, js-data-redis
, js-data-cloud-datastore
), au tri, au filtrage, etc.J'espère que ce message pourra devenir un wiki de communauté et évaluer (par exemple comparer les différentes options ci-dessus) par rapport à différents critères tels que:
Jupyter
(Cahiers interactifs), etc.Certaines choses qu'une bibliothèque JS peut ne jamais faire (mais est-ce possible?)
Je travaille sur une bibliothèque de luttes de données pour JavaScript appelée Data-Forge. C'est inspiré par LINQ et les pandas.
Il peut être installé comme ceci:
npm install --save data-forge
Votre exemple fonctionnerait comme ceci:
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 vos données étaient dans un fichier CSV, vous pouvez le charger comme ceci:
var dataFrame = dataForge.readFileSync(fileName)
.parseCSV()
.parseInts([ "col1", "col2", "col3" ])
;
Vous pouvez utiliser la méthode select
pour transformer des lignes.
Vous pouvez extraire une colonne à l'aide de getSeries
, puis utiliser la méthode select
pour transformer les valeurs de cette colonne.
Vous récupérez vos données hors du cadre de données comme ceci:
var data = dataFrame.toArray();
Pour faire la moyenne d'une colonne:
var avg = dataFrame.getSeries("col1").average();
Vous pouvez faire beaucoup plus avec cela.
Vous pouvez trouver plus de documentation sur npm .
Je pense que les bibliothèques les plus proches sont les suivantes:
Incliner en particulier a un objet Dataset avec une structure quelque peu similaire aux trames de données Pandas. Il vous permet ensuite de connecter vos données avec des "vues" telles qu'une grille de données, des graphiques, des cartes, etc. Les vues enveloppent généralement bien les meilleures bibliothèques de visualisation existantes, telles que D3, Flot, SlickGrid, etc.
Voici un exemple pour Recline:
// Charge des données Var dataset = recline.Model.Dataset ({ Records: [ {Valeur: 1, date: '2012-08-07'}, { valeur: 5, b: '2013-09-07'} ] // Chargez des données CSV à la place // (And Recline prend en charge plusieurs autres types de sources de données) // url : 'mon-local-csv-fichier.csv', // backend: 'csv' }); // obtenir un élément de votre code HTML pour le visualiseur var $ el = $ ('# data-viewer'); var allInOneDataViewer = new recline.View.MultiView ({ modèle: ensemble de données, el: $ el }); // Votre nouvelle visionneuse de données sera en direct!
Ceaveat Ce qui suit s’applique uniquement à d3 v3 et non au dernier d4v4!
Je suis partial avec d3.js , et bien que ce ne soit pas un remplacement total des Pandas, si vous passez du temps à apprendre son paradigme, il devrait être en mesure de prendre en charge tous vos problèmes de gestion de données. (Et si vous finissez par vouloir afficher les résultats dans le navigateur, il est parfaitement adapté à cela.)
Exemple. Mon fichier CSV data.csv
:
name,age,color
Mickey,65,black
Donald,58,white
Pluto,64,orange
Dans le même répertoire, créez un index.html
contenant les éléments suivants:
<!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>
et aussi un fichier demo.js
contenant les éléments suivants:
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);
});
Dans le répertoire, exécutez python -m SimpleHTTPServer 8181
et ouvrez http: // localhost: 8181 dans votre navigateur pour afficher une simple liste des âges et de leur moyenne.
Cet exemple simple montre quelques fonctionnalités pertinentes de d3:
Il est assez facile d'analyser javascript au format CSV car chaque ligne est déjà essentiellement un tableau javascript. Si vous chargez votre csv dans un tableau de chaînes (une par ligne), il est assez facile de charger un tableau de tableaux avec les valeurs suivantes:
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);
};
Ensuite, getData()
renvoie un tableau multidimensionnel de valeurs par colonne.
J'ai démontré cela dans un jsFiddle pour vous.
Bien sûr, vous ne pouvez pas le faire aussi facilement si vous ne faites pas confiance à l'entrée - s'il pourrait y avoir un script dans vos données que eval pourrait récupérer, etc.
Voici une approche dynamique supposant un en-tête existant sur la ligne 1. Le csv est chargé avec 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);
});
Vous pouvez ensuite accéder à chaque colonne de données similaire à une image R, Python ou Matlab avec df.column_header[row_number]
.
Ci-dessous, numpy et pandas en python
`` `
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)
`` `
La même chose peut être obtenue en JavaScript * [ numjs ne fonctionne qu'avec Node.js ] Mais D3.js possède de nombreuses options avancées de jeu de fichiers de données. Numjs et Pandas-js toujours dans les œuvres ..
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
*/