पायथन पंडों जावास्क्रिप्ट में बराबर


96

इस CSV उदाहरण के साथ:

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

पंडों का उपयोग करने वाली मानक विधि यह है:

  1. पार्स सीएसवी

  2. डेटा फ़्रेम में कॉलम चुनें ( col1और col3)

  3. स्तंभ की प्रक्रिया करें (उदाहरण के लिए col1और मानों का पुनर्विभाजन col3)

क्या कोई जावास्क्रिप्ट लाइब्रेरी है जो पंडों की तरह है?


6
हमें पता है कि तुम क्या हवा के साथ जा रहा है। यह हम में से कई लोगों के लिए एक महत्वपूर्ण प्रश्न है।
अहमद फसीह '

जवाबों:


133

सभी उत्तर अच्छे हैं। मेरे उत्तर की आशा करना व्यापक है (अर्थात सभी विकल्पों को सूचीबद्ध करने की कोशिश करता है )। मुझे उम्मीद है कि किसी विकल्प को चुनने में मदद करने के लिए किसी भी मानदंड के साथ इस उत्तर को वापस और संशोधित करेंगे।

मुझे उम्मीद है कि यहां आने वाला कोई भी व्यक्ति परिचित होगा d3d3जावास्क्रिप्ट में डेटा को संभालने के लिए बहुत उपयोगी "स्विस सेना चाकू" है, जैसे pandasकि पायथन के लिए उपयोगी है। आप देख सकते हैं d3अक्सर की तरह इस्तेमाल किया pandasहै, भले ही d3है वास्तव में एक DataFrame / पांडा प्रतिस्थापन नहीं (यानी d3एक ही एपीआई नहीं है, d3नहीं है Series/ DataFrameजो व्यवहार में की तरह pandas)

अहमद का उत्तर बताता है कि कुछ डेटाफ़्रेम कार्यक्षमता को प्राप्त करने के लिए d3 का उपयोग कैसे किया जा सकता है , और नीचे दिए गए कुछ पुस्तकालय LearnJsData जैसी चीजों से प्रेरित थे जो उपयोग करता है d3और lodash

डेटाफ़्रेम-फ़ोकस-फ़ीचर के रूप में, मैं जेएस पुस्तकालयों से अभिभूत था जो मदद करते हैं। यहां आपके द्वारा चुने गए कुछ विकल्पों की एक त्वरित सूची दी गई है। मैंने अभी तक उनमें से किसी की भी जाँच नहीं की है (अधिकांश मुझे Google + NPM खोज के संयोजन में मिला)।

सावधान रहो तुम एक किस्म है कि आप के साथ काम कर सकते हैं का उपयोग करें; कुछ Node.js उर्फ ​​सर्वर-साइड जावास्क्रिप्ट हैं, कुछ ब्राउज़र-संगत उर्फ ​​क्लाइंट-साइड जावास्क्रिप्ट हैं। कुछ टाइपस्क्रिप्ट हैं।

  • पांडा-js
    • से इस्पात और Feras के उत्तर
    • "pandas.js एक खुला स्रोत (प्रायोगिक) पुस्तकालय है, जो पायथन पंडों के पुस्तकालय की नकल करता है। यह NumPy तार्किक समतुल्य के रूप में Immutable.js पर निर्भर करता है। pandas.js में मुख्य डेटा ऑब्जेक्ट्स, जैसे Python पांडा, श्रृंखला और DataFrame में हैं। । "
  • dataframe-js
    • "DataFrame-js जावास्क्रिप्ट और डेटासाइंस के लिए एक अपरिवर्तनीय डेटा संरचना प्रदान करता है, DataFrame, जो एक sql और कार्यात्मक प्रोग्रामिंग प्रेरित एपीआई के साथ पंक्तियों और स्तंभों पर काम करने की अनुमति देता है।"
  • डेटा-फोर्ज
  • jsdataframe
    • "Jsdataframe आर और पायथन पंडों में डेटा फ्रेम कार्यक्षमता से प्रेरित एक जावास्क्रिप्ट डेटा वर्चस्व पुस्तकालय है।"
  • डेटा ढांचा
    • "समूहीकरण और कम करके डेटा का अन्वेषण करें।"

फिर इस सवाल पर आने के बाद, अन्य उत्तरों की जाँच यहाँ और अधिक खोज करने के बाद, मुझे इस तरह के विकल्प मिले:

  • जेएस में अपाचे एरो
    • उपयोगकर्ता Back2Basics सुझाव के लिए धन्यवाद:
    • "अपाचे तीर फ्लैट और एकत्रित डेटा के कंटेनर की तरह तालिका वैक्टर और एन्कोडिंग के लिए एक स्तंभ स्मृति लेआउट विनिर्देश है। अपाचे तीर के लिए बड़े में स्मृति स्तंभ डेटा (स्पार्क, उभरते मानक है पांडा , ड्रिल, Graphistry, ...)"
  • नमूदार
    • पहली नज़र में, JSIPython / Jupyter "नोटबुक" के विकल्प की तरह लगता है
    • अवलोकन योग्य पृष्ठ का वादा: "प्रतिक्रियाशील प्रोग्रामिंग", "समुदाय", "वेब प्लेटफ़ॉर्म" पर
    • 5 मिनट परिचय देखें यहां
  • फिर से लिखना ( रुफस के जवाब से )
    • मुझे DataFrame के एपीआई पर जोर देने की उम्मीद थी, जिसे पंडों ने खुद करने की कोशिश की आर से संरक्षित करें प्रत्येक आर समारोह में इसके प्रतिस्थापन / सुधार / पत्राचार का दस्तावेज
    • इसके बजाय मुझे एक जोर मिलता है उदाहरण के उदाहरण पर जोर दिया जाता है डोम में डेटा प्राप्त करने का jQuery तरीकाइसके (भयानक) मल्टीव्यू (यूआई), जिसे jQuery की आवश्यकता नहीं है, लेकिन एक ब्राउज़र की आवश्यकता है! और ज्यादा उदाहरण
    • ... या इसके एमवीसी-ईश वास्तुकला पर जोर ; बैक-एंड सामान (यानी डेटाबेस कनेक्शन) सहित
    • मैं शायद बहुत कठोर हो रहा हूं; आखिरकार, पांडा के बारे में एक अच्छी बात यह है कि यह आसानी से विज़ुअलाइज़ेशन कैसे बना सकता है; अलग सोच।
  • js-डेटा
    • वास्तव में एक ORM की अधिक ! में से अधिकांश अपने मॉड्यूल अलग डेटा के अनुरूप भंडारण सवाल ( js-data-mongodb, js-data-redis, js-data-cloud-datastore), क्रमित, फ़िल्टर आदि
    • प्लस-साइड पर पहली प्राथमिकता के रूप में Node.js पर काम करता है; "Node.js और ब्राउज़र में काम करता है।"
  • मिसो ( रुफस का एक और सुझाव )
  • AlaSQL
    • "AlaSQL" जावास्क्रिप्ट के लिए एक खुला स्रोत SQL डेटाबेस है जिसमें रिलेशनल डेटा और स्कीमालेस डेटा दोनों के लिए क्वेरी गति और डेटा स्रोत लचीलेपन पर एक मजबूत ध्यान केंद्रित किया गया है। यह आपके ब्राउज़र, Node.js और Cordova में काम करता है। "
  • कुछ सोचा प्रयोग:

मुझे उम्मीद है कि यह पोस्ट एक समुदाय विकी बन सकती है, और मूल्यांकन कर सकती है (अर्थात ऊपर दिए गए विभिन्न विकल्पों की तुलना करें) जैसे विभिन्न मानदंडों के खिलाफ:

  • इसकी आर तुलना में पांडा की कसौटी
    • प्रदर्शन
    • कार्यक्षमता / लचीलापन
    • उपयोग में आसानी
  • मेरे अपने सुझाव
    • पंडों / डेटाफ़्रेम एपीआई की समानता
    • विशेष रूप से उनकी मुख्य विशेषताओं पर हिट करता है
    • डेटा-विज्ञान जोर> UI जोर
    • अन्य उपकरणों जैसे Jupyter (संवादात्मक नोटबुक), आदि के साथ संयोजन में प्रदर्शित एकीकरण

जेएस लाइब्रेरी में कुछ चीजें कभी नहीं हो सकती हैं (लेकिन ऐसा हो सकता है?)

  • एक अंतर्निहित फ्रेमवर्क का उपयोग करें जो सबसे अच्छी श्रेणी में जावास्क्रिप्ट संख्या / गणित पुस्तकालय है? (यानी एक के समतुल्य NumPy )
  • किसी भी अनुकूलन / संकलक का उपयोग करें जिसके परिणामस्वरूप तेज कोड हो सकता है (अर्थात साइथन के पंडों के समकक्ष )
  • किसी भी डेटा-विज्ञान-स्वाद वाले कंसोर्टियम, अला पंडस और न्यूमॉफोक द्वारा प्रायोजित

1
इस अद्भुत अवलोकन के लिए धन्यवाद। मुझे पता है कि पांडा डेटाफ्रेम और एसक्यूएल दोनों का उपयोग किया जाता है। JS का उपयोग करने के क्या फायदे (और नुकसान) हैं?
टार्डिस

@molotow यह एक महान प्रश्न है, लेकिन मुझे JS SQL डेटाबेस के साथ बहुत अनुभव नहीं है (हालाँकि वे बहुत अच्छे लगते हैं)। सामान्य तौर पर मुझे लगता है कि डेटाफ़्रेम-प्रकार के दृष्टिकोण अधिक "डेटा तकरार" / "डेटा-विज्ञान" केंद्रित कार्यों का समर्थन करेंगे, जैसे रिक्त मानों का संदर्भ देना; मैट्रिक्स गुणा, आदि करते हुए, जबकि (JS) SQL रिलेशनल सामान पर अधिक केंद्रित है: क्वेरी करना, सॉर्ट करना, फ़िल्टर करना। बेशक ओवरलैप होगा; डेटाफ्रेम जॉइन कर सकता है, सॉर्ट कर सकता है और फ़िल्टर कर सकता है, जैसे एसक्यूएल में कुछ सांख्यिकीय कार्य शामिल हैं और आदि किसी और के विचार हैं?
लाल मटर

1
यह तथ्य कि बहुत सारे विकल्प हैं, कष्टप्रद है। बल्कि समुदाय ने केवल एक चीज पर ध्यान केंद्रित किया है और इसे अच्छा बनाया है।
क्लॉडिउ क्रेगना

3
(यहां जेएस लेखक के बारे में बात करें) @ कलैयुड्रेकांग मैं हताशा को समझता हूं। प्रारंभ में हमने नोड / ब्राउज़र और अधिक पारंपरिक बिग-डेटा स्टैक के बीच विभाजन को पाटने के प्रयास में एरोजेएसएस लिखा था, और हमने अब तक के सबसे उत्कृष्ट आईपीसी / स्ट्रीमिंग प्राइमिटिव में सबसे अधिक निवेश किया है। अगले चरणों के रूप में, हम अधिक जेएस लिबास (टेंसरफ़्लो, डी 3, आदि) के साथ एकीकरण शुरू करना पसंद करेंगे, और पीआरएस का हमेशा स्वागत है। एक वैकल्पिक दृष्टिकोण जेपीएमसी के परिप्रेक्ष्य परियोजना जैसी चीजें हैं , जो एरो टेबल का उपभोग और उत्पादन करने के लिए एरोजेएसएस का उपयोग करती हैं।
ptaylor

1
वहाँ जावास्क्रिप्ट में समकक्षों में डेटाफ्रेम मर्ज के लिए एक कार्यक्षमता है?
फणी विक्रांत

9

मैं जावास्क्रिप्ट को डेटा-फोर्ज कहे जाने वाले पुस्तकालय के लिए एक डेटा पर काम कर रहा हूं। यह LINQ और Pandas से प्रेरित है।

इसे इस तरह स्थापित किया जा सकता है:

npm install --save data-forge

आपका उदाहरण इस तरह काम करेगा:

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

यदि आपका डेटा किसी CSV फ़ाइल में था, तो आप इसे इस तरह लोड कर सकते हैं:

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

आप selectपंक्तियों को बदलने के लिए विधि का उपयोग कर सकते हैं ।

आप किसी कॉलम का उपयोग करके निकाल सकते getSeriesहैं, फिर selectउस कॉलम में मानों को बदलने के लिए विधि का उपयोग कर सकते हैं ।

आप अपना डेटा इस तरह से डेटा-फ़्रेम से वापस प्राप्त करते हैं:

var data = dataFrame.toArray();

एक कॉलम औसत करने के लिए:

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

इससे बहुत कुछ आप कर सकते हैं।

आप npm पर अधिक प्रलेखन पा सकते हैं ।


8

Ceaveat निम्नलिखित केवल d3 v3 पर लागू होता है, और नवीनतम d4v4 पर नहीं!

मैं d3.js का आंशिक हूँ , और जब तक यह पंडों के लिए कुल प्रतिस्थापन नहीं होगा, यदि आप इसके प्रतिमान को सीखने में कुछ समय बिताते हैं, तो यह आपके लिए आपके सभी डेटा का ध्यान रखने में सक्षम होना चाहिए। (और यदि आप ब्राउज़र में परिणाम प्रदर्शित करना चाहते हैं, तो यह आदर्श रूप से उसके अनुकूल है।)

उदाहरण। मेरी CSV फ़ाइल data.csv:

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

उसी निर्देशिका में, index.htmlनिम्नलिखित युक्त एक बनाएँ :

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

और demo.jsनिम्नलिखित के साथ एक फ़ाइल भी :

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

निर्देशिका में, चलाएँ python -m SimpleHTTPServer 8181और खोलें http: // localhost: 8181 अपने ब्राउज़र में उम्र और उनके औसत की एक साधारण सूची देखने के लिए।

यह सरल उदाहरण d3 की कुछ प्रासंगिक विशेषताएं दिखाता है:

  • ऑनलाइन डेटा ( CSV , TSV, JSON, आदि को सम्मिलित करने के लिए उत्कृष्ट समर्थन )
  • डेटा सिकुड़ स्मार्ट में सेंकना
  • डेटा-संचालित डोम हेरफेर (शायद किसी के सिर को लपेटने के लिए सबसे मुश्किल चीज): आपका डेटा डोम तत्वों में बदल जाता है।

2
बस भविष्य के newbies की मदद करने के लिए - उपरोक्त निर्देश अब d3 v4 के लिए मान्य नहीं हैं। लगता है कि मैपिंग चरण डेटा कॉलबैक के भीतर किया जाता है जैसे अब github.com/d3/d3-dsv/blob/master/README.md#csvParseRows
swyx

@ सिर के लिए धन्यवाद, क्या आप उत्तर के रूप में उदाहरण और पोस्ट को सही कर सकते हैं?
अहमद फ़सीह

@AhmedFasih आप सभी के लाभ के लिए आपको अपना स्वयं का पद सुधारना चाहिए। इसके अलावा, swyx में आपकी पोस्ट को संपादित करने के लिए पर्याप्त प्रतिष्ठा नहीं है।
कार्ल्स अल्कोले

@CarlesAlcolea मैंने शीर्ष पर एक बड़ा डिस्क्लेमर जोड़ा, क्षमा करें मेरे पास वर्तमान एपीआई पर गति पाने के लिए अभी समय नहीं है
Ahmed

@AhmedFasih पहले से बेहतर है :) धन्यवाद!
कारल्स अल्कोले

5

नीचे पायथन सुन्न और पांडा है

`` `

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)

`` `

एक ही जावास्क्रिप्ट * में प्राप्त किया जा सकता [ numjs केवल के साथ काम करता Node.js ] लेकिन D3.js ज्यादा उन्नत डाटा फ़ाइल सेट विकल्प है। दोनों नंबरों और पंडों- js अभी भी काम करता है ..

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

फिलहाल पंडास.जेएस एक प्रायोगिक पुस्तकालय है, लेकिन हुड अपरिवर्तनीय के तहत इसका उपयोग करने के लिए बहुत आशाजनक लगता है ।js और NumpPy तर्क, दोनों डेटा ऑब्जेक्ट श्रृंखला और DataFrame हैं।


3
ऐसा लगता है कि पुस्तकालय में दो वर्षों में कोई प्रतिबद्धता नहीं है, और लगता है कि कई मुद्दे हैं। मैं नहीं कहूँगा 'बहुत होनहार'।
जर्थुर

4

@ आपका इंतजार खत्म हो गया है। Danfo.js में आपका स्वागत है, जो कि टेनसफ़्लो.जेएस पर निर्मित जावास्क्रिप्ट लाइब्रेरी की तरह पांडा है और टेंसरों को बॉक्स से बाहर सपोर्ट करता है। इसका मतलब है कि आप danfo डेटा संरचना को Tensors में बदल सकते हैं। और आप ग्रुपबी, मर्जिंग, जॉइनिंग, प्लॉटिंग और अन्य डेटा प्रोसेसिंग कर सकते हैं।


3

मुझे लगता है कि निकटतम चीजें पुस्तकालय हैं:

विशेष रूप से रीलाइन को पंडों के डेटा फ़्रेम के समान संरचना के साथ डेटासेट ऑब्जेक्ट मिला है। यह आपको अपने डेटा को "व्यू" से जोड़ने की अनुमति देता है जैसे कि डेटा ग्रिड, ग्राफिंग, मैप्स आदि। दृश्य आमतौर पर डी 3, प्लॉट, स्लिकग्रिड आदि जैसे नस्ल के मौजूदा सर्वश्रेष्ठ दृश्य पुस्तकालयों के आसपास पतले रैपर होते हैं।

यहाँ Recline के लिए एक उदाहरण है:

// कुछ डेटा लोड करें
var डाटासेट = recline.Model.Dataset ({
  रिकॉर्ड: [
    {मूल्य: 1, दिनांक: '2012-08-07'},
    {मान: 5, बी: '2013-09-07'}
  ]
  // CSV डेटा लोड करें
  // और Recline के पास कई और डेटा स्रोत प्रकारों के लिए समर्थन है)
  // url: 'my-local-csv-file.csv')
  // बैकएंड: 'सीएसवी'
});

// दर्शक के लिए अपने HTML से एक तत्व प्राप्त करें
var $ el = $ ('# डेटा-दर्शक');

var allInOneDataViewer = new recline.View.MultiView ({
  मॉडल: डाटासेट,
  el: $ एल
});
// आपका नया डेटा व्यूअर लाइव होगा!

1

CSV को जावास्क्रिप्ट में पार्स करना बहुत आसान है क्योंकि प्रत्येक लाइन पहले से ही एक जावास्क्रिप्ट सरणी है। यदि आप अपने सीएसवी को स्ट्रिंग्स के एक सरणी (एक पंक्ति में) में लोड करते हैं, तो मूल्यों के साथ सरणियों के एक सरणी को लोड करना बहुत आसान है:

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

फिर getData()कॉलम द्वारा मानों का बहुआयामी सरणी देता है।

मैंने इसे आपके लिए jsFiddle में प्रदर्शित किया है ।

बेशक, यदि आप इनपुट पर भरोसा नहीं करते हैं, तो आप इसे बहुत आसानी से नहीं कर सकते हैं - यदि आपके डेटा में स्क्रिप्ट हो सकती है जो स्पष्ट हो सकती है, आदि।


मुझे पता है कि आपने अपने उत्तर में एक चेतावनी दी है, लेकिन मैं वास्तव में पर्याप्त तनाव नहीं कर सकता कि सुरक्षा के दृष्टिकोण से यह तरीका कितना बुरा है।
xApple

यदि वह इनपुट पर भरोसा नहीं करता है तो यह सुरक्षा के दृष्टिकोण से केवल बुरा है। यदि, उदाहरण के लिए, वह एक स्कूल परियोजना कर रहा है जिसमें वह पहले से ही अपनी इनपुट फाइलों को जानता है (क्योंकि उसने या उसके शिक्षक ने उन्हें एक विशिष्ट प्रारूप में समय से पहले प्रदान किया है), यह एक कॉम्पैक्ट, आसान और, सुपाठ्य समाधान है। उन्होंने अपने इनपुट के स्रोत के बारे में कोई संदर्भ नहीं दिया, बस आसान प्रसंस्करण के लिए सीएसवी को पढ़ने का तरीका पूछा।
स्टीव के

1

यहां लाइन 1 पर एक मौजूदा हेडर मान रहा है एक गतिशील दृष्टिकोण है। सीएसवी के साथ भरी हुई है 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);         

});

फिर आप R, अजगर या Matlab डेटाफ्रेम के समान डेटा के प्रत्येक कॉलम तक पहुंच सकते हैं df.column_header[row_number]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.