Python Pandas-Äquivalent in JavaScript

93

Mit diesem CSV-Beispiel:

   Source,col1,col2,col3
   foo,1,2,3
   bar,3,4,5

Die Standardmethode, die ich für Pandas verwende, ist folgende:

  1. CSV analysieren

  2. Wählen Sie Spalten in einem Datenrahmen aus ( col1und col3)

  3. Verarbeiten Sie die Spalte (z. B. die durchschnittlichen Werte von col1und col3)

Gibt es eine JavaScript-Bibliothek, die Pandas mag?

neversaint
quelle
6
Lassen Sie uns wissen, was Sie am Ende machen. Dies ist eine wichtige Frage für viele von uns.
Ahmed Fasih

Antworten:

130

Alle Antworten sind gut. Ich hoffe, meine Antwort ist umfassend (dh ich versuche, alle Optionen aufzulisten). Ich hoffe, dass ich zurückkehren und diese Antwort mit allen Kriterien überarbeiten kann, um eine Auswahl zu treffen.

Ich hoffe, dass jemand, der hierher kommt, vertraut ist d3. d3ist ein sehr nützliches "Schweizer Taschenmesser" für den Umgang mit Daten in Javascript, wie pandases für Python hilfreich ist. Sie können d3häufig verwendet sehen pandas, auch wenn d3es sich nicht genau um einen DataFrame / Pandas-Ersatz handelt (dh d3nicht die gleiche API hat; d3nicht Series/ DataFramedie sich wie in verhält pandas).

In Ahmeds Antwort wird erklärt, wie mit d3 einige DataFrame-Funktionen erreicht werden können. Einige der folgenden Bibliotheken wurden von Dingen wie LearnJsData inspiriert, die d3und verwenden lodash.

Was DataFrame-fokussierte Funktionen betrifft, war ich mit JS-Bibliotheken überfordert, die helfen. Hier ist eine kurze Liste einiger Optionen, auf die Sie möglicherweise gestoßen sind. Ich habe noch keine im Detail überprüft (die meisten habe ich in Kombination mit Google + NPM-Suche gefunden).

Achten Sie darauf, dass Sie eine Sorte verwenden, mit der Sie arbeiten können. Einige sind Node.js, auch bekannt als serverseitiges Javascript, andere sind browserkompatibel, auch bekannt als clientseitiges Javascript. Einige sind Typoskript.

  • pandas-js
    • Aus den Antworten von STEEL und Feras
    • "pandas.js ist eine Open-Source-Bibliothek (experimentell), die die Python-Pandas-Bibliothek nachahmt. Sie basiert auf Immutable.js als logischem NumPy-Äquivalent. Die Hauptdatenobjekte in pandas.js sind wie in Python-Pandas die Serie und der DataFrame . "
  • Datenrahmen-js
    • "DataFrame-js bietet eine unveränderliche Datenstruktur für Javascript und Datascience, den DataFrame, mit dem Zeilen und Spalten mit einer von SQL und funktionaler Programmierung inspirierten API bearbeitet werden können."
  • Datenschmiede
    • Gesehen in Ashley Davis 'Antwort
    • "JavaScript-Toolkit zur Transformation und Analyse von Daten, inspiriert von Pandas und LINQ."
    • Beachten Sie, dass das alte Data-Forge-JS-Repository nicht mehr verwaltet wird. Jetzt verwendet ein neues Repository Typescript
  • jsdataframe
    • "Jsdataframe ist eine JavaScript-Bibliothek für Daten-Wrangling, die von der Datenrahmenfunktionalität in R- und Python-Pandas inspiriert ist."
  • Datenrahmen
    • "Erforschen Sie Daten durch Gruppieren und Reduzieren."

Nachdem ich zu dieser Frage gekommen war, andere Antworten hier überprüft und mehr gesucht hatte, fand ich Optionen wie:

  • Apache-Pfeil in JS
    • Dank des Vorschlags des Benutzers Back2Basics:
    • "Apache Arrow ist eine Spezifikation für das Spaltenspeicherlayout zum Codieren von Vektoren und tabellenartigen Containern mit flachen und verschachtelten Daten. Apache Arrow ist der aufstrebende Standard für große speicherinterne Säulendaten (Spark, Pandas , Drill, Graphistry, ...)."
  • Beobachtbar
    • Auf den ersten Blick scheint es eine JSAlternative zu den IPython / Jupyter "Notebooks" zu sein.
    • Die Seite von Observable verspricht: "Reaktive Programmierung", eine "Community" auf einer "Webplattform"
    • Siehe 5 Minuten Intro hier
  • lehnen Sie sich zurück (aus Rufus 'Antwort )
    • Ich erwartete einen Schwerpunkt auf der API von DataFrame, die Pandas selbst versucht bewahren vor R. dokumentieren Sie den Austausch / die Verbesserung / die Entsprechung zu jeder R-Funktion .
    • Stattdessen finde ich eine Betonung, die das Beispiel von recline hervorhebt die jQuery-Methode zum Abrufen von Daten in das DOMEs ist (fantastisch) Multiview (die Benutzeroberfläche), für die kein jQuery, sondern ein Browser erforderlich ist! Mehr Beispiele
    • ... oder eine Betonung seiner MVC-artigen Architektur ; einschließlich Back-End-Material (dh Datenbankverbindungen)
    • Ich bin wahrscheinlich zu hart; Schließlich ist eines der schönen Dinge an Pandas, wie es leicht Visualisierungen erstellen kann; Out-of-the-Box.
  • js-Daten
    • Wirklich eher ein ORM ! Die meisten seiner Module entsprechen verschiedenen Datenspeicher Fragen ( js-data-mongodb, js-data-redis, js-data-cloud-datastore), Sortierung, Filterung, usw.
    • Auf der positiven Seite funktioniert Node.js als erste Priorität. "Funktioniert in Node.js und im Browser."
  • Miso (ein weiterer Vorschlag von Rufus )
  • AlaSQL
    • "AlaSQL" ist eine Open-Source-SQL-Datenbank für Javascript mit einem starken Fokus auf Abfragegeschwindigkeit und Datenquellenflexibilität sowohl für relationale Daten als auch für schemenlose Daten. Es funktioniert in Ihrem Browser, Node.js und Cordova. "
  • Einige Gedankenexperimente:

Ich hoffe, dieser Beitrag kann zu einem Community-Wiki werden und anhand verschiedener Kriterien wie z. B.: Bewertet (dh die verschiedenen oben genannten Optionen verglichen) werden.

  • Pandas Kriterien in seinem R-Vergleich
    • Performance
    • Funktionalität / Flexibilität
    • Benutzerfreundlichkeit
  • Meine eigenen Vorschläge
    • Ähnlichkeit mit Pandas / Dataframe-APIs
    • Speziell trifft auf ihre Hauptmerkmale
    • Datenwissenschaftlicher Schwerpunkt> UI-Schwerpunkt
    • Demonstrierte Integration in Kombination mit anderen Tools wie Jupyter (interaktive Notizbücher) usw.

Einige Dinge, die eine JS-Bibliothek möglicherweise nie tut (aber könnte es?)

Die rote Erbse
quelle
1
Vielen Dank für diesen wunderbaren Überblick. Ich kenne sowohl die Verwendung von Pandas-Datenrahmen als auch SQL. Welche Vor- und Nachteile hat die Verwendung von JS mithilfe von Datenrahmen gegenüber einer JS SQL-Datenbank?
Tardis
@molotow das ist eine großartige Frage, aber ich habe nicht viel Erfahrung mit JS SQL-Datenbanken (obwohl sie cool aussehen). Im Allgemeinen würde ich vermuten, dass Dataframe-Ansätze mehr auf "Data Wrangling" / "Data Science" fokussierte Funktionen unterstützen würden, wie das Ableiten leerer Werte; Matrixmultiplikation usw. durchführen. Während sich ein (JS) SQL mehr auf relationale Dinge konzentriert: Abfragen, Sortieren, Filtern. Natürlich wird es Überschneidungen geben; Datenrahmen können beitreten, sortieren und filtern, genau wie SQL einige statistische Funktionen usw. enthält. Hat noch jemand Ideen?
Die rote Erbse
1
Die Tatsache, dass es so viele Möglichkeiten gibt, ist ärgerlich. Konzentrieren Sie sich lieber auf eine Sache und machen Sie es gut.
Claudiu Creanga
3
(Pfeil JS Autor hier) @ClaudiuCreanga Ich verstehe die Frustration. Ursprünglich haben wir ArrowJS geschrieben, um die Kluft zwischen Knoten / Browsern und traditionelleren Big-Data-Stacks zu überbrücken, und wir haben bisher am stärksten in hervorragende IPC / Streaming-Grundelemente investiert. Als nächste Schritte würden wir gerne mit der Integration in mehr JS-Bibliotheken (Tensorflow, d3 usw.) beginnen, und PRs sind immer willkommen. Ein alternativer Ansatz ist das Perspective- Projekt von JPMC , bei dem ArrowJS zum Konsumieren und Produzieren von Arrow-Tabellen verwendet wird.
Ptaylor
1
Gibt es eine Funktionalität für die Zusammenführung von Datenrahmen in Pandas, die Javascript entspricht?
Phani Vikranth
9

Ich habe an einer Data Wrangling-Bibliothek für JavaScript namens Data-Forge gearbeitet. Es ist inspiriert von LINQ und Pandas.

Es kann folgendermaßen installiert werden:

npm install --save data-forge

Ihr Beispiel würde folgendermaßen funktionieren:

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" ])
        ;

Wenn sich Ihre Daten in einer CSV-Datei befinden, können Sie sie folgendermaßen laden:

var dataFrame = dataForge.readFileSync(fileName)
    .parseCSV()
    .parseInts([ "col1", "col2", "col3" ])
    ;

Mit der selectMethode können Sie Zeilen transformieren.

Sie können eine Spalte extrahieren, indem Sie getSeriesdie selectMethode verwenden, um Werte in dieser Spalte zu transformieren.

Sie erhalten Ihre Daten wie folgt aus dem Datenrahmen zurück:

var data = dataFrame.toArray();

So mitteln Sie eine Spalte:

 var avg = dataFrame.getSeries("col1").average();

Damit können Sie noch viel mehr tun.

Weitere Dokumentation finden Sie auf npm .

Ashley Davis
quelle
7

Ceaveat Das Folgende gilt nur für d3 v3 und nicht für das neueste d4v4!

Ich bin ein Teil von d3.js , und obwohl es kein vollständiger Ersatz für Pandas ist, sollte es in der Lage sein, alle Ihre Daten für Sie zu erledigen , wenn Sie einige Zeit damit verbringen, sein Paradigma zu lernen. (Und wenn Sie am Ende Ergebnisse im Browser anzeigen möchten, ist dies ideal dafür geeignet.)

Beispiel. Meine CSV-Datei data.csv:

name,age,color
Mickey,65,black
Donald,58,white
Pluto,64,orange

Erstellen Sie im selben Verzeichnis ein Verzeichnis, index.htmldas Folgendes enthält:

<!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>

und auch eine demo.jsDatei, die Folgendes enthält:

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);
       });

Führen Sie im Verzeichnis http: // localhost: 8181 auspython -m SimpleHTTPServer 8181 und öffnen Sie es in Ihrem Browser, um eine einfache Auflistung des Alters und seines Durchschnitts anzuzeigen.

Dieses einfache Beispiel zeigt einige relevante Funktionen von d3:

  • Hervorragende Unterstützung für die Aufnahme von Online-Daten ( CSV , TSV, JSON usw.)
  • Daten-Wrangling-Smarts eingebrannt
  • Datengesteuerte DOM-Manipulation (vielleicht das Schwierigste, den Kopf herumzureißen): Ihre Daten werden in DOM-Elemente umgewandelt.
Ahmed Fasih
quelle
2
Nur um zukünftigen Neulingen zu helfen - die obigen Anweisungen gelten nicht mehr für d3 v4. Ich denke, die Zuordnungsphase ist jetzt innerhalb des Datenrückrufs abgeschlossen, z. B. github.com/d3/d3-dsv/blob/master/README.md#csvParseRows
swyx
@swyx danke für Heads-up, kannst du das Beispiel korrigieren und als Antwort posten?
Ahmed Fasih
@AhmedFasih Du solltest deinen eigenen Beitrag zum Nutzen aller korrigieren. Außerdem hat swyx nicht genug Ruf, um Ihren Beitrag zu bearbeiten.
Carles Alcolea
@ CarlesAlcolea Ich habe oben einen großen Haftungsausschluss hinzugefügt. Tut mir leid, ich habe momentan keine Zeit, mich über die aktuelle API zu informieren 😿
Ahmed Fasih
@AhmedFasih na das ist besser als vorher :) Danke!
Carles Alcolea
5

Pandas.js ist im Moment eine experimentelle Bibliothek, scheint aber sehr vielversprechend zu sein, da sie unter der Haube unveränderliche.js und NumpPy-Logik verwendet. Beide Datenobjektserien und DataFrame sind vorhanden.

Feras
quelle
3
Es sieht so aus, als hätte die Bibliothek seit über zwei Jahren kein Commit mehr und scheint viele Probleme zu haben. Ich würde nicht "sehr vielversprechend" sagen.
Jarthur
4

Unten ist Python Numpy und 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)

`` `

Dasselbe kann in JavaScript erreicht werden * [ numjs funktioniert nur mit Node.js ] D3.js verfügt jedoch über weit erweiterte Optionen für Datendateien. Sowohl numjs als auch Pandas-js sind noch in Arbeit.

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

*/

STAHL
quelle
3

Ich denke, am nächsten kommen Bibliotheken wie:

Insbesondere Recline verfügt über ein Dataset-Objekt mit einer Struktur, die Pandas-Datenrahmen ähnelt. Anschließend können Sie Ihre Daten mit "Ansichten" wie Datenraster, Grafiken, Karten usw. verbinden. Ansichten sind normalerweise dünne Umhüllungen vorhandener Best-of-Breed-Visualisierungsbibliotheken wie D3, Flot, SlickGrid usw.

Hier ist ein Beispiel für Zurücklehnen:

// Einige Daten laden
var dataset = recline.Model.Dataset ({
  Aufzeichnungen: [
    {Wert: 1, Datum: '2012-08-07'},
    {Wert: 5, b: '2013-09-07'}
  ]]
  // Lade stattdessen CSV-Daten
  // (Und Recline unterstützt viele weitere Datenquellentypen)
  // url: 'my-local-csv-file.csv',
  // Backend: 'csv'
});

// Holen Sie sich ein Element aus Ihrem HTML für den Viewer
var $ el = $ ('# data-viewer');

var allInOneDataViewer = new recline.View.MultiView ({
  Modell: Datensatz,
  el: $ el
});
// Ihr neuer Daten-Viewer wird live sein!
Rufus Pollock
quelle
3

@neversaint dein Warten hat ein Ende. sagen willkommen zu Danfo.js die Pandas wie Javascript - Bibliothek gebaut auf tensorflow.js und unterstützt Tensoren aus der Box ist. Dies bedeutet, dass Sie die Danfo-Datenstruktur in Tensoren konvertieren können. Und Sie können Groupby, Zusammenführen, Verbinden, Plotten und andere Datenverarbeitung durchführen.

Vignesh Prajapati
quelle
1

Es ist ziemlich einfach, CSV in Javascript zu analysieren, da jede Zeile bereits im Wesentlichen ein Javascript-Array ist. Wenn Sie Ihre CSV in ein Array von Zeichenfolgen laden (eine pro Zeile), ist es ziemlich einfach, ein Array von Arrays mit den folgenden Werten zu laden:

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);
};

Dann getData()kehrt ein mehrdimensionales Array von Werten durch Spalte.

Ich habe dies in einer jsFiddle für Sie demonstriert .

Natürlich können Sie es nicht so einfach machen, wenn Sie der Eingabe nicht vertrauen - wenn Ihre Daten ein Skript enthalten könnten, das eval möglicherweise aufnimmt usw.

Steve K.
quelle
Ich weiß, dass Sie eine Warnung in Ihre Antwort eingefügt haben, aber ich kann wirklich nicht genug betonen, wie schlecht diese Methode unter Sicherheitsgesichtspunkten ist.
xApple
Aus Sicherheitsgründen ist es nur schlecht, wenn er der Eingabe nicht vertraut. Wenn er beispielsweise ein Schulprojekt durchführt, in dem er seine Eingabedateien bereits kennt (weil er oder sein Lehrer sie zuvor in einem bestimmten Format bereitgestellt hat), ist dies eine kompakte, einfache und lesbare Lösung. Er gab keinen Kontext bezüglich der Quelle seiner Eingaben an, sondern fragte nur nach einer Möglichkeit, die CSV für eine einfache Verarbeitung einzulesen.
Steve K
1

Hier ist ein dynamischer Ansatz unter der Annahme eines vorhandenen Headers in Zeile 1. Die CSV wird mit geladen 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);         

});

Dann können Sie auf jede Spalte der Daten zugreifen, die einem R-, Python- oder Matlab-Datenrahmen ähnelt df.column_header[row_number].

Manuel
quelle