MTurk Worst Case Scenario Calculator

Shows what your approval rate would be in worst case scenario

  1. // ==UserScript==
  2. // @name MTurk Worst Case Scenario Calculator
  3. // @namespace localhost
  4. // @author ThirdClassInternationalMasterTurker
  5. // @description Shows what your approval rate would be in worst case scenario
  6. // @include https://www.mturk.com/mturk/dashboard
  7. // @version 3.1
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. //
  12. // 2012-09-07 First public release by ThirdClassInternationalMasterTurker
  13. //
  14. // 2012-09-09 Added approximate number of rejects that drop you to the
  15. // edge of RATE_GOOD and RATE_OK
  16. //
  17. // 2012-10-06 Added GUI for setting RATE_GOOD and RATE_OK
  18. // (Click 'Pending (Worst Case Scenario)')
  19. //
  20. // 2012-12-02 3.1: Added @downloadURL and @updateURL
  21. //
  22.  
  23. // --- SETTINGS ------------------------------------------------------- //
  24. var RATE_GOOD = (localStorage['WCS_GOOD']) ? localStorage['WCS_GOOD'] : 99.0;
  25. var RATE_OK = (localStorage['WCS_OK']) ? localStorage['WCS_OK'] : 95.0;
  26.  
  27. var COLOUR_GOOD = 'lightgreen';
  28. var COLOUR_OK = 'orange';
  29. var COLOUR_BAD = 'red';
  30.  
  31. // -------------------------------------------------------------------- //
  32.  
  33. var rows = document.evaluate('//tr[@class]',
  34. document,
  35. null,
  36. XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  37.  
  38. var submitted;
  39. var returned;
  40. var abandoned;
  41. var approved;
  42. var rejected;
  43. var pending;
  44.  
  45. function config_func()
  46. {
  47. return function()
  48. {
  49. var t = prompt('MTurk Worst Case Scenario\nSet your RATE_GOOD and RATE_OK.\nFor example: 99.0;95.0',
  50. '' + RATE_GOOD + ';' + RATE_OK);
  51. if (!t)
  52. return;
  53.  
  54. var rates = t.split(';', 2);
  55. rates[0] = parseFloat(rates[0]).toFixed(1);
  56. rates[1] = parseFloat(rates[1]).toFixed(1);
  57. if (rates[0] > 0 && rates[0] <= 100)
  58. localStorage['WCS_GOOD'] = rates[0];
  59. if (rates[1] > 0 && rates[1] <= 100)
  60. localStorage['WCS_OK'] = rates[1];
  61. };
  62. }
  63.  
  64.  
  65. for (var i=0;i<rows.snapshotLength;i++) {
  66. var row = rows.snapshotItem(i);
  67.  
  68. if (row.cells.length != 3)
  69. continue;
  70. if (row.className.match('odd|even') == null) {
  71. continue;
  72. }
  73.  
  74. if (row.cells[0].textContent.match('HITs Submitted')) {
  75. submitted = parseInt(row.cells[1].textContent);
  76. }
  77.  
  78. if (row.cells[0].textContent.match('\\.\\.\\. Approved')) {
  79. approved = parseInt(row.cells[1].textContent);
  80. approved_p = parseFloat(row.cells[2].textContent);
  81.  
  82. if (approved_p >= RATE_GOOD) {
  83. row.cells[2].style.backgroundColor = COLOUR_GOOD;
  84. }
  85. else if (approved_p >= RATE_OK) {
  86. row.cells[2].style.backgroundColor = COLOUR_OK;
  87. }
  88. else {
  89. row.cells[2].style.backgroundColor = COLOUR_BAD;
  90. }
  91. }
  92.  
  93. if (row.cells[0].textContent.match('\\.\\.\\. Rejected')) {
  94. rejected = parseInt(row.cells[1].textContent);
  95. }
  96.  
  97. if (row.cells[0].textContent.match('\\.\\.\\. Pending')) {
  98. pending = parseInt(row.cells[1].textContent);
  99.  
  100. row.cells[0].innerHTML += " <small>(Worst Case Scenario)</small>";
  101.  
  102. if (RATE_GOOD < approved_p) {
  103. var p = 1.0 - RATE_GOOD/100;
  104. var x = (rejected-(p*submitted))/(p-1);
  105. row.cells[0].innerHTML += "<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:" + COLOUR_OK + "\">(~" + Math.round(x) + " rejects => " + RATE_GOOD + "%)</span>";
  106. }
  107. if (RATE_OK < approved_p) {
  108. var p = 1.0 - RATE_OK/100;
  109. var x = (rejected-(p*submitted))/(p-1);
  110. row.cells[0].innerHTML += "<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:" + COLOUR_BAD + "\">(~" + Math.round(x) + " rejects => " + RATE_OK + "%)</span>";
  111. }
  112.  
  113. WCS = Math.round((approved/(approved+rejected+pending) * 1000))/10;
  114. row.cells[2].innerHTML = '(' + WCS + '%)';
  115.  
  116. if (WCS >= RATE_GOOD) {
  117. row.cells[2].style.backgroundColor = COLOUR_GOOD;
  118. }
  119. else if (WCS >= RATE_OK) {
  120. row.cells[2].style.backgroundColor = COLOUR_OK;
  121. }
  122. else {
  123. row.cells[2].style.backgroundColor = COLOUR_BAD;
  124. }
  125.  
  126. row.cells[0].addEventListener("click", config_func(), false);
  127. row.cells[2].addEventListener("click", config_func(), false);
  128. }
  129. }
  130.  

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址