Python Pandas'ın JavaScript'teki eşdeğeri


96

Bu CSV örneğiyle:

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

Pandaları kullandığım standart yöntem şudur:

  1. CSV'yi ayrıştır

  2. Bir veri çerçevesine sütun seçin ( col1ve col3)

  3. Sütunu işleyin (örneğin, col1ve değerlerini ortalama col3)

Pandalar gibi yapan bir JavaScript kitaplığı var mı?


6
Neyle karşılaştığınızı bize bildirin. Bu, çoğumuz için önemli bir sorudur.
Ahmed Fasih

Yanıtlar:


133

Tüm cevaplar güzel. Cevabımın kapsamlı olmasını umuyorum (yani tüm seçenekleri listelemeye çalışıyor ). Bir seçim yapmanıza yardımcı olacak herhangi bir kriterle bu yanıtı geri almayı ve gözden geçirmeyi umuyorum.

Umarım buraya gelen herkes aşinadır d3. Python için yararlı olduğu d3gibi pandas, Javascript'teki verileri işlemek için çok yararlı bir "İsviçre çakısı" dır. Sen önerilerini görebilirsiniz d3sık gibi kullanılabilir pandasolsa bile, d3olan bir DataFrame / Pandalar yedek tam olarak değil (yani d3aynı API sahip değildir; d3yok Series/ DataFramegibi hangi davranan pandas)

Ahmed'in cevabı d3 nasıl kullanılabileceğini açıklayan bazı DataFrame işlevselliği elde etmek için, aşağıdaki kütüphanelerin bazıları gibi şeyler ilham edildi LearnJsData kullanımları d3ve lodash.

DataFrame odaklı özelliklere gelince, yardımcı olan JS kitaplıklarıyla boğulmuştum. İşte karşılaşmış olabileceğiniz bazı seçeneklerin hızlı bir listesi. Henüz hiçbirini ayrıntılı olarak kontrol etmedim (Çoğu Google + NPM araması kombinasyonunda buldum).

Dikkatli olun, birlikte çalışabileceğiniz bir çeşitlilik kullanın; bazıları Node.js, diğer adıyla Sunucu tarafı Javascript, bazıları tarayıcı uyumlu, yani istemci tarafı JavaScript'tir. Bazıları Typescript.

  • Pandas-js
    • Gönderen Çelik ve Feras 'cevapları
    • "pandas.js, Python pandas kitaplığını taklit eden açık kaynaklı (deneysel) bir kitaplıktır. NumPy mantıksal eşdeğeri olarak Immutable.js'ye dayanır. Pandas.js'deki ana veri nesneleri, Python pandaları, Seriler ve DataFrame'deki gibidir. . "
  • dataframe-js
    • "DataFrame-js, javascript ve veri bilimi için değişmez bir veri yapısı sağlar; DataFrame, bir sql ve işlevsel programlamadan ilham alan API ile satırlar ve sütunlar üzerinde çalışmaya izin verir."
  • veri dövme
  • jsdataframe
    • "Jsdataframe, R ve Python Pandalar'daki veri çerçevesi işlevselliğinden esinlenen bir JavaScript veri işleme kitaplığıdır."
  • veri çerçevesi
    • "Gruplayarak ve azaltarak verileri keşfedin."

Sonra bu soruya gelip burada diğer cevapları kontrol edip daha fazla arama yaptıktan sonra, aşağıdaki gibi seçenekler buldum:

  • JS'de Apache Arrow
    • Back2Basics kullanıcı önerisine teşekkürler:
    • "Apache Arrow, vektörleri ve düz ve iç içe geçmiş verilerin tablo benzeri kaplarını kodlamak için sütunlu bir bellek düzeni spesifikasyonudur. Apache Arrow, büyük bellek içi sütunlu veriler (Spark, Pandas , Drill, Graphistry, ...) için ortaya çıkan standarttır. "
  • Gözlenebilir
    • İlk bakışta JSIPython / Jupyter "dizüstü bilgisayarlara" bir alternatif gibi görünüyor
    • Observable'ın sayfası şunları vaat ediyor: "Web Platformu" üzerinde "Reaktif programlama", "Topluluk"
    • Burada 5 dakikalık tanıtımı görün
  • yaslanmak ( Rufus'un cevabından )
  • js-data
    • Gerçekten daha çok bir ORM ! Çoğu kendi modüllerinin farklı veri karşılık depolama soruları ( js-data-mongodb, js-data-redis, js-data-cloud-datastore), sıralama, filtreleme, vb
    • Artı tarafta, birinci öncelik olarak Node.js üzerinde çalışır; "Node.js'de ve Tarayıcıda çalışır."
  • Miso (başka bir öneri rufus )
  • AlaSQL
    • "AlaSQL", hem ilişkisel veriler hem de şemasız veriler için sorgu hızına ve veri kaynağı esnekliğine güçlü bir şekilde odaklanan, Javascript için açık kaynaklı bir SQL veritabanıdır. Tarayıcınızda, Node.js'de ve Cordova'da çalışır. "
  • Bazı düşünce deneyleri:

Umarım bu gönderi bir topluluk wiki'si haline gelebilir ve aşağıdaki gibi farklı kriterlere göre değerlendirebilir (yani yukarıdaki farklı seçenekleri karşılaştırabilir):

  • Panda'nın R karşılaştırmasında kriterleri
    • Verim
    • İşlevsellik / esneklik
    • Kullanım kolaylığı
  • Kendi önerilerim
    • Pandas / Dataframe API'lerine benzerlik
    • Özellikle ana özelliklerine hitap ediyor
    • Veri bilimi vurgusu> Kullanıcı arayüzü vurgusu
    • Diğer araçlarla Jupyter (etkileşimli not defterleri), vb . Kombinasyon halinde gösterilmiş entegrasyon

Bir JS kitaplığının asla yapamayacağı bazı şeyler (ama yapabilir mi?)


1
Bu harika genel bakış için teşekkürler. Hem panda veri çerçevelerinin hem de SQL'in kullanımını biliyorum. JS SQL veritabanı yerine veri çerçeveleri kullanarak JS kullanmanın avantajları (ve dezavantajları) nelerdir?
tardis

@molotow bu harika bir soru, ancak JS SQL veritabanları ile ilgili pek tecrübem yok (havalı görünseler de). Genel olarak , veri çerçevesi tipi yaklaşımların, boş değerlerin çıkarılması gibi daha fazla "veri tartışması" / "veri bilimi" odaklı işlevleri destekleyeceğini tahmin ediyorum; matris çarpımı vb. yapmak. Oysa (JS) SQL daha çok ilişkisel şeylere odaklanır: sorgulama, sıralama, filtreleme. Tabii ki örtüşme olacak; dataframe, tıpkı SQL'in bazı istatistiksel işlevler vb. içerdiği gibi JOIN, sıralama ve filtreleme yapabilir. Başka birinin fikri var mı?
The Red Pea

1
bu kadar çok seçeneğin olması can sıkıcı. Bunun yerine, topluluğun yalnızca bir şeye odaklanmasını sağlayın ve onu iyi hale getirin.
Claudiu Creanga

3
(Arrow JS yazarı burada) @ClaudiuCreanga Hayal kırıklığını anlıyorum. Başlangıçta, ArrowJS'yi düğüm / tarayıcılar ile daha geleneksel büyük veri yığınları arasındaki ayrımı kapatmak amacıyla yazdık ve şimdiye kadar en çok mükemmel IPC / akış ilkellerine yatırım yaptık. Sonraki adımlar olarak, daha fazla JS kütüphanesi (tensorflow, d3, vb.) İle entegre etmeye başlamak isteriz ve PR'ler her zaman memnuniyetle karşılanır. Alternatif bir yaklaşım, Ok tablolarını tüketmek ve üretmek için ArrowJS kullanan JPMC'nin Perspective projesi gibi şeylerdir .
ptaylor

1
pandaların javascript'teki eşdeğerinde veri çerçevesi birleştirme işlevi var mı?
Phani vikranth

9

Data-forge adlı JavaScript için veri düzenleme kitaplığı üzerinde çalışıyorum. LINQ ve Pandas'tan esinlenmiştir.

Şu şekilde kurulabilir:

npm install --save data-forge

Örneğiniz şu şekilde çalışacaktır:

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

Verileriniz bir CSV dosyasındaysa, aşağıdaki gibi yükleyebilirsiniz:

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

selectYöntemi satırları dönüştürmek için kullanabilirsiniz .

Kullanarak bir sütunu ayıklayabilir ve getSeriesardından selectbu sütundaki değerleri dönüştürmek için yöntemi kullanabilirsiniz .

Verilerinizi veri çerçevesinden şu şekilde geri alırsınız:

var data = dataFrame.toArray();

Bir sütunun ortalamasını almak için:

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

Bununla yapabileceğiniz daha çok şey var.

Npm'de daha fazla belge bulabilirsiniz .


8

Ceaveat Aşağıdakiler yalnızca d3 v3 için geçerlidir, en son d4v4 için geçerli değildir!

Ben d3.js'ye düşkünüm ve Pandalar için tam bir ikame olmayacak olsa da, paradigmasını öğrenmek için biraz zaman harcarsanız, sizin için tüm veri çekişmelerinizle ilgilenebilir. (Ve sonuçları tarayıcıda görüntülemek isteyip istemediğinize karar verirseniz, ideal olarak buna uygundur.)

Misal. CSV dosyam data.csv:

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

Aynı dizinde index.htmlaşağıdakileri içeren bir tane oluşturun:

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

ve ayrıca demo.jsaşağıdakileri içeren bir dosya:

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

Dizinde , yaşların ve ortalamalarının basit bir listesini görmek için tarayıcınızda http: // localhost: 8181'i çalıştırın python -m SimpleHTTPServer 8181ve açın .

Bu basit örnek, d3'ün birkaç alakalı özelliğini göstermektedir:

  • Çevrimiçi verileri ( CSV , TSV, JSON, vb.) Almak için mükemmel destek
  • Veri uyuşmazlığı yapan akıllılar
  • Veriye dayalı DOM manipülasyonu (belki de kafa karıştırması en zor şey): verileriniz DOM öğelerine dönüştürülür.

2
sadece yeni başlayanlara yardımcı olmak için - yukarıdaki talimatlar artık d3 v4 için geçerli değildir. eşleme aşamasının artık veri geri araması
swyx

@swyx, uyarı için teşekkürler, örneği düzeltip yanıt olarak gönderebilir misin?
Ahmed Fasih

@AhmedFasih Herkesin yararına kendi gönderinizi düzeltmelisiniz. Ayrıca swyx, yayınınızı düzenlemek için yeterli itibara sahip değil.
Carles Alcolea

@CarlesAlcolea En üste büyük bir sorumluluk reddi beyanı ekledim, üzgünüm şu anda mevcut API'yi hızlandıracak vaktim yok 😿
Ahmed Fasih

@AhmedFasih, bu eskisinden daha iyi :) Teşekkürler!
Carles Alcolea

5

Aşağıda Python uyuşmuş ve pandalar var

''

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)

''

Aynısı JavaScript * [ numjs yalnızca Node.js ile çalışır ] Ancak D3.js çok gelişmiş Veri dosyası seti seçeneklerine sahiptir. Hem numjs hem de Pandas-js hala çalışıyor ..

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

*/


5

Pandas.js şu anda deneysel bir kitaplıktır, ancak immutable.js ve NumpPy mantığının altında kullandığı çok umut verici görünüyor, hem veri nesneleri serisi hem de DataFrame orada ..


3
Görünüşe göre kütüphanenin iki yıldan fazla bir süredir bir taahhüdü yok ve birçok sorunu var gibi görünüyor. 'Çok umut verici' demezdim.
jarthur

4

@neversaint beklemeniz bitti. javascript kitaplığı gibi pandalar olan ve tensorflow.js üzerine inşa edilmiş ve tensörleri kutudan çıkaran Danfo.js'ye hoş geldiniz deyin . Bu, danfo veri yapısını Tensörlere dönüştürebileceğiniz anlamına gelir. Ayrıca groupby, birleştirme, birleştirme, çizim ve diğer veri işlemlerini yapabilirsiniz.


3

Bence en yakın şey aşağıdaki gibi kütüphaneler:

Özellikle Recline, Pandas veri çerçevelerine biraz benzer bir yapıya sahip bir Veri Kümesi nesnesine sahiptir. Daha sonra verilerinizi veri ızgarası, grafikler, haritalar vb. Gibi "Görünümler" ile bağlamanıza olanak tanır. Görünümler genellikle D3, Flot, SlickGrid vb. Gibi mevcut en iyi tür görselleştirme kitaplıklarının etrafındaki ince sarmalayıcılardır.

İşte Recline için bir örnek:

// Biraz veri yükle
var dataset = recline.Model.Dataset ({
  kayıtlar: [
    {değer: 1, tarih: '2012-08-07'},
    {değer: 5, b: '2013-09-07'}
  ]
  // Bunun yerine CSV verilerini yükle
  // (Ve Recline, daha birçok veri kaynağı türünü destekler)
  // url: 'yerel-csv-dosyam.csv',
  // arka uç: 'csv'
});

// görüntüleyen için HTML'nizden bir öğe alın
var $ el = $ ('# veri görüntüleyici');

var allInOneDataViewer = new recline.View.MultiView ({
  model: veri kümesi,
  el: $ el
});
// Yeni Veri Görüntüleyiciniz yayında olacak!

1

CSV'yi javascript'te ayrıştırmak oldukça kolaydır, çünkü her satır zaten bir javascript dizisidir. Eğer csv'nizi bir dizi diziye (satır başına bir tane) yüklerseniz, değerlerle bir dizi dizisi yüklemek oldukça kolaydır:

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

Ardından getData(), sütuna göre çok boyutlu bir değerler dizisi döndürür.

Bunu sizin için bir jsFiddle'da gösterdim .

Elbette, girdiye güvenmiyorsanız, bu kadar kolay yapamazsınız - verilerinizde değerlendirilebilecek komut dosyası olabilir, vb.


Cevabınıza bir uyarı koyduğunuzu biliyorum, ancak bu yöntemin güvenlik açısından ne kadar kötü olduğunu gerçekten yeterince vurgulayamıyorum.
xApple

Girdiye güvenmemesi güvenlik açısından sadece kötüdür. Örneğin, girdi dosyalarını zaten bildiği bir okul projesi yapıyorsa (öğretmeni bunları önceden belirli bir formatta sağladığı için), bu kompakt, kolay ve okunaklı bir çözümdür. Girdilerinin kaynağıyla ilgili herhangi bir bağlam vermedi, sadece kolay işleme için CSV'yi okumanın bir yolunu sordu.
Steve K

1

Burada 1. satırda var olan bir başlığı varsayan dinamik bir yaklaşım var. Csv ile yüklenir 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);         

});

Ardından, bir R, python veya Matlab veri çerçevesine benzer verilerin her sütununa erişebilirsiniz df.column_header[row_number].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.