W tym przykładzie CSV:
Source,col1,col2,col3
foo,1,2,3
bar,3,4,5
Standardowa metoda, której używam Pandas, to:
Przeanalizuj plik CSV
Wybierz kolumny do ramki danych (
col1
icol3
)- Przetwórz kolumnę (np. Uśrednij wartości
col1
icol3
)
Czy istnieje biblioteka JavaScript, która lubi Pandy?
javascript
python
pandas
neversaint
źródło
źródło
Odpowiedzi:
Wszystkie odpowiedzi są dobre. Mam nadzieję, że moja odpowiedź jest wyczerpująca (tj. Próbuje wymienić wszystkie opcje). Mam nadzieję, że wrócę i zrewiduję tę odpowiedź, uwzględniając wszelkie kryteria, które pomogą dokonać wyboru.
Mam nadzieję, że każdy, kto tu przyjeżdża, jest zaznajomiony
d3
.d3
jest bardzo przydatny „szwajcarski scyzoryk” do obsługi danych w Javascript, podobnie jakpandas
jest pomocny w Pythonie. Możesz zobaczyć , że jestd3
używany częstopandas
, nawet jeśli nied3
jest dokładnie zamiennikiem DataFrame / Pandas (tj.d3
Nie ma tego samego interfejsu API;d3
nie maSeries
/DataFrame
które zachowują się jak wpandas
)Odpowiedź Ahmeda wyjaśnia, w jaki sposób można użyć d3 do osiągnięcia niektórych funkcji DataFrame, a niektóre z poniższych bibliotek zostały zainspirowane takimi rzeczami, jak LearnJsData, które używają
d3
ilodash
.Jeśli chodzi o funkcje skoncentrowane na DataFrame, byłem przytłoczony bibliotekami JS, które pomagają. Oto krótka lista niektórych opcji, które mogłeś napotkać. Nie sprawdziłem jeszcze żadnego z nich szczegółowo (większość znalazłem w połączeniu wyszukiwania Google + NPM).
Uważaj, jeśli używasz różnych odmian, z którymi możesz pracować; niektóre to Node.js, czyli JavaScript po stronie serwera, inne są zgodne z przeglądarkami, czyli JavaScript po stronie klienta. Niektóre są maszynopisowe.
Następnie po przejściu do tego pytania, sprawdzeniu innych odpowiedzi tutaj i przeprowadzeniu dalszych poszukiwań, znalazłem opcje takie jak:
JS
alternatywą dla „notebooków” IPython / Jupyterzachowaj od R.udokumentować swoje zapasowe / poprawę / korespondencję do każdej funkcji R .sposób jQuery na pobieranie danych do DOMjego (niesamowity) Multiview (UI), który nie wymaga jQuery, ale wymaga przeglądarki! Więcej przykładówjs-data-mongodb
,js-data-redis
,js-data-cloud-datastore
), sortowanie, filtrowanie, etc.Mam nadzieję, że ten post stanie się wiki społeczności i oceni (tj. Porównaj różne opcje powyżej) pod kątem różnych kryteriów, takich jak:
Jupyter
(interaktywne notebooki) itpNiektórych rzeczy biblioteka JS może nigdy nie zrobić (ale czy mogłaby?)
źródło
Pracowałem nad biblioteką do edycji danych dla JavaScript o nazwie data-forge. Jest inspirowany LINQ i Pandas.
Można go zainstalować w następujący sposób:
npm install --save data-forge
Twój przykład działałby tak:
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" ]) ;
Jeśli twoje dane były w pliku CSV, możesz je załadować w ten sposób:
var dataFrame = dataForge.readFileSync(fileName) .parseCSV() .parseInts([ "col1", "col2", "col3" ]) ;
Możesz użyć tej
select
metody do przekształcenia wierszy.Możesz wyodrębnić kolumnę za pomocą,
getSeries
a następnie użyćselect
metody do przekształcenia wartości w tej kolumnie.Otrzymujesz dane z powrotem z ramki danych w następujący sposób:
var data = dataFrame.toArray();
Aby uśrednić kolumnę:
var avg = dataFrame.getSeries("col1").average();
Możesz z tym zrobić znacznie więcej.
Więcej dokumentacji na npm .
źródło
Ceaveat Poniższe informacje dotyczą tylko d3 v3, a nie najnowszego d4v4!
Jestem stronniczy w stosunku do d3.js i chociaż nie zastąpi on całkowicie Pandy, jeśli poświęcisz trochę czasu na naukę jego paradygmatu, powinien on być w stanie zająć się wszystkimi twoimi danymi. (A jeśli zechcesz wyświetlać wyniki w przeglądarce, idealnie się do tego nadaje).
Przykład. Mój plik CSV
data.csv
:name,age,color Mickey,65,black Donald,58,white Pluto,64,orange
W tym samym katalogu utwórz plik
index.html
zawierający:<!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>
a także
demo.js
plik zawierający: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); });
W katalogu uruchom
python -m SimpleHTTPServer 8181
i otwórz http: // localhost: 8181 w przeglądarce, aby zobaczyć prostą listę wieków i ich średnią.Ten prosty przykład pokazuje kilka istotnych cech d3:
źródło
Obecnie Pandas.js jest biblioteką eksperymentalną, ale wydaje się bardzo obiecująca, że wykorzystuje logikę immutable.js i NumpPy, zarówno serie obiektów danych, jak i DataFrame.
źródło
Poniżej znajduje się Python numpy i pandy
`` ''
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)
`` ''
To samo można osiągnąć w JavaScript * [ numjs działa tylko z Node.js ] Ale D3.js ma znacznie zaawansowane opcje zestawu plików danych. Zarówno numjs, jak i Pandas-js nadal działają.
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 */
źródło
Myślę, że najbliższe są biblioteki takie jak:
W szczególności Recline ma obiekt Dataset o strukturze nieco podobnej do ramek danych Pandas. Następnie umożliwia połączenie danych z „widokami”, takimi jak siatka danych, wykresy, mapy itp. Widoki są zwykle cienkimi opakowaniami wokół istniejących najlepszych bibliotek wizualizacji, takich jak D3, Flot, SlickGrid itp.
Oto przykład dla Recline:
źródło
@neversaint Twoje oczekiwanie się skończyło. witamy w Danfo.js, który jest pandą, taką jak biblioteka Javascript zbudowana na tensorflow.js i obsługuje tensory po wyjęciu z pudełka. Oznacza to, że możesz przekonwertować strukturę danych danfo na tensory. Możesz też grupować, scalać, łączyć, kreślić i przetwarzać inne dane.
źródło
Bardzo łatwo jest przeanalizować CSV w javascript, ponieważ każda linia jest już zasadniczo tablicą javascript. Jeśli załadujesz swój plik csv do tablicy ciągów (po jednym w wierszu), całkiem łatwo jest załadować tablicę tablic z wartościami:
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); };
Następnie
getData()
zwraca wielowymiarową tablicę wartości według kolumn.Pokazałem to dla ciebie w jsFiddle .
Oczywiście nie możesz tego zrobić tak łatwo, jeśli nie ufasz danym wejściowym - jeśli w twoich danych może znajdować się skrypt, który eval mógłby odebrać itp.
źródło
Oto dynamiczne podejście zakładające istnienie nagłówka w linii 1. Plik csv jest ładowany
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); });
Następnie możesz uzyskać dostęp do każdej kolumny danych, podobnie jak w ramce danych R, Python lub Matlab
df.column_header[row_number]
.źródło