diff --git a/scripts/weekly_report.php b/scripts/weekly_report.php index 1ef574d..4b17ca9 100644 --- a/scripts/weekly_report.php +++ b/scripts/weekly_report.php @@ -22,36 +22,57 @@ function safe_percentage($count, $prior_count) { return $percentagediff; } +$db = new SQLite3('./scripts/birds.db', SQLITE3_OPEN_READONLY); +$db->busyTimeout(1000); + +$statement1 = $db->prepare('SELECT Sci_Name, Com_Name, COUNT(*) FROM detections WHERE Date BETWEEN "' . date("Y-m-d", $startdate) . '" AND "' . date("Y-m-d", $enddate) . '" GROUP By Sci_Name ORDER BY COUNT(*) DESC'); +ensure_db_ok($statement1); +$result1 = $statement1->execute(); +while ($detection = $result1->fetchArray(SQLITE3_ASSOC)) { + $com_name = $detection["Com_Name"]; + $sci_name = $detection["Sci_Name"]; + $scount = $detection["COUNT(*)"]; + + # previous week + $statement2 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Sci_Name == "' . $detection["Sci_Name"] . '" AND Date BETWEEN "' . date("Y-m-d", $startdate - (7 * 86400)) . '" AND "' . date("Y-m-d", $enddate - (7 * 86400)) . '"'); + ensure_db_ok($statement2); + $result2 = $statement2->execute(); + $priorweekcount = $result2->fetchArray(SQLITE3_ASSOC)['COUNT(*)']; + $percentagediff = safe_percentage($scount, $priorweekcount); + + # is_first_seen? + $statement3 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Sci_Name == "'.$sci_name.'" AND Date NOT BETWEEN "'.date("Y-m-d",$startdate).'" AND "'.date("Y-m-d",$enddate).'"'); + ensure_db_ok($statement3); + $result3 = $statement3->execute(); + $totalcount = $result3->fetchArray(SQLITE3_ASSOC)['COUNT(*)']; + $is_first_seen = $totalcount === 0; + + $detections[$com_name] = ["count" => $scount, "percentagediff" => $percentagediff, "is_first_seen" => $is_first_seen]; +} + +$statement4 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate).'" AND "'.date("Y-m-d",$enddate).'"'); +ensure_db_ok($statement4); +$result4 = $statement4->execute(); +$totalcount = $result4->fetchArray(SQLITE3_ASSOC)['COUNT(*)']; + +$statement5 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate- (7*86400)).'" AND "'.date("Y-m-d",$enddate- (7*86400)).'"'); +ensure_db_ok($statement5); +$result5 = $statement5->execute(); +$priortotalcount = $result5->fetchArray(SQLITE3_ASSOC)['COUNT(*)']; + +$statement6 = $db->prepare('SELECT COUNT(DISTINCT(Sci_Name)) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate).'" AND "'.date("Y-m-d",$enddate).'"'); +ensure_db_ok($statement6); +$result6 = $statement6->execute(); +$totalspeciestally = $result6->fetchArray(SQLITE3_ASSOC)['COUNT(DISTINCT(Sci_Name))']; + +$statement7 = $db->prepare('SELECT COUNT(DISTINCT(Sci_Name)) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate- (7*86400)).'" AND "'.date("Y-m-d",$enddate- (7*86400)).'"'); +ensure_db_ok($statement7); +$result7= $statement7->execute(); +$priortotalspeciestally = $result7->fetchArray(SQLITE3_ASSOC)['COUNT(DISTINCT(Sci_Name))']; + +$percentagedifftotal = safe_percentage($totalcount, $priortotalcount); + if(isset($_GET['ascii'])) { - - $db = new SQLite3('./scripts/birds.db', SQLITE3_OPEN_READONLY); - $db->busyTimeout(1000); - - $statement1 = $db->prepare('SELECT DISTINCT(Com_Name), COUNT(*) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate).'" AND "'.date("Y-m-d",$enddate).'" GROUP By Com_Name ORDER BY COUNT(*) DESC'); - ensure_db_ok($statement1); - $result1 = $statement1->execute(); - - $statement4 = $db->prepare('SELECT DISTINCT(Com_Name), COUNT(*) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate).'" AND "'.date("Y-m-d",$enddate).'"'); - ensure_db_ok($statement4); - $result4 = $statement4->execute(); - $totalcount = $result4->fetchArray(SQLITE3_ASSOC)['COUNT(*)']; - - $statement5 = $db->prepare('SELECT DISTINCT(Com_Name), COUNT(*) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate- (7*86400)).'" AND "'.date("Y-m-d",$enddate- (7*86400)).'"'); - ensure_db_ok($statement5); - $result5 = $statement5->execute(); - $priortotalcount = $result5->fetchArray(SQLITE3_ASSOC)['COUNT(*)']; - - $statement6 = $db->prepare('SELECT COUNT(DISTINCT(Com_Name)) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate).'" AND "'.date("Y-m-d",$enddate).'"'); - ensure_db_ok($statement6); - $result6 = $statement6->execute(); - $totalspeciestally = $result6->fetchArray(SQLITE3_ASSOC)['COUNT(DISTINCT(Com_Name))']; - - $statement7 = $db->prepare('SELECT COUNT(DISTINCT(Com_Name)) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate- (7*86400)).'" AND "'.date("Y-m-d",$enddate- (7*86400)).'"'); - ensure_db_ok($statement7); - $result7= $statement7->execute(); - $priortotalspeciestally = $result7->fetchArray(SQLITE3_ASSOC)['COUNT(DISTINCT(Com_Name))']; - - $percentagedifftotal = safe_percentage($totalcount, $priortotalcount); if($percentagedifftotal > 0) { $percentagedifftotal = "+".$percentagedifftotal."%"; } else { @@ -65,13 +86,6 @@ if(isset($_GET['ascii'])) { $percentagedifftotaldistinctspecies = "-".abs($percentagedifftotaldistinctspecies)."%"; } - $detections = []; - $i = 0; - while($detection=$result1->fetchArray(SQLITE3_ASSOC)) - { - $detections[$detection["Com_Name"]] = $detection["COUNT(*)"]; - } - echo "# BirdNET-Pi: Week ".date('W', $enddate)." Report\n"; echo "Total Detections: ".$totalcount." (".$percentagedifftotal.")
"; @@ -80,41 +94,28 @@ if(isset($_GET['ascii'])) { echo "= Top 10 Species =
"; $i = 0; - foreach($detections as $com_name=>$scount) + foreach($detections as $com_name=>$stats) { + $count = $stats["count"]; + $percentagediff = $stats["percentagediff"]; $i++; - if($i <= 10) { - $statement2 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Com_Name == "'.$com_name.'" AND Date BETWEEN "'.date("Y-m-d",$startdate - (7*86400)).'" AND "'.date("Y-m-d",$enddate - (7*86400)).'"'); - ensure_db_ok($statement2); - $result2 = $statement2->execute(); - $totalcount = $result2->fetchArray(SQLITE3_ASSOC); - $priorweekcount = $totalcount['COUNT(*)']; + if($percentagediff > 0) { + $percentagediff = "+".$percentagediff."%"; + } else { + $percentagediff = "-".abs($percentagediff)."%"; + } - // really percent changed - $percentagediff = safe_percentage($scount, $priorweekcount); - if($percentagediff > 0) { - $percentagediff = "+".$percentagediff."%"; - } else { - $percentagediff = "-".abs($percentagediff)."%"; - } - - echo $com_name." - ".$scount." (".$percentagediff.")
"; + echo $com_name." - ".$scount." (".$percentagediff.")
"; } } echo "
= Species Detected for the First Time =
"; - $newspeciescount=0; - foreach($detections as $com_name=>$scount) + $newspeciescount=0; + foreach($detections as $com_name=>$stats) { - $statement3 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Com_Name == "'.$com_name.'" AND Date NOT BETWEEN "'.date("Y-m-d",$startdate).'" AND "'.date("Y-m-d",$enddate).'"'); - ensure_db_ok($statement3); - $result3 = $statement3->execute(); - $totalcount = $result3->fetchArray(SQLITE3_ASSOC); - $nonthisweekcount = $totalcount['COUNT(*)']; - - if($nonthisweekcount == 0) { + if($stats["is_first_seen"]) { $newspeciescount++; echo $com_name." - ".$scount."
"; } @@ -123,8 +124,8 @@ if(isset($_GET['ascii'])) { echo "No new species were seen this week."; } - $prevweek = date('W', $enddate) - 1; - if($prevweek < 1) { $prevweek = 52; } + $prevweek = date('W', $enddate) - 1; + if($prevweek < 1) { $prevweek = 52; } echo "
* data from ".date('Y-m-d', $startdate)." — ".date('Y-m-d',$enddate).".
"; echo "* percentages are calculated relative to week ".($prevweek)."."; @@ -135,32 +136,8 @@ if(isset($_GET['ascii'])) { ?>
Week ".date('W', $enddate)." Report".date('F jS, Y',$startdate)." — ".date('F jS, Y',$enddate)."
"; -?>
busyTimeout(1000); -if($debug == false){ -$statement1 = $db->prepare('SELECT DISTINCT(Com_Name), COUNT(*) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate).'" AND "'.date("Y-m-d",$enddate).'" GROUP By Com_Name ORDER BY COUNT(*) DESC'); -} else { - $statement1 = $db->prepare('SELECT DISTINCT(Com_Name), COUNT(*) FROM detections WHERE Date BETWEEN "'.date("Y-m-d",$startdate).'" AND "'.date("Y-m-d",$enddate).'" GROUP By Com_Name ORDER BY COUNT(*) ASC'); -} -ensure_db_ok($statement1); -$result1 = $statement1->execute(); - -$detections = []; -$i = 0; -while($detection=$result1->fetchArray(SQLITE3_ASSOC)) -{ - if($debug == true){ - if($i > 10) { - break; - } - } - $i++; - $detections[$detection["Com_Name"]] = $detection["COUNT(*)"]; - -} ?> +
"; + echo ""; } } ?> @@ -208,16 +180,10 @@ while($detection=$result1->fetchArray(SQLITE3_ASSOC)) $scount) + $newspeciescount=0; + foreach($detections as $com_name=>$stats) { - $statement3 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Com_Name == "'.$com_name.'" AND Date NOT BETWEEN "'.date("Y-m-d",$startdate).'" AND "'.date("Y-m-d",$enddate).'"'); - ensure_db_ok($statement3); - $result3 = $statement3->execute(); - $totalcount = $result3->fetchArray(SQLITE3_ASSOC); - $nonthisweekcount = $totalcount['COUNT(*)']; - - if($nonthisweekcount == 0) { + if($stats["is_first_seen"]) { $newspeciescount++; echo ""; }
@@ -174,24 +151,19 @@ while($detection=$result1->fetchArray(SQLITE3_ASSOC)) $scount) + foreach($detections as $com_name=>$stats) { $i++; if($i <= 10) { - $statement2 = $db->prepare('SELECT COUNT(*) FROM detections WHERE Com_Name == "'.$com_name.'" AND Date BETWEEN "'.date("Y-m-d",$startdate - (7*86400)).'" AND "'.date("Y-m-d",$enddate - (7*86400)).'"'); - ensure_db_ok($statement2); - $result2 = $statement2->execute(); - $totalcount = $result2->fetchArray(SQLITE3_ASSOC); - $priorweekcount = $totalcount['COUNT(*)']; - - $percentagediff = safe_percentage($scount, $priorweekcount); + $count = $stats["count"]; + $percentagediff = $stats["percentagediff"]; if($percentagediff > 0) { $percentagediff = "+".$percentagediff."%"; } else { $percentagediff = "-".abs($percentagediff)."%"; } - echo "
".$com_name."
".$scount." (".$percentagediff.")
".$com_name."
".$count." (".$percentagediff.")
".$com_name."
".$scount."