metaforecast/src/elicit-fetch.js

106 lines
3.1 KiB
JavaScript

/* 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()