Avec cet exemple CSV:
Source,col1,col2,col3
foo,1,2,3
bar,3,4,5
La méthode standard que j'utilise Pandas est la suivante:
Analyser CSV
Sélectionnez des colonnes dans un bloc de données (
col1
etcol3
)- Traiter la colonne (par exemple, calculer la moyenne des valeurs de
col1
etcol3
)
Existe-t-il une bibliothèque JavaScript qui fait cela comme Pandas?
javascript
python
pandas
Neversaint
la source
la source
Réponses:
Toutes les réponses sont bonnes. En espérant que ma réponse est complète (c'est-à-dire essaie de lister toutes les options). J'espère revenir et réviser cette réponse avec tous les critères pour aider à faire un choix.
J'espère que tous ceux qui viennent ici connaissent
d3
.d3
est un «couteau suisse» très utile pour gérer les données en Javascript, commepandas
c'est utile pour Python. Vous pouvez voird3
utilisé fréquemment commepandas
, même si ced3
n'est pas exactement un remplacement DataFrame / Pandas (c'estd3
-à- dire n'a pas la même API;d3
n'a pasSeries
/DataFrame
qui se comporte comme danspandas
)La réponse d'Ahmed explique comment d3 peut être utilisé pour obtenir certaines fonctionnalités de DataFrame, et certaines des bibliothèques ci-dessous ont été inspirées par des choses comme LearnJsData qui utilise
d3
etlodash
.En ce qui concerne les fonctionnalités axées sur DataFrame, j'ai été submergé par les bibliothèques JS qui aident. Voici une liste rapide de certaines des options que vous avez peut-être rencontrées. Je n'ai encore vérifié aucun d'entre eux en détail (la plupart ont été trouvés en combinaison avec la recherche Google + NPM).
Veillez à utiliser une variété avec laquelle vous pouvez travailler; certains sont Node.js aka Javascript côté serveur, certains sont compatibles avec le navigateur aka Javascript côté client. Certains sont dactylographiés.
Ensuite, après être arrivé à cette question, en vérifiant les autres réponses ici et en faisant plus de recherches, j'ai trouvé des options comme:
JS
alternative aux "notebooks" IPython / Jupyterpréserver de Rdocumenter son remplacement / amélioration / correspondance à toutes les fonctions de R .la manière jQuery d'obtenir des données dans le DOMson (génial) Multiview (l'interface utilisateur), qui ne nécessite pas jQuery mais nécessite un navigateur! Plus d'exemplesjs-data-mongodb
,js-data-redis
,js-data-cloud-datastore
), le tri, le filtrage, etc.J'espère que cet article pourra devenir un wiki communautaire et évaluer (c'est-à-dire comparer les différentes options ci-dessus) par rapport à différents critères tels que:
Jupyter
(blocs-notes interactifs), etc.Certaines choses qu'une bibliothèque JS peut ne jamais faire (mais le pourrait-il?)
la source
J'ai travaillé sur une bibliothèque de data wrangling pour JavaScript appelée data-forge. Il est inspiré par LINQ et 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
select
méthode pour transformer des lignes.Vous pouvez extraire une colonne en utilisant,
getSeries
puis utiliser laselect
méthode pour transformer les valeurs de cette colonne.Vous récupérez vos données de la trame 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 .
la source
Ceaveat Ce qui suit s'applique uniquement à d3 v3, et non à la dernière d4v4!
Je suis partisan de d3.js , et même s'il ne remplacera pas totalement les pandas, si vous passez du temps à apprendre son paradigme, il devrait être en mesure de prendre en charge toutes vos données à votre place. (Et si vous finissez par vouloir afficher les résultats dans le navigateur, c'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 également un
demo.js
fichier 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 voir une liste simple des âges et de leur moyenne.Cet exemple simple montre quelques fonctionnalités pertinentes de d3:
la source
Pandas.js est pour le moment une bibliothèque expérimentale, mais semble très prometteuse, elle utilise sous le capot immutable.js et la logique NumpPy, les séries d'objets de données et DataFrame sont là.
la source
Ci-dessous se trouve Python numpy et 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)
''
La même chose peut être obtenue en JavaScript * [ numjs fonctionne uniquement avec Node.js ] Mais D3.js a beaucoup d'options avancées de jeu de fichiers de données. Numjs et Pandas-js sont toujours en travaux.
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 */
la source
Je pense que ce qui se rapproche le plus, ce sont des bibliothèques comme:
Recline 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 sont généralement des enveloppes minces autour des meilleures bibliothèques de visualisation existantes telles que D3, Flot, SlickGrid, etc.
Voici un exemple pour Recline:
la source
@neversaint votre attente est terminée. dites bienvenue à Danfo.js, qui est des pandas comme la bibliothèque Javascript construite sur tensorflow.js et prend en charge les tenseurs prêts à l'emploi. Cela signifie que vous pouvez convertir la structure de données danfo en Tensors. Et vous pouvez effectuer le groupby, la fusion, la jonction, le traçage et d'autres traitements de données.
la source
Il est assez facile d'analyser CSV en javascript 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:
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); };
Renvoie ensuite
getData()
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 peut y avoir un script dans vos données qu'eval pourrait récupérer, etc.
la source
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); });
Ensuite, vous êtes en mesure d'accéder à chaque colonne de données similaire à un dataframe R, python ou Matlab avec
df.column_header[row_number]
.la source