JavaScript에서 동등한 Python Pandas


90

이 CSV 예 :

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

내가 Pandas를 사용하는 표준 방법은 다음과 같습니다.

  1. CSV 구문 분석

  2. 데이터 프레임으로 열 선택 ( col1col3)

  3. 열 처리 (예 : col1및 값 평균 col3)

Pandas와 같은 JavaScript 라이브러리가 있습니까?


5
당신이 무엇을할지 알려주십시오. 이것은 우리 중 많은 사람들에게 중요한 질문입니다.
Ahmed Fasih 2015 년

답변:


125

모든 답변이 좋습니다. 내 대답이 포괄적 이길 바랍니다 (즉, 모든 옵션 을 나열하려고합니다 ). 선택에 도움이되는 기준으로이 답변을 반환하고 수정하기를 바랍니다.

여기 오는 사람이 d3. d3자바 스크립트에서 데이터를 처리하는 데 매우 유용한 "스위스 군용 칼" pandas은 Python에 유용합니다. 당신이 볼 수는 d3자주 같이 사용하는 pandas경우에도 d3입니다 DataFrame / 팬더 교체 정확하지 (즉, d3같은 API가없는이, d3없는 Series/ DataFrame처럼하는 행동하라 pandas)

아메드의 대답은 D3 사용 방법을 설명 일부 DataFrame 기능을 달성하기 위해, 아래의 라이브러리 중 일부는 같은 것들에서 영감을했다 LearnJsData 사용 d3하고 lodash.

DataFrame-focused-features에 관해서는 도움이되는 JS 라이브러리에 압도되었습니다. 다음은 여러분이 접했을 수있는 몇 가지 옵션에 대한 간단한 목록입니다. 아직 자세히 확인하지 않았습니다 (대부분 Google + NPM 검색 조합에서 찾았습니다).

작업 할 수있는 다양성을 사용하도록주의하십시오. 일부는 Node.js 일명 서버 측 자바 스크립트이고 일부는 브라우저 호환 일명 클라이언트 측 자바 스크립트입니다. 일부는 Typescript입니다.

  • pandas-js
    • 에서 철강페라 '답변
    • "pandas.js는 Python pandas 라이브러리를 모방 한 오픈 소스 (실험용) 라이브러리입니다. NumPy 논리적 동등 물로 Immutable.js에 의존합니다. pandas.js의 주요 데이터 객체는 Python pandas, Series 및 DataFrame과 같습니다. . "
  • dataframe-js
    • "DataFrame-js는 자바 스크립트 및 데이터 과학을위한 불변 데이터 구조 인 DataFrame을 제공하여 SQL 및 함수형 프로그래밍에서 영감을받은 API로 행과 열에서 작업 할 수 있습니다."
  • 데이터 포지
  • jsdataframe
    • "Jsdataframe은 R 및 Python Pandas의 데이터 프레임 기능에서 영감을받은 JavaScript 데이터 랭 글링 라이브러리입니다."
  • 데이터 프레임
    • "그룹화 및 축소하여 데이터 탐색"

그런 다음이 질문에 와서 여기에서 다른 답변을 확인하고 더 많은 검색을 수행 한 후 다음과 같은 옵션을 찾았습니다.

  • JS의 Apache Arrow
    • 사용자 Back2Basics 제안에 감사드립니다 :
    • "Apache Arrow는 플랫 및 중첩 데이터의 벡터 및 테이블 형 컨테이너를 인코딩하기위한 컬럼 형 메모리 레이아웃 사양입니다. Apache Arrow는 대규모 인 메모리 컬럼 형 데이터 (Spark, Pandas , Drill, Graphistry 등) 의 새로운 표준입니다 ."
  • 주목할 만한
    • 얼핏 보면 JSIPython / Jupyter "노트북" 의 대안 처럼 보입니다.
    • Observable의 페이지는 "웹 플랫폼"에서 "반응 형 프로그래밍", "커뮤니티"를 약속합니다.
    • 여기에서 5 분 소개보기
  • 기대다 ( Rufus의 대답에서 )
    • Pandas 자체가 시도하는 DataFrame의 API에 대한 강조를 기대했습니다. R에서 보존 모든 R 기능에 대한 교체 / 개선 / 대응을 문서화합니다 .
    • 대신 나는 Recline의 예가 강조하는 강조를 찾습니다. DOM으로 데이터를 가져 오는 jQuery 방식jQuery가 필요하지 않지만 브라우저가 필요한 (멋진) Multiview (UI)! 더 많은 예
    • ... 또는 MVC-ish 아키텍처 에 대한 강조 ; 백엔드 항목 포함 (예 : 데이터베이스 연결)
    • 나는 아마도 너무 가혹할 것입니다. 결국 Pandas의 좋은 점 중 하나는 시각화를 쉽게 만들 수 있다는 것입니다. 상자 밖으로.
  • Node.js 데이터
    • 정말 더 많은 ORM ! 대부분 의 모듈은 다른 데이터에 대응하는 스토리지 (질문 js-data-mongodb, js-data-redis, js-data-cloud-datastore), 분류, 필터링 등
    • 플러스 측에서는 Node.js에서 최우선 순위로 작동합니다. "Node.js 및 브라우저에서 작동합니다."
  • 된장 ( Rufus의 또 다른 제안 )
  • AlaSQL
    • "AlaSQL"은 관계형 데이터와 스키마없는 데이터 모두에 대한 쿼리 속도와 데이터 소스 유연성에 중점을 둔 Javascript 용 오픈 소스 SQL 데이터베이스입니다. 브라우저, Node.js 및 Cordova에서 작동합니다. "
  • 몇 가지 생각 실험 :

이 게시물이 커뮤니티 위키가되어 다음과 같은 다른 기준에 대해 평가 (즉, 위의 다른 옵션을 비교) 할 수 있기를 바랍니다.

  • R 비교 에서 Panda의 기준
    • 공연
    • 기능성 / 유연성
    • 사용의 용이성
  • 내 제안
    • Pandas / Dataframe API와의 유사성
    • 특히 주요 기능 에 대한 히트
    • 데이터 과학 강조> UI 강조
    • Jupyter (대화 형 노트북) 등과 같은 다른 도구와 결합하여 입증 된 통합

JS 라이브러리가 결코 할 수없는 일들 (하지만 할 수 있습니까?)


1
이 멋진 개요에 감사드립니다. pandas 데이터 프레임과 SQL의 사용을 모두 알고 있습니다. JS SQL 데이터베이스와 비교하여 데이터 프레임을 사용하는 JS 사용의 장점 (및 단점)은 무엇입니까?
tardis

@molotow 이것은 좋은 질문이지만 JS SQL 데이터베이스에 대한 경험이 많지 않습니다 (멋져 보이지만). 일반적으로 데이터 프레임 유형의 접근 방식은 빈 값을 추론하는 것과 같은 "데이터 랭 글링"/ "데이터 과학"중심 기능을 더 많이 지원할 것이라고 생각 합니다. 행렬 곱셈 등을 수행합니다. 반면 (JS) SQL은 쿼리, 정렬, 필터링과 같은 관계형 항목에 더 중점을 둡니다. 물론 겹치는 부분이있을 것입니다. SQL에 통계 함수 등이 포함 된 것처럼 데이터 프레임은 JOIN, 정렬 및 필터링 할 수 있습니다. 다른 사람이 아이디어가 있습니까?
The Red Pea 2017

1
너무 많은 옵션이 있다는 사실은 성가시다. 오히려 커뮤니티가 한 가지에만 집중하고 그것을 좋게 만드십시오.
Claudiu Creanga 2018

3
(Arrow JS 작성자 여기) @ClaudiuCreanga 좌절감을 이해합니다. 처음에 우리는 노드 / 브라우저와보다 전통적인 빅 데이터 스택 간의 구분을 해소하기 위해 ArrowJS를 작성했으며 지금까지 우수한 IPC / 스트리밍 프리미티브에 가장 많이 투자했습니다. 다음 단계로 더 많은 JS 라이브러리 (tensorflow, d3 등)와의 통합을 시작하고 싶습니다. PR은 항상 환영합니다. 대안적인 접근 방식은 ArrowJS를 사용하여 Arrow 테이블을 소비하고 생성하는 JPMC의 Perspective 프로젝트 와 같은 것 입니다.
ptaylor

1
javascript에서 pandas에 해당하는 데이터 프레임 병합 기능이 있습니까?
Phani vikranth

9

저는 data-forge라는 JavaScript 용 데이터 랭 글링 라이브러리를 작업하고 있습니다. 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에서 더 많은 문서를 찾을 수 있습니다 .


6

Ceaveat 다음은 최신 d4v4가 아닌 d3 v3에만 적용됩니다!

나는 d3.js에 부분적 이며 Pandas를 완전히 대체하지는 않지만 패러다임을 배우는 데 시간을 할애하면 모든 데이터 랭 글링 을 처리 할 수 ​​있습니다. (브라우저에 결과를 표시하고 싶은 경우에는 이에 적합합니다.)

예. 내 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 등) 수집을위한 탁월한 지원
  • 데이터 랭 글링 스마트 베이크 인
  • 데이터 기반 DOM 조작 (머리를 감싸는 것이 가장 어려울 수 있음) : 데이터가 DOM 요소로 변환됩니다.

2
미래의 초보자를 돕기 위해-위의 지침은 더 이상 d3 v4에 유효하지 않습니다. 데이터가 콜백 내에서 매핑 단계가 완료 생각 지금 예를 들면 github.com/d3/d3-dsv/blob/master/README.md#csvParseRows
swyx

@swyx 감사합니다. 예제를 수정하고 답변으로 게시 할 수 있습니까?
Ahmed Fasih

@AhmedFasih 모든 사람의 이익을 위해 자신의 게시물을 수정해야합니다. 또한 swyx는 게시물을 편집하기에 충분한 평판이 없습니다.
Carles Alcolea

@CarlesAlcolea 상단에 큰 면책 조항을 추가했습니다. 죄송합니다. 지금 현재 API에 대해 알아볼 시간이 없습니다 😿
Ahmed Fasih

@AhmedFasih 잘 이전보다 낫습니다 :) 감사합니다!
Carles Alcolea 2017 년

5

현재 Pandas.js 는 실험용 라이브러리이지만 immutable.js 및 NumpPy 로직에서 사용하는 것이 매우 유망 해 보입니다. 데이터 개체 시리즈와 DataFrame이 모두 있습니다.


3
도서관은 2 년 넘게 커밋을하지 않았고 많은 문제가있는 것 같습니다. 나는 '매우 유망하다'고 말하지 않을 것이다.
jarthur 2019

4

아래는 Python numpy와 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)

```

JavaScript *에서도 동일한 결과를 얻을 수 있습니다. [ numjs는 Node.js에서만 작동합니다 ] 그러나 D3.js에는 훨씬 고급 데이터 파일 세트 옵션이 있습니다. numjs와 Pandas-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

*/


3

가장 가까운 것은 다음과 같은 라이브러리라고 생각합니다.

특히 Recline에는 Pandas 데이터 프레임과 다소 유사한 구조를 가진 Dataset 개체가 있습니다. 그런 다음 데이터 그리드, 그래프,지도 등과 같은 "보기"와 데이터를 연결할 수 있습니다.보기는 일반적으로 D3, Flot, SlickGrid 등과 같은 기존 최고의 시각화 라이브러리를 둘러싼 얇은 래퍼입니다.

다음은 Recline의 예입니다.

// 일부 데이터로드
var dataset = recline.Model.Dataset ({
  기록 : [
    {값 : 1, 날짜 : '2012-08-07'},
    {값 : 5, b : '2013-09-07'}
  ]
  // 대신 CSV 데이터로드
  // (그리고 Recline은 더 많은 데이터 소스 유형을 지원합니다)
  // URL : 'my-local-csv-file.csv',
  // 백엔드 : 'csv'
});

// 뷰어를 위해 HTML에서 요소를 가져옵니다.
var $ el = $ ( '# data-viewer');

var allInOneDataViewer = new recline.View.MultiView ({
  모델 : 데이터 세트,
  el : $ el
});
// 새 데이터 뷰어가 활성화됩니다!

3

@neversaint 당신의 기다림이 끝났습니다. Tensorflow.js에 구축 된 Javascript 라이브러리와 같은 팬더 인 Danfo.js에 오신 것을 환영하며 즉시 사용 가능한 텐서를 지원합니다. 즉, danfo 데이터 구조를 Tensor로 변환 할 수 있습니다. 그리고 groupby, 병합, 결합, 플로팅 및 기타 데이터 처리를 수행 할 수 있습니다.


1

각 줄은 이미 본질적으로 자바 스크립트 배열이기 때문에 자바 스크립트에서 CSV를 구문 분석하는 것은 매우 쉽습니다. 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 에서 시연했습니다 .

물론 입력을 신뢰하지 않으면 쉽게 할 수 없습니다. 데이터에 eval이 선택할 수있는 스크립트가있는 경우 등입니다.


나는 당신이 당신의 대답에 경고를 넣었다는 것을 알고 있지만 보안 관점 에서이 방법이 얼마나 나쁜지 충분히 강조 할 수는 없습니다.
xApple

그가 입력을 신뢰하지 않는 경우 보안 관점에서 볼 때만 나쁩니다. 예를 들어 입력 파일을 이미 알고있는 학교 프로젝트를 수행하는 경우 (그 또는 그의 교사가 특정 형식으로 미리 제공했기 때문에) 이것은 간단하고 쉽고 읽기 쉬운 솔루션입니다. 그는 자신의 입력 소스에 대한 컨텍스트를 제공하지 않았으며 쉽게 처리 할 수 ​​있도록 CSV를 읽을 수있는 방법을 요청했습니다.
Steve K

1

다음은 1 행에 기존 헤더를 가정하는 동적 접근 방식입니다 d3.js. csv는 .

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, python 또는 Matlab 데이터 프레임과 유사한 데이터의 각 열에 df.column_header[row_number].

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.