web-dev-qa-db-fra.com

Pandon Python équivalent en JavaScript

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:

  1. Analyse CSV

  2. Sélectionner des colonnes dans un cadre de données (col1 et col3)

  3. Traiter la colonne (par exemple, avarage des valeurs de col1 et col3)

Existe-t-il une bibliothèque JavaScript qui aime les pandas?

28
neversaint

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.

  • dataframe-js
    • "DataFrame-js fournit une structure de données immuable pour javascript et datascience, le DataFrame, qui permet de travailler sur des lignes et des colonnes avec une API inspirée de la programmation fonctionnelle et fonctionnelle."
  • data-forge
  • jsdataframe
    • "Jsdataframe est une bibliothèque de correspondance de données JavaScript inspirée des fonctionnalités de trame de données de R et Python Pandas."
  • trame de données
    • "explorer les données en regroupant et en réduisant."

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:

  • _ { Apache Arrow dans JS
    • Grâce à la suggestion de l'utilisateur Back2Basics:
    • "Apache Arrow est une spécification de disposition de mémoire en colonnes destinée à coder des vecteurs et des conteneurs sous forme de tableaux de données plates et imbriquées. Apache Arrow est le standard émergent pour les grandes données en colonnes en mémoire (Spark, Pandas, Drill, Graphistry,. ..) "
  • Observable
    • À première vue, cela ressemble à une alternative JS à IPython/Jupyter "notebooks"
    • La page d'Observable promet: "Programmation réactive", une "communauté", sur une "plate-forme Web"
    • Voir l'intro de 5 minutes ici
  • inclinable (de la réponse de Rufus )
    • Je m'attendais à mettre l'accent sur l'API de DataFrame, que Pandas essaie elle-même de préserver de R documentez son remplacement/amélioration/correspondance pour chaque fonction R }. 
    • Au lieu de cela, je trouve que l'emphase souligne l'exemple de le moyen jQuery d'obtenir des données dans le DOM son (génial) Multiview (l'interface utilisateur), qui ne nécessite pas jQuery mais nécessite un navigateur! Plus d'exemples
    • ... ou un accent sur son architecture MVC-ish } _; y compris le matériel principal (connexions de base de données, par exemple)
    • Je suis probablement trop dur; Après tout, l’un des avantages de Nice sur les pandas est de savoir comment créer facilement des visualisations; hors de la boîte. 
  • js-data
    • Vraiment plus d'un ORM ! La plupart des ses modules correspondent à différentes données stockage (js-data-mongodb, js-data-redis, js-data-cloud-datastore), au tri, au filtrage, etc.
    • On-side fonctionne sur Node.js en priorité; "Fonctionne dans Node.js et dans le navigateur." 
  • _ { miso } _ (une autre suggestion de Rufus )
  • AlaSQL
    • "AlaSQL" est une base de données SQL open source pour Javascript avec un accent particulier sur la vitesse de requête et la flexibilité des sources de données pour les données relationnelles et les données sans schéma. Cela fonctionne dans votre navigateur Node.js et Cordova. "
  • Quelques expériences de pensée:

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:

  • Critères de Panda dans son comparaison R
    • Performance
    • Fonctionnalité/flexibilité
    • Facilité d'utilisation
  • Mes propres suggestions
    • Similarité avec les API Pandas/Dataframe
    • Frappe spécifiquement sur leur caractéristiques principales
    • Accent mis sur la science des données> Accent mis sur l'interface utilisateur
    • Intégration démontrée en combinaison avec d'autres outils tels que Jupyter (Cahiers interactifs), etc.

Certaines choses qu'une bibliothèque JS peut ne jamais faire (mais est-ce possible?)

  • Utilisez une structure sous-jacente qui est la meilleure bibliothèque de nombres/mathématiques en Javascript? (c'est-à-dire un équivalent d'un NumPy )
  • Utilisez tous les outils d’optimisation/compilateurs pouvant générer un code plus rapide (c’est-à-dire un équivalent de l’utilisation de Cython par les Pandas} _)
  • Parrainé par des consortiums de données scientifiques, ala Pandas and NumFocus
42
The Red Pea

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 .

4
Ashley Davis

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! 
3
Rufus Pollock

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:

  • Excellent support pour l'acquisition de données en ligne ( CSV , TSV, JSON, etc.)
  • Des compétences en matière de lutte contre la corruption des données
  • Manipulation DOM basée sur les données (peut-être la chose la plus difficile à comprendre): vos données sont transformées en éléments DOM.
2
Ahmed Fasih

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.

1
Steve K

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]

1
Manuel

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

*/

1
STEEL