[submodule "lib/bubbletree"] | |
path = lib/bubbletree | |
url = https://github.com/okfn/bubbletree.git | |
<?php | <?php |
error_reporting(E_ALL); | error_reporting(E_ALL); |
include_once("../lib/common.inc.php"); | |
$link = mysql_connect('localhost', 'team7', 'wlUsnD2xu9'); | |
if (!$link) { | |
die('Could not connect: ' . mysql_error()); | |
} | |
@mysql_select_db("team7") or die("Unable to select database"); | |
$unspscresult = mysql_query ("select * from UNSPSCcategories;"); | $unspscresult = mysql_query ("select * from UNSPSCcategories;"); |
while ($row = mysql_fetch_assoc($unspscresult)) { | while ($row = mysql_fetch_assoc($unspscresult)) { |
$unspsc[$row['UNSPSC']] = $row['Title']; | $unspsc[$row['UNSPSC']] = $row['Title']; |
} | } |
$catsresult = mysql_query ("SELECT LEFT( categoryUNSPSC, 2 ) as cat , SUM( value ) as value | $catsresult = mysql_query ("SELECT LEFT( categoryUNSPSC, 2 ) as cat , SUM( value ) as value |
FROM `contractnotice` | FROM `contractnotice` |
GROUP BY cat ;"); | GROUP BY cat ;"); |
echo "<table>"; | echo "<table>"; |
while ($row = mysql_fetch_assoc($catsresult)) { | while ($row = mysql_fetch_assoc($catsresult)) { |
$catName = $unspsc[$row['cat']."000000"].$row['cat']; | $catName = $unspsc[$row['cat']."000000"].$row['cat']; |
if ($row['cat'] = "") $catName = "null"; | if ($row['cat'] == "") $catName = "null"; |
echo "<tr><td>$catName</td><td>".$row['value']."</td></tr>"; | echo "<tr><td>$catName</td><td>".$row['value']."</td></tr>"; |
} | } |
?> | ?> |
<!DOCTYPE html> | |
<html xmlns="http://www.w3.org/1999/xhtml"> | |
<head> | |
<meta charset="UTF-8"/> | |
<title>Minimal BubbleTree Demo</title> | |
<script type="text/javascript" src="lib/bubbletree/lib/jquery-1.5.2.min.js"></script> | |
<script type="text/javascript" src="lib/bubbletree/lib/jquery.history.js"></script> | |
<script type="text/javascript" src="lib/bubbletree/lib/raphael.js"></script> | |
<script type="text/javascript" src="lib/bubbletree/lib/vis4.js"></script> | |
<script type="text/javascript" src="lib/bubbletree/lib/Tween.js"></script> | |
<script type="text/javascript" src="lib/bubbletree/build/bubbletree.js"></script> | |
<link rel="stylesheet" type="text/css" href="lib/bubbletree/build/bubbletree.css" /> | |
<script type="text/javascript" src="lib/bubbletree/styles/cofog.js"></script> | |
<script type="text/javascript"> | |
$(function() { | |
<?php | |
include_once ("lib/common.inc.php"); | |
include("lib/Color.php"); | |
$color = new Lux_Color(); | |
$unspscresult = mysql_query("select * from UNSPSCcategories;"); | |
while ($row = mysql_fetch_assoc($unspscresult)) { | |
$unspsc[$row['UNSPSC']] = $row['Title']; | |
} | |
$total = 0; | |
$cats = 0; | |
$catsresult = mysql_query("SELECT LEFT( categoryUNSPSC, 1 ) as cat , | |
SUM( value ) as value | |
FROM `contractnotice` | |
WHERE childCN = 0 | |
GROUP BY cat ;"); | |
$nodes = Array(); | |
while ($row = mysql_fetch_assoc($catsresult)) { | |
$cats++; | |
$catColor = $color->hsl2hex(Array($cats/10, .7, .5)); | |
$catName = $unspsc[$row['cat'] . "0000000"] . $row['cat']; | |
if ($row['cat'] == "") $catName = "null"; | |
$subnodes = Array(); | |
$cattwosresult = mysql_query("SELECT LEFT( categoryUNSPSC, 2 ) as cat , | |
SUM( value ) as value | |
FROM `contractnotice` | |
WHERE childCN = 0 and LEFT( categoryUNSPSC, 1 ) = '{$row['cat']}' | |
GROUP BY cat ;"); | |
while ($tworow = mysql_fetch_assoc($cattwosresult)) { | |
$subcatName = $unspsc[$tworow['cat'] . "000000"] . $tworow['cat']; | |
if ($tworow['cat'] == "") $subcatName = "null"; | |
$subsubnodes = Array(); | |
$catthreesresult = mysql_query("SELECT LEFT( categoryUNSPSC, 3 ) as cat , | |
SUM( value ) as value | |
FROM `contractnotice` | |
WHERE childCN = 0 and LEFT( categoryUNSPSC, 2 ) = '{$tworow['cat']}' | |
GROUP BY cat ;"); | |
$subCatColor = $color->hsl2hex(Array($cats/10, rand(1,10)/10, .5)); | |
while ($threerow = mysql_fetch_assoc($catthreesresult)) { | |
$subsubcatName = $unspsc[$threerow['cat'] . "00000"] . $threerow['cat']; | |
if ($threerow['cat'] == "") $subsubcatName = "null"; | |
$subsubnodes[] = Array( | |
"label" => $subsubcatName, | |
"amount" => $threerow['value'], | |
"color" => "#".$subCatColor | |
); | |
} | |
$subnodes[] = Array( | |
"label" => $subcatName, | |
"amount" => $tworow['value'], | |
"color" => "#".$subCatColor, | |
"children" => $subsubnodes | |
); | |
} | |
$nodes[] = Array( | |
"label" => $catName, | |
"amount" => $row['value'], | |
"color" => "#".$catColor, | |
"children" => $subnodes | |
); | |
$total+= $row['value']; | |
} | |
$data = Array( | |
"label" => "Australian Federal Government Contract Spending", | |
"amount" => $total, | |
"color" => "#000000", | |
"children" => $nodes | |
); | |
echo "var data =eval('('+'" . json_encode($data) . "'+')');"; | |
?> | |
new BubbleTree({ | |
data: data, | |
container: '.bubbletree' | |
}); | |
}); | |
</script> | |
</head> | |
<body> | |
<div class="bubbletree-wrapper"> | |
<div class="bubbletree"></div> | |
</div> | |
</body> | |
</html> | |
<?php | <?php |
//long contract period (number of weeks/days?) | //long contract period (number of weeks/days?) |
$heuristics["DATE_LONG_CONTRACT_PERIOD"] = Array( | $heuristics["DATE_LONG_CONTRACT_PERIOD"] = Array( |
"description" => "long contract period (number of weeks/days?)" | "description" => "long contract period (number of weeks/days?)" |
); | ); |
function DATE_LONG_CONTRACT_PERIOD($cn) | function DATE_LONG_CONTRACT_PERIOD($cn) |
{ | { |
$averageContractPeriod = getAverageContractPeriod(); | $averageContractPeriod = getAverageContractPeriod(); |
$stddevContractPeriod = getstddevContractPeriod(); | $stddevContractPeriod = getstddevContractPeriod(); |
$diff = strtotime($cn['contractEnd']) - strtotime($cn['contractStart']); | $diff = strtotime($cn['contractEnd']) - strtotime($cn['contractStart']); |
$days = intval($diff / (60 * 60 * 24)); | $days = intval($diff / (60 * 60 * 24)); |
$value = abs($days - $averageContractPeriod) / $stddevContractPeriod; | $value = abs($days - $averageContractPeriod) / $stddevContractPeriod; |
return Array( | return Array( |
"heuristic_value" => $value, | "heuristic_value" => $value, |
"raw_value" => $days, | "raw_value" => $days, |
"mean" => $averageContractPeriod, | "mean" => $averageContractPeriod, |
"stddev" => $stddevContractPeriod | "stddev" => $stddevContractPeriod |
); | ); |
} | } |
$averageContractPeriod; | $averageContractPeriod; |
function getAverageContractPeriod() | function getAverageContractPeriod() |
{ | { |
global $averageContractPeriod; | global $averageContractPeriod, $stddevContractPeriod; |
if (!$averageContractPeriod) { | if (!$averageContractPeriod) { |
$query = "select AVG(dateDiff(contractEnd,contractStart)) from contractnotice"; | getStddevAverageContractPeriod(); |
$result = mysql_query($query); | |
$r = mysql_fetch_array($result, MYSQL_BOTH); | |
$averageContractPeriod = $r[0]; | |
} | } |
return $averageContractPeriod; | return $averageContractPeriod; |
} | } |
$stddevContractPeriod; | $stddevContractPeriod; |
function getstddevContractPeriod() | function getstddevContractPeriod() |
{ | { |
global $stddevContractPeriod; | global $averageContractPeriod, $stddevContractPeriod; |
if (!$stddevContractPeriod) { | if (!$stddevContractPeriod) { |
$query = "select STDDEV(dateDiff(contractEnd,contractStart)) from contractnotice"; | getStddevAverageContractPeriod(); |
$result = mysql_query($query); | |
$r = mysql_fetch_array($result, MYSQL_BOTH); | |
$stddevContractPeriod = $r[0]; | |
} | } |
return $stddevContractPeriod; | return $stddevContractPeriod; |
} | } |
function getStddevAverageContractPeriod() | |
{ | |
global $averageContractPeriod, $stddevContractPeriod; | |
$query = "select AVG(dateDiff(contractEnd,contractStart)),stddev(dateDiff(contractEnd,contractStart)) from contractnotice"; | |
$result = mysql_query($query); | |
$r = mysql_fetch_array($result, MYSQL_BOTH); | |
$averageContractPeriod = $r[0]; | |
$stddevContractPeriod = $r[1]; | |
} | |
//Reported late, 45 days? A late contract is a dodgy contract except maybe for variations? | //Reported late, 45 days? A late contract is a dodgy contract except maybe for variations? |
$heuristics["DATE_REPORTED_LATE"] = Array( | $heuristics["DATE_REPORTED_LATE"] = Array( |
"description" => "Reported late, 45 days?" | "description" => "Reported late, 45 days?" |
); | ); |
function DATE_REPORTED_LATE($cn) | function DATE_REPORTED_LATE($cn) |
{ | { |
$averageDaysLate = getAverageDaysLate(); | $averageDaysLate = getAverageDaysLate(); |
$stddevDaysLate = getStddevDaysLate(); | $stddevDaysLate = getStddevDaysLate(); |
$diff = strtotime($cn['publishDate']) - strtotime($cn['contractStart']); | $diff = strtotime($cn['publishDate']) - strtotime($cn['contractStart']); |
$days = intval($diff / (60 * 60 * 24)); | $days = intval($diff / (60 * 60 * 24)); |
if ($days <= 0) { | if ($days <= 0) { |
$value = 0; | $value = 0; |
} | } |
else { | else { |
// +1 demerit for exceeding 45 day requirement | // +1 demerit for exceeding 45 day requirement |
$value = (abs($days - $averageDaysLate) / $stddevDaysLate) + ($days < 45 ? 0 : 1); | $value = (abs($days - $averageDaysLate) / $stddevDaysLate) + ($days < 45 ? 0 : 1); |
} | } |
return Array( | return Array( |
"heuristic_value" => $value, | "heuristic_value" => $value, |
"raw_value" => $days, | "raw_value" => $days, |
"mean" => $averageDaysLate, | "mean" => $averageDaysLate, |
"stddev" => $stddevDaysLate | "stddev" => $stddevDaysLate |
); | ); |
} | } |
$averageDaysLate; | $averageDaysLate; |
function getAverageDaysLate() | function getAverageDaysLate() |
{ | { |
global $averageDaysLate; | global $averageDaysLate; |
if (!$averageDaysLate) { | if (!$averageDaysLate) { |
$query = "select AVG(dateDiff(publishDate,contractStart)) from contractnotice"; | getDaysLate(); |
$result = mysql_query($query); | |
$r = mysql_fetch_array($result, MYSQL_BOTH); | |
$averageDaysLate = $r[0]; | |
} | } |
return $averageDaysLate; | return $averageDaysLate; |
} | } |
$stddevDaysLate; | $stddevDaysLate; |
function getStddevDaysLate() | function getStddevDaysLate() |
{ | { |
global $stddevDaysLate; | global $stddevDaysLate; |
if (!$stddevDaysLate) { | if (!$stddevDaysLate) { |
$query = "select STDDEV(dateDiff(publishDate,contractStart)) from contractnotice"; | getDaysLate(); |
$result = mysql_query($query); | |
$r = mysql_fetch_array($result, MYSQL_BOTH); | |
$stddevDaysLate = $r[0]; | |
} | } |
return $stddevDaysLate; | return $stddevDaysLate; |
} | } |
function getDaysLate() { | |
global $averageDaysLate,$stddevDaysLate; | |
$query = "select AVG(dateDiff(publishDate,contractStart)), STDDEV(dateDiff(publishDate,contractStart)) from contractnotice"; | |
$result = mysql_query($query); | |
$r = mysql_fetch_array($result, MYSQL_BOTH); | |
$averageDaysLate = $r[0]; | |
$stddevDaysLate = $r[1]; | |
} | |
?> | ?> |
<?php | <?php |
include_once("../lib/common.inc.php"); | include_once ("../lib/common.inc.php"); |
$heuristics = Array(); | $heuristics = Array(); |
//each heuristic adds self to description array | //each heuristic adds self to description array |
include ("dateHeuristics.php"); | include ("dateHeuristics.php"); |
//include("historyHeuristics.php"); | include ("historyHeuristics.php"); |
//include("metadataHeuristics.php"); | //include ("metadataHeuristics.php"); |
//include("valueHeuristics.php"); | //include ("valueHeuristics.php"); |
// method signature heuristic($contractNoticeAsArray); | |
function runHeuristic($heuristicName, $cn) | function runHeuristic($heuristicName, $cn) |
{ | { |
$hresults = call_user_func($heuristicName, $cn); | // check if already ran |
if (!isset($hresults["heuristic_value"]) || !isset($hresults["raw_value"]) || !isset($hresults["mean"]) || !isset($hresults["stddev"])) { | $query = "select count(*) from heuristic_results where heuristic_name = '$heuristicName' and CNID = '{$cn['CNID']}'"; |
print_r($hresults); | $result = mysql_query($query); |
die("Missing field in heurtistic $heuristicName result"); | $r = mysql_fetch_array($result); |
} | if ($r[0] == 0) { |
$query = "insert into heuristic_results values('$heuristicName', | // if not, run now |
$hresults = call_user_func($heuristicName, $cn); | |
if (!isset($hresults["heuristic_value"]) || !isset($hresults["raw_value"]) || !isset($hresults["mean"]) || !isset($hresults["stddev"])) { | |
print_r($hresults); | |
die("Missing field in heurtistic $heuristicName result"); | |
} | |
$query = "insert into heuristic_results values('$heuristicName', | |
'{$hresults["heuristic_value"]}', | '{$hresults["heuristic_value"]}', |
'{$hresults["raw_value"]}', | '{$hresults["raw_value"]}', |
'{$hresults["mean"]}', | '{$hresults["mean"]}', |
'{$hresults["stddev"]}', | '{$hresults["stddev"]}', |
'{$cn["CNID"]}', | '{$cn["CNID"]}', |
NOW(), | NOW(), |
'{$cn["publishDate"]}', | '{$cn["publishDate"]}', |
'{$cn["agencyABN"]}', | '{$cn["agencyABN"]}', |
'{$cn["supplierID"]}' | '{$cn["supplierID"]}' |
)"; | )"; |
// save value and cn data via sql | // save value and cn data via sql |
$result = mysql_query($query); | $result = mysql_query($query); |
if ($result) echo "Saved $heuristicName for {$cn["CNID"]} <br>\n"; | if ($result) echo "Saved $heuristicName for {$cn["CNID"]} <br>\n"; |
elseif (strpos(mysql_error() , "Duplicate entry") === false) echo $hresults . " failed insert.<br>" . mysql_error() . " <br> $query <br><br>\n"; | elseif (strpos(mysql_error() , "Duplicate entry") === false) echo $hresults . " failed insert.<br>" . mysql_error() . " <br> $query <br><br>\n"; |
} | |
} | } |
?> | ?> |
<?php | <?php |
// "unusual for agency/supplier due to previous low number of transactions " | $heuristics["HISTORY_LOW_TRANSACTIONS_AGENCY"] = Array( |
$heuristics["HISTORY_LOW_TRANSACTIONS"] = Array( | "description" => "unusual for agency due to previous low number of transactions " |
"description" => "unusual for agency/supplier due to previous low number of transactions " | |
); | ); |
function HISTORY_LOW_TRANSACTIONS($cn) | function HISTORY_LOW_TRANSACTIONS_AGENCY($cn) |
{ | { |
$averageContractPeriod = getAverageContractPeriod(); | $thisAgencyTransactions = getAgencyTransactions($cn['agencyName']); |
$diff = strtotime($cn['contractStart']) - strtotime($cn['publishDate']); | $averageAgencyTransactions = getAverageAgencyTransactions(); |
$days = intval($diff / 24); | $stddevAgencyTransactions = getstddevAgencyTransactions(); |
return ($days > 45 ? 1 : 0); | $diff = strtotime($cn['contractEnd']) - strtotime($cn['contractStart']); |
$days = intval($diff / (60 * 60 * 24)); | |
$value = abs($days - $averageAgencyTransactions) / $stddevAgencyTransactions; | |
return Array( | |
"heuristic_value" => $value, | |
"raw_value" => $days, | |
"mean" => $averageAgencyTransactions, | |
"stddev" => $stddevAgencyTransactions | |
); | |
} | } |
/* - unusual value for time of year | $agencyTransactions = Array(); |
- compare to all other records in last 2 weeks | function getAgencyTransactions($agencyName) |
- ie. many large contracts in june so takes more to standout*/ | |
$heuristics["HISTORY_HIGH_VALUE_FOR_MONTH"] = Array( | |
"description" => "unusual value for time of year"); | |
function HISTORY_HIGH_VALUE_FOR_MONTH($cn) | |
{ | { |
$averageContractPeriod = getAverageContractPeriod(); | global $agencyTransactions; |
$diff = strtotime($cn['contractStart']) - strtotime($cn['publishDate']); | if (!$agencyTransactions[$agencyName]) { |
$days = intval($diff / 24); | $query = 'select count(*) from contractnotice where agencyName = "' . $agencyName . '"'; |
return ($days > 45 ? 1 : 0); | $result = mysql_query($query); |
$r = mysql_fetch_array($result, MYSQL_BOTH); | |
$agencyTransactions[$agencyName] = $r[0]; | |
} | |
return $agencyTransactions[$agencyName]; | |
} | } |
$averageAgencyTransactions; | |
function getAverageAgencyTransactions() | |
{ | |
global $averageAgencyTransactions; | |
if (!$averageAgencyTransactions) { | |
getStatsAgencyTransactions(); | |