/* Imports */ import fs from "fs"; import axios from "axios"; import Papa from "papaparse"; import open from "open"; import readline from "readline"; import { calculateStars } from "../utils/stars.js"; import { databaseUpsert } from "../utils/database-wrapper.js"; /* 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)); async 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 probability = avg(forecasts) / 100; let numforecasts = forecasts.length; let standardObj = { title: title, url: url, platform: "Elicit", options: [ { name: "Yes", probability: probability, type: "PROBABILITY", }, { name: "No", probability: 1 - probability, type: "PROBABILITY", }, ], timestamp: new Date().toISOString(), qualityindicators: { numforecasts: Number(numforecasts), numforecasters: Number(numforecasters), stars: calculateStars("Elicit", {}), }, }; results.push(standardObj); } } // let string = JSON.stringify(results, null, 2) // fs.writeFileSync('./data/elicit-questions.json', string); await databaseUpsert(results, "elicit-questions"); 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: async (results) => { console.log("Downloaded", results.data.length, "records."); //resolve(results.data); //console.log(results.data) await processArray(results.data); }, }); await sleep(5000); // needed to wait for Papaparse's callback to be executed. } //elicit()