/* Imports */ import fs from "fs" import axios from "axios" import Papa from "papaparse" import open from "open" import readline from "readline" /* Definitions */ let elicitEndpoint = "https://elicit.org/api/v1/binary-questions/csv?binaryQuestions.resolved=false&binaryQuestions.search=&binaryQuestions.sortBy=popularity&predictors=community" /* Support functions */ let avg = (array) => array.reduce((a, b) => Number(a) + Number(b)) / array.length; let unique = arr => [...new Set(arr)] let sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)); function processArray(arrayQuestions){ let questions = arrayQuestions.map(question => question.questionTitle) let uniqueQuestions = unique(questions) let questionsObj = ({}) uniqueQuestions.forEach((questionTitle) => { questionsObj[questionTitle] = { title: questionTitle, forecasters: [], forecasts: [] } }) arrayQuestions.forEach(question => { // console.log(question.questionTitle) let questionTitle = question.questionTitle let correspondingQuestion = questionsObj[questionTitle] let forecasters = (correspondingQuestion.forecasters).concat(question.predictionCreator) let forecasts = (correspondingQuestion.forecasts).concat(question.prediction) questionsObj[questionTitle] = { forecasters, forecasts } }) let onlyQuestionsWithMoreThan let results = [] for(let question in questionsObj){ let title = question let forecasters = questionsObj[question].forecasters let numforecasters = (unique(forecasters)).length if(numforecasters >= 10){ let url = `https://elicit.org/binary?binaryQuestions.search=${title.replace(/ /g, "%20")}&binaryQuestions.sortBy=popularity&limit=20&offset=0` let forecasts = questionsObj[question].forecasts //console.log(forecasts) //console.log(avg(forecasts)) let percentage = avg(forecasts) let numforecasts = forecasts.length; let standardObj = ({ "Title": title, "URL": url, "Platform": "Elicit", "Binary question?": true, "Percentage": percentage.toFixed(2) + "%", "# Forecasts": numforecasts, "# Forecasters": numforecasters }) results.push(standardObj) } } let string = JSON.stringify(results,null, 2) fs.writeFileSync('./data/elicit-questions.json', string); console.log("Done") } async function awaitdownloadconfirmation(message,callback){ const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question(message, (answer) => { //console.log("Received"); rl.close(); callback() }); } /* Body */ let filePath = "./data/elicit-binary_export.csv" export async function elicit(){ let csvContent = await axios.get(elicitEndpoint) .then(query => query.data) await Papa.parse(csvContent, { header: true, complete: results => { console.log('Downloaded', results.data.length, 'records.'); //resolve(results.data); //console.log(results.data) processArray(results.data) } }); } //elicit()