#!/usr/bin/env php $result_set) { $result_counts[$index] = count($result_set); foreach ($result_set as $day => $count) { $days[$day][] = $count; } } foreach ($days as $day => $counts) { sort($days[$day]); } $pdata = array(); foreach ($days as $day => $counts) { foreach ($percentiles as $key => $percentile) { if (isset($counts[count($counts) - round($times * (100 - $percentile) / 100)])) { $pdata[$percentile][] = $counts[count($counts) - round($times * (100 - $percentile) / 100)]; } } } for ($row = round(max($pdata[max($percentiles)])) + 3; $row >= 0; $row--) { print str_pad($row, 4); for ($col = 0; $col <= count($pdata[max($percentiles)]); $col++) { foreach ($percentiles as $percentile) { if (isset($pdata[$percentile][$col]) && round($pdata[$percentile][$col]) == $row) { if ((int)$percentile <= 5 || $percentile >= 95) { print '.'; } elseif ($percentile <= 25 || $percentile >= 75) { print '+'; } else { print '*'; } continue 2; } } print ' '; } print "\n"; } print "Day "; $backspace = 0; for ($col = 0; $col <= count($pdata[max($percentiles)]); $col++) { if ($backspace) { $backspace--; continue; } $timestamp = $date + 1 + (60 * 60 * 24 * $col); if (date('j', $timestamp) == '1') { print date('M 1', $timestamp); $backspace += 4; } elseif (date('j', $timestamp) == '15') { print '15'; $backspace += 1; } else { print ' '; } } print "\n\n"; $print = 0; $mod = round($times / 1000); for ($i = min($result_counts) - 3; $i < max($result_counts) + 3; $i++) { print str_pad(date('M j Y', $date + 1 + (60 * 60 * 24 * $i)), 12); foreach ($result_counts as $result_count) { if ($result_count == $i) { if ($print % $mod == 0) { print '+'; } $print++; } } print "\n"; } print "\n\n"; sort($result_counts); $avg = array_sum($result_counts) / count($result_counts); $std = 0; foreach ($result_counts as $result_count) { $std += ($avg - $result_count) * ($avg - $result_count); } $std = sqrt($std / count($result_counts)); $min = reset($result_counts); $med = $result_counts[round(count($result_counts) / 2) - 1]; $max = end($result_counts); foreach (array('avg', 'min', 'med', 'max') as $var) { $$var = date('M j Y', $date + 1 + (60 * 60 * 24 * $$var)); } $std = sprintf('%0.02f days', $std); print "Avg: $avg\n"; print "Std: $std\n\n"; print "Min: $min\n"; print "Med: $med\n"; print "Max: $max\n\n"; function simulate($mean, $s, $start) { $days = array(); $current = $start; // Give up on Drupal after 10 years so as to avoid infinite loops. for ($i = 0; $i < 3652.5; $i++) { $current += $mean; $current += vary($s); $current = max($current, 0); $days[] = $current; if ($current == 0) { break; } } return $days; } function vary($s) { // 100 is sufficient for our purposes. $sum = 0; for ($i = 0; $i < 100; $i++) { $sum += mt_rand() / 100; } return ($sum - (mt_getrandmax() / 2)) / ((mt_getrandmax() / sqrt(12)) / sqrt(100)); }