Pss, эй, иди сюда, я скажу тебе, где ты можешь найти черных белок в Нью-Йорке.

Черные белки встречаются редко, знаете ли вы, что 1 из каждых 10 000 белок черный?

Для этого мы будем использовать NodeJs и JavaScript, а также набор данных о наблюдениях за белками в Центральном парке.
Ссылка на набор данных 🏹Данные

Теперь, когда у нас есть набор данных, мы готовы начать

Давайте начнем с создания проекта узла.
1. Создайте папку
2. Откройте папку
3. Запустите npm init, чтобы запустить проект узла в папке.

Теперь нам нужно выбрать модуль CSV для использования.

Заходим на npmjs.com и ищем CSV, там можно найти много разных модулей.
Я решил использовать csv-parse, для установки csv-parse запускаю следующий код.

npm i csv-parse

Теперь нам нужно импортировать модуль CSV

Мы можем импортировать наш модуль CSV со следующим кодом

const parse = require('csv-parse');

Помимо синтаксического анализа, мы будем использовать «fs», файловую систему

Мы будем использовать fs, чтобы позже открыть наш CSV как поток данных.

const fs = require('fs');

Создание наших переменных

const esquilos = []; //Array for our squirrels
var maiorOcorrencia = [undefined, 0], contador = 0, qtdEsquilos = 0;
// maiorOcorrencia local with most occurrence of squirrels
// Contador just a counter
// qtdEsquilos total of squirrels analyzed

Создание функции, помогающей фильтровать

Возвращает true, если переданный мех белки черный

function filtraEsquilos(esquilo) {
  return esquilo['Primary Fur Color'] === 'Black';
}

Чтение CSV как потока

Чтение в виде потока означает, что данные считываются и обрабатываются одновременно.

fs.createReadStream('esquilos.csv')
  .pipe(parse({
    columns: true
  }))
.on('data', (data) => {
    qtdEsquilos+=1;
    if (filtraEsquilos(data))
    esquilos.push(data);
  })
.on('error', (err) => {
    console.log(err)
  })

Применение фильтров

.on('end', () => {
    // Filtering the hectares and put them in alphabetic order,so i can count the occurrencies
    const hectares = (esquilos.map(x => x.Hectare));
    hectares.sort().reduce(function(old, chr){
      old == chr ? ++contador > maiorOcorrencia[1] && (maiorOcorrencia = [chr, contador]) : (contador = 1)
      return chr
    });
    
    // Printing the results
    console.log(`The place where Black Squirrels where most seen ${maiorOcorrencia[0]}: vistos ${maiorOcorrencia[1]} vezes`);
    console.log(`Dos ${qtdEsquilos} 🐿️🐿️  encontrados, ${esquilos.length} 🐿️🐿️  were Black`);
    console.log(`Os 🐿️🐿️  Black squirrels represent ${(esquilos.length*100/qtdEsquilos).toFixed([1])}% of the squirrels population`);
  });

Полный код и результаты

const parse = require('csv-parse');
const fs = require('fs');

const esquilos = [];
var maiorOcorrencia = [undefined, 0], contador = 0, qtdEsquilos = 0;

function filtraEsquilos(esquilo) {
  return esquilo['Primary Fur Color'] === 'Black';
}

fs.createReadStream('esquilos.csv')
  .pipe(parse({
    columns: true
  }))
  .on('data', (data) => {
    qtdEsquilos+=1;
    if (filtraEsquilos(data))
    esquilos.push(data);
  })
  .on('error', (err) => {
    console.log(err)
  })
  .on('end', () => {
    //Aqui eu filtro os hectares dos esquilos pretos
    const hectares = (esquilos.map(x => x.Hectare));
    
    //Aqui eu coloco os hectares em ordem alfabético, assim eu posso contar quantas vezes eles ocorrem em sequência e determinar assim o número de ocorrências de cada
    hectares.sort().reduce(function(old, chr){
      old == chr ? ++contador > maiorOcorrencia[1] && (maiorOcorrencia = [chr, contador]) : (contador = 1)
      return chr
    });
    
    //Imprimindo os resultados
    console.log(`O lugar onde eles mais foram vistos foi no hectare ${maiorOcorrencia[0]}: vistos ${maiorOcorrencia[1]} vezes`);
    console.log(`Dos ${qtdEsquilos} 🐿️🐿️  encontrados, ${esquilos.length} 🐿️🐿️  eram pretos`);
    console.log(`Os 🐿️🐿️  pretos representam ${(esquilos.length*100/qtdEsquilos).toFixed([1])}% da população encontrada`);
  });

Полученные результаты

// O lugar onde eles mais foram vistos foi no hectare 33D: vistos 8 vezes
// Dos 3023 🐿️🐿️ encontrados, 103 🐿️🐿️ eram pretos
// Os 🐿️🐿️ pretos representam 3.4% da população encontrados

Заключение

Мы пришли к выводу, что самый простой способ найти черную белку в Нью-Йорке — это посетить гектар 33D в Центральном парке.
И если вы просто хотите посетить Нью-Йорк, возьмите меня с собой 🤣.