Commit 91f84acb authored by JonathanMM's avatar JonathanMM

Merge branch 'stats' into 'master'

Stats

See merge request !12
parents 5ff794cb 90d768cd
from DumpLib import creerDumpData, creerDumpConso
from dumpLib import creerDumpData, creerDumpConso
import pymysql, datetime
from config import getMysqlConnection
......
from resumeLib import debuterCalculResume, debuterCalculResumeConso, debuterCalculResumeOfResume, debuterCalculResumeOfResumeConso
from resumeLib import calculerToutResume
import pymysql, datetime
from config import getMysqlConnection
......@@ -16,19 +16,4 @@ print("Fin = "+str(dateMax))
print("******* Bornes *******")
#Périodes à calculer
periodes = [5, 15, 60, 360]
periodePrecedente = 0
for periode in periodes:
dateCourante = dateMin
print("-> Début période "+ str(periode))
while dateCourante + datetime.timedelta(minutes=periode) <= dateMax:
print("Période " + str(periode)+'; date = '+str(dateCourante))
if periode == 5:
debuterCalculResume(periode, dateCourante)
debuterCalculResumeConso(periode, dateCourante)
else:
debuterCalculResumeOfResume(periodePrecedente, periode, dateCourante)
debuterCalculResumeOfResumeConso(periodePrecedente, periode, dateCourante)
dateCourante = dateCourante + datetime.timedelta(minutes=periode)
periodePrecedente = periode
print("-> Fin période "+ str(periode))
\ No newline at end of file
calculerToutResume(dateMin, dateMax)
\ No newline at end of file
......@@ -4,4 +4,7 @@ def getMysqlConnection():
return pymysql.connect(host="", user="",passwd="",db="")
def getURLVelib():
return ''
\ No newline at end of file
return ''
def getURLDump():
return 'https://velib.nocle.fr/dump/'
\ No newline at end of file
from DumpLib import creerDumpData, creerDumpConso
from dumpLib import creerDumpData, creerDumpConso
import datetime
date = datetime.datetime.today() - datetime.timedelta(days=2)
......
import sqlite3, pymysql, datetime, os
from config import getMysqlConnection
from config import getMysqlConnection, getURLDump
import urllib.request
def creerStationTable(c):
c.execute('''
......@@ -172,7 +173,10 @@ def creerDumpConso(dateDebut):
`nbEBikeOverflowMin` int(3) NOT NULL,
`nbEBikeOverflowMax` int(3) NOT NULL,
`nbEBikeOverflowMoyenne` decimal(5,2) NOT NULL,
`maxBikeOverflow` int(3) NOT NULL
`maxBikeOverflow` int(3) NOT NULL,
`nbEDockPerdusMin` int(3) DEFAULT NULL,
`nbEDockPerdusMax` int(3) DEFAULT NULL,
`nbEDockPerdusMoyenne` decimal(5,2) DEFAULT NULL
);
''')
conn.commit()
......@@ -195,7 +199,7 @@ def creerDumpConso(dateDebut):
c = conn.cursor()
requete = mysql.cursor()
requete.execute('SELECT id, code, date, duree, nbBikeMin, nbBikeMax, nbBikeMoyenne, nbBikePris, nbBikeRendu, nbEBikeMin, nbEBikeMax, nbEBikeMoyenne, nbEBikePris, nbEBikeRendu, nbFreeEDockMin, nbFreeEDockMax, nbFreeEDockMoyenne, nbEDock, nbBikeOverflowMin, nbBikeOverflowMax, nbBikeOverflowMoyenne, nbEBikeOverflowMin, nbEBikeOverflowMax, nbEBikeOverflowMoyenne, maxBikeOverflow \
requete.execute('SELECT id, code, date, duree, nbBikeMin, nbBikeMax, nbBikeMoyenne, nbBikePris, nbBikeRendu, nbEBikeMin, nbEBikeMax, nbEBikeMoyenne, nbEBikePris, nbEBikeRendu, nbFreeEDockMin, nbFreeEDockMax, nbFreeEDockMoyenne, nbEDock, nbBikeOverflowMin, nbBikeOverflowMax, nbBikeOverflowMoyenne, nbEBikeOverflowMin, nbEBikeOverflowMax, nbEBikeOverflowMoyenne, maxBikeOverflow, nbEDockPerdusMin, nbEDockPerdusMax, nbEDockPerdusMoyenne \
FROM resumeStatus \
WHERE date >= "'+dateDebutStr+'" AND date < "'+dateFinStr+'"')
stations = requete.fetchall()
......@@ -203,9 +207,44 @@ def creerDumpConso(dateDebut):
values = []
for cell in station:
values.append(val(cell))
c.execute('INSERT INTO resumeStatus (id, code, date, duree, nbBikeMin, nbBikeMax, nbBikeMoyenne, nbBikePris, nbBikeRendu, nbEBikeMin, nbEBikeMax, nbEBikeMoyenne, nbEBikePris, nbEBikeRendu, nbFreeEDockMin, nbFreeEDockMax, nbFreeEDockMoyenne, nbEDock, nbBikeOverflowMin, nbBikeOverflowMax, nbBikeOverflowMoyenne, nbEBikeOverflowMin, nbEBikeOverflowMax, nbEBikeOverflowMoyenne, maxBikeOverflow) VALUES \
c.execute('INSERT INTO resumeStatus (id, code, date, duree, nbBikeMin, nbBikeMax, nbBikeMoyenne, nbBikePris, nbBikeRendu, nbEBikeMin, nbEBikeMax, nbEBikeMoyenne, nbEBikePris, nbEBikeRendu, nbFreeEDockMin, nbFreeEDockMax, nbFreeEDockMoyenne, nbEDock, nbBikeOverflowMin, nbBikeOverflowMax, nbBikeOverflowMoyenne, nbEBikeOverflowMin, nbEBikeOverflowMax, nbEBikeOverflowMoyenne, maxBikeOverflow, nbEDockPerdusMin, nbEDockPerdusMax, nbEDockPerdusMoyenne) VALUES \
('+', '.join(values)+')')
conn.commit()
#Et on ferme le fichier
c.close()
\ No newline at end of file
c.close()
def importerDumpData(adresseDump):
sqlite = sqlite3.connect(adresseDump)
mysql = getMysqlConnection()
importerTable("stations", mysql, sqlite)
importerTable("status", mysql, sqlite)
importerTable("statusConso", mysql, sqlite)
def importerTable(nomTable, mysql, sqlite):
print("Import de la table " + nomTable)
#On récupère la liste des champs de stations
c = sqlite.cursor()
requete = c.execute("pragma table_info(" + nomTable + ")")
fields = requete.fetchall()
nomFields = []
for field in fields:
nomFields.append(field[1])
#On récupère les données
cDump = sqlite.cursor()
requete = cDump.execute("SELECT "+', '.join(nomFields)+" FROM " + nomTable)
valeurs = requete.fetchall()
for valeur in valeurs:
c = mysql.cursor()
c.execute("INSERT INTO " + nomTable + " (" + ", ".join(nomFields) + ") VALUES (" + ", ".join(list(map(val,valeur))) + ")")
def downloadDumpData(dateDump):
nomFichier = dateDump.strftime("%Y-%m-%d") + '-data.db'
urllib.request.urlretrieve(getURLDump() + nomFichier, nomFichier)
return nomFichier
def cleanStationTable():
mysql = getMysqlConnection()
c = mysql.cursor()
c.execute("TRUNCATE stations")
\ No newline at end of file
import dumpLib
import datetime
import resumeLib
import os
import nettoyageLib
jour = datetime.datetime(2018, 1, 7)
dateMax = datetime.datetime(2018, 2, 1)
while jour <= dateMax:
print("--- Jour traité : " + str(jour.strftime("%Y-%m-%d")))
print("Nettoyage de la table station")
dumpLib.cleanStationTable()
print("Téléchargement du dump")
nomFichier = dumpLib.downloadDumpData(jour)
print("Importation du dump")
dumpLib.importerDumpData(nomFichier)
demain = jour + datetime.timedelta(days=1)
print("Suppression du fichier dump")
os.remove(nomFichier)
print("Calcul des resumes")
resumeLib.calculerToutResume(jour, demain)
print("Nettoyage des données inutiles")
nettoyageLib.nettoyerInstantanne(demain - datetime.timedelta(minutes = 5))
nettoyageLib.nettoyerConso(demain, "duree <= 60")
nettoyageLib.optimiserBDD()
jour += datetime.timedelta(days = 1)
\ No newline at end of file
......@@ -36,10 +36,17 @@ def calculerResume(dateConsoDT, dureeConso):
ORDER BY c.id ASC")
statusConso = requete.fetchall()
bikeList = {}
#On insert ici les valeurs que l'on va calculer
proprietes.append('nbEDockPerdus')
for row in statusConso:
codeStation = int(row[0])
for i, cle in enumerate(proprietes):
valeurProp = int(row[i+1])
if cle == 'nbEDockPerdus':
valeurProp = int(row[proprietes.index('nbEDock') + 1]) - int(row[proprietes.index('nbBike') + 1]) - int(row[proprietes.index('nbEBike') + 1]) - int(row[proprietes.index('nbFreeEDock') + 1])
else:
valeurProp = int(row[i+1])
if cle in ['nbEDock', 'maxBikeOverflow']:
bikeList[codeStation][cle] = valeurProp
else:
......@@ -81,8 +88,8 @@ def calculerResume(dateConsoDT, dureeConso):
for codeStation in bikeList:
valeurs = bikeList[codeStation]
requete = mysql.cursor()
requete.execute('INSERT INTO `resumeStatus` (`id`, `code`, `date`, `duree`, `nbBikeMin`, `nbBikeMax`, `nbBikeMoyenne`, `nbBikePris`, `nbBikeRendu`, `nbEBikeMin`, `nbEBikeMax`, `nbEBikeMoyenne`, `nbEBikePris`, `nbEBikeRendu`, `nbFreeEDockMin`, `nbFreeEDockMax`, `nbFreeEDockMoyenne`, `nbEDock`, `nbBikeOverflowMin`, `nbBikeOverflowMax`, `nbBikeOverflowMoyenne`, `nbEBikeOverflowMin`, `nbEBikeOverflowMax`, `nbEBikeOverflowMoyenne`, `maxBikeOverflow`) VALUES \
(NULL, '+str(codeStation)+', "'+dateConso+'", '+str(dureeConso)+', '+str(valeurs['nbBike']['min'])+', '+str(valeurs['nbBike']['max'])+', '+str(valeurs['nbBike']['moyenne'])+', '+str(valeurs['nbBike']['pris'])+', '+str(valeurs['nbBike']['remis'])+', '+str(valeurs['nbEBike']['min'])+', '+str(valeurs['nbEBike']['max'])+', '+str(valeurs['nbEBike']['moyenne'])+', '+str(valeurs['nbEBike']['pris'])+', '+str(valeurs['nbEBike']['remis'])+', '+str(valeurs['nbFreeEDock']['min'])+', '+str(valeurs['nbFreeEDock']['max'])+', '+str(valeurs['nbFreeEDock']['moyenne'])+', '+str(valeurs['nbEDock'])+', '+str(valeurs['nbBikeOverflow']['min'])+', '+str(valeurs['nbBikeOverflow']['max'])+', '+str(valeurs['nbBikeOverflow']['moyenne'])+', '+str(valeurs['nbEBikeOverflow']['min'])+', '+str(valeurs['nbEBikeOverflow']['max'])+', '+str(valeurs['nbEBikeOverflow']['moyenne'])+', '+str(valeurs['maxBikeOverflow'])+')')
requete.execute('INSERT INTO `resumeStatus` (`id`, `code`, `date`, `duree`, `nbBikeMin`, `nbBikeMax`, `nbBikeMoyenne`, `nbBikePris`, `nbBikeRendu`, `nbEBikeMin`, `nbEBikeMax`, `nbEBikeMoyenne`, `nbEBikePris`, `nbEBikeRendu`, `nbFreeEDockMin`, `nbFreeEDockMax`, `nbFreeEDockMoyenne`, `nbEDock`, `nbBikeOverflowMin`, `nbBikeOverflowMax`, `nbBikeOverflowMoyenne`, `nbEBikeOverflowMin`, `nbEBikeOverflowMax`, `nbEBikeOverflowMoyenne`, `maxBikeOverflow`, nbEDockPerdusMin, nbEDockPerdusMax, nbEDockPerdusMoyenne) VALUES \
(NULL, '+str(codeStation)+', "'+dateConso+'", '+str(dureeConso)+', '+str(valeurs['nbBike']['min'])+', '+str(valeurs['nbBike']['max'])+', '+str(valeurs['nbBike']['moyenne'])+', '+str(valeurs['nbBike']['pris'])+', '+str(valeurs['nbBike']['remis'])+', '+str(valeurs['nbEBike']['min'])+', '+str(valeurs['nbEBike']['max'])+', '+str(valeurs['nbEBike']['moyenne'])+', '+str(valeurs['nbEBike']['pris'])+', '+str(valeurs['nbEBike']['remis'])+', '+str(valeurs['nbFreeEDock']['min'])+', '+str(valeurs['nbFreeEDock']['max'])+', '+str(valeurs['nbFreeEDock']['moyenne'])+', '+str(valeurs['nbEDock'])+', '+str(valeurs['nbBikeOverflow']['min'])+', '+str(valeurs['nbBikeOverflow']['max'])+', '+str(valeurs['nbBikeOverflow']['moyenne'])+', '+str(valeurs['nbEBikeOverflow']['min'])+', '+str(valeurs['nbEBikeOverflow']['max'])+', '+str(valeurs['nbEBikeOverflow']['moyenne'])+', '+str(valeurs['maxBikeOverflow'])+', '+str(valeurs['nbEDockPerdus']['min'])+', '+str(valeurs['nbEDockPerdus']['max'])+', '+str(valeurs['nbEDockPerdus']['moyenne'])+')')
def calculerResumeOfResume(dateConsoDT, dureeConsoOrigine, dureeConsoFinale):
dateConso = dateConsoDT.strftime("%Y-%m-%d %H:%M:%S")
......@@ -90,7 +97,7 @@ def calculerResumeOfResume(dateConsoDT, dureeConsoOrigine, dureeConsoFinale):
dateConsoFin = finConso.strftime("%Y-%m-%d %H:%M:%S")
#On récupère les conso
proprietes = ['nbBikeMin', 'nbBikeMax', 'nbBikeMoyenne', 'nbBikePris', 'nbBikeRendu', 'nbEBikeMin', 'nbEBikeMax', 'nbEBikeMoyenne', 'nbEBikePris', 'nbEBikeRendu', 'nbFreeEDockMin', 'nbFreeEDockMax', 'nbFreeEDockMoyenne', 'nbEDock', 'nbBikeOverflowMin', 'nbBikeOverflowMax', 'nbBikeOverflowMoyenne', 'nbEBikeOverflowMin', 'nbEBikeOverflowMax', 'nbEBikeOverflowMoyenne', 'maxBikeOverflow']
proprietes = ['nbBikeMin', 'nbBikeMax', 'nbBikeMoyenne', 'nbBikePris', 'nbBikeRendu', 'nbEBikeMin', 'nbEBikeMax', 'nbEBikeMoyenne', 'nbEBikePris', 'nbEBikeRendu', 'nbFreeEDockMin', 'nbFreeEDockMax', 'nbFreeEDockMoyenne', 'nbEDock', 'nbBikeOverflowMin', 'nbBikeOverflowMax', 'nbBikeOverflowMoyenne', 'nbEBikeOverflowMin', 'nbEBikeOverflowMax', 'nbEBikeOverflowMoyenne', 'maxBikeOverflow', 'nbEDockPerdusMin', 'nbEDockPerdusMax', 'nbEDockPerdusMoyenne']
mysql = getMysqlConnection()
requete = mysql.cursor()
......@@ -202,7 +209,7 @@ def calculerResumeConso(dateConsoDT, dureeConso):
data = info['data']
bikeList[cle]['moyenne'] = sum(data) / max(len(data), 1)
if len(bikeList) > 0:
if len(bikeList) > 2: #S'il y a plus que simplement le nombre de stations
valeurs = bikeList
requete = mysql.cursor()
#nbEDock peut être null
......@@ -272,4 +279,22 @@ def debuterCalculResumeOfResumeConso(periodeOrigine, periodeFinale, dateCourante
dateConsoDT = dateCourante - datetime.timedelta(minutes=periodeFinale)
debutPeriodeMinute = (dateConsoDT.hour * 60 + dateConsoDT.minute) % periodeFinale
dateConsoDT = dateConsoDT.replace(microsecond = 0, second = 0) - datetime.timedelta(minutes=debutPeriodeMinute)
calculerResumeOfResumeConso(dateConsoDT, periodeOrigine, periodeFinale)
\ No newline at end of file
calculerResumeOfResumeConso(dateConsoDT, periodeOrigine, periodeFinale)
def calculerToutResume(dateMin, dateMax):
periodes = [5, 15, 60, 360]
periodePrecedente = 0
for periode in periodes:
dateCourante = dateMin
print("-> Début période "+ str(periode))
while dateCourante + datetime.timedelta(minutes=periode) <= dateMax:
print("Période " + str(periode)+'; date = '+str(dateCourante))
dateCourante = dateCourante + datetime.timedelta(minutes=periode) #on met la date courante à la fin de la période, car, ça calcule à rebours
if periode == 5:
debuterCalculResume(periode, dateCourante)
debuterCalculResumeConso(periode, dateCourante)
else:
debuterCalculResumeOfResume(periodePrecedente, periode, dateCourante)
debuterCalculResumeOfResumeConso(periodePrecedente, periode, dateCourante)
periodePrecedente = periode
print("-> Fin période "+ str(periode))
\ No newline at end of file
......@@ -5,16 +5,25 @@ require_once('libs/Smarty.class.php');
$smarty = new Smarty();
$periodeEnCours = new DateTime("-1day");
$h = intval($periodeEnCours->format('G'));
if(isset($_GET['date']))
{
$periodeEnCours = new DateTime($_GET['date']);
$h = 0;
} else {
$periodeEnCours = new DateTime("-1day");
$h = intval($periodeEnCours->format('G'));
}
$periodeEnCours->setTime($h - ($h % 6), 0);
$filtreDate = $periodeEnCours->format('Y-m-d H:i:s');
$finPeriode = clone $periodeEnCours;
$finPeriode->add(new DateInterval('P1D'));
$filtreFinDate = $finPeriode->format('Y-m-d H:i:s');
//On récupère toutes les resume
$requete = $pdo->query('SELECT r.*, s.insee
FROM resumeStatus r
INNER JOIN stations s ON s.code = r.code
WHERE r.date >= "'.$filtreDate.'" AND r.duree = 360 ORDER BY r.code, r.date ASC');
WHERE r.date >= "'.$filtreDate.'" AND r.date < "'.$filtreFinDate.'" AND r.duree = 360 ORDER BY r.code, r.date ASC');
$resumes = $requete->fetchAll();
//On parcourt les résumes, et on agglomère par station
......@@ -25,9 +34,15 @@ foreach($resumes as $resume)
{
$codeStation = $resume['code'];
if(!isset($stations[$codeStation]))
$stations[$codeStation] = array('pris' => 0, 'rendu' => 0, 'insee' => $resume['insee']);
$stations[$codeStation]['pris'] += $resume['nbBikePris'] + $resume['nbEBikePris'];
$stations[$codeStation]['rendu'] += $resume['nbBikeRendu'] + $resume['nbEBikeRendu'];
$stations[$codeStation] = array('pris' => 0, 'rendu' => 0, 'Epris' => 0, 'Erendu' => 0, 'bornesPerdues' => [], 'bornesPerduesMax' => 0, 'insee' => $resume['insee']);
$stations[$codeStation]['pris'] += $resume['nbBikePris'];
$stations[$codeStation]['Epris'] += $resume['nbEBikePris'];
$stations[$codeStation]['rendu'] += $resume['nbBikeRendu'];
$stations[$codeStation]['Erendu'] += $resume['nbEBikeRendu'];
if(isset($resume['nbEDockPerdusMoyenne']) && !is_null($resume['nbEDockPerdusMoyenne']))
$stations[$codeStation]['bornesPerdues'][] = $resume['nbEDockPerdusMoyenne'];
if(isset($resume['nbEDockPerdusMax']) && !is_null($resume['nbEDockPerdusMax']))
$stations[$codeStation]['bornesPerduesMax'] = max($resume['nbEDockPerdusMax'], $stations[$codeStation]['bornesPerduesMax']);
if($minDate == null || $minDate > $resume['date'])
$minDate = $resume['date'];
......@@ -57,6 +72,23 @@ $nomDept = array(
94 => 'Val-de-Marne',
95 => 'Val-d\'Oise'
);
$stationsSansMouvement = 0;
$totalPris = 0;
$totalEPris = 0;
$totalRendu = 0;
$totalERendu = 0;
$totalMoyenneBornesPerdues = 0;
$totalMaxBornesPerdues = 0;
$depts = array();
$nomDept = array(
75 => 'Paris',
78 => 'Yvelines',
91 => 'Essonne',
92 => 'Hauts-de-Seine',
93 => 'Seine-Saint-Denis',
94 => 'Val-de-Marne',
95 => 'Val-d\'Oise'
);
foreach($stations as $code => $stats)
{
if($stats['pris'] + $stats['rendu'] == 0)
......@@ -65,6 +97,8 @@ foreach($stations as $code => $stats)
{
$totalPris += $stats['pris'];
$totalRendu += $stats['rendu'];
$totalEPris += $stats['Epris'];
$totalERendu += $stats['Erendu'];
}
$deptStation = floor($stats['insee'] / 1000);
......@@ -72,11 +106,22 @@ foreach($stations as $code => $stats)
$depts[$deptStation] = array('nb' => 1, 'nom' => (isset($nomDept[$deptStation]) ? $nomDept[$deptStation] : 'Inconnu'));
else
$depts[$deptStation]['nb']++;
if(count($stats['bornesPerdues']) > 0)
$totalMoyenneBornesPerdues += array_sum($stats['bornesPerdues']) / count($stats['bornesPerdues']);
$totalMaxBornesPerdues += $stats['bornesPerduesMax'];
}
$smarty->assign(array(
'totalPris' => $totalPris,
'totalRendu' => $totalRendu,
'totalPris' => number_format($totalPris + $totalEPris, 0, ',', ' '),
'totalPrisMecanique' => number_format($totalPris, 0, ',', ' '),
'totalPrisElectrique' => number_format($totalEPris, 0, ',', ' '),
'totalRendu' => number_format($totalRendu + $totalERendu, 0, ',', ' '),
'totalRenduMecanique' => number_format($totalRendu, 0, ',', ' '),
'totalRenduElectrique' => number_format($totalERendu, 0, ',', ' '),
'bornesPerduesMax' => $totalMaxBornesPerdues,
'bornesPerduesMoyenne' => number_format($totalMoyenneBornesPerdues, 2, ',', ' '),
'totalStation' => count($stations),
'stationsSansMouvement' => $stationsSansMouvement
));
......@@ -87,4 +132,4 @@ $smarty->assign(array(
$smarty->display('stats.tpl');
exit();
?>
\ No newline at end of file
?>
......@@ -6,10 +6,14 @@
</nav>
</header>
<div id="content">
<form method="GET" action="stats.php">
Date : <input name="date" type="date" /> <input type="submit" value="Filtrer" />
</form>
<p>Sur la dernière journée ({$minDate}{$maxDate}) :</p>
<ul>
<li>Au moins {$totalPris} vélos ont été retirés;</li>
<li>Au moins {$totalRendu} vélos ont été remis;</li>
<li>Au moins {$totalPris} vélos ont été retirés (dont {$totalPrisMecanique} mécaniques et {$totalPrisElectrique} électriques);</li>
<li>Au moins {$totalRendu} vélos ont été remis (dont {$totalRenduMecanique} mécaniques et {$totalRenduElectrique} électriques);</li>
<li>Nombre moyen de bornes inutilisables : {$bornesPerduesMoyenne} (maximum de la période : {$bornesPerduesMax}).</li>
<li>Nombre de stations sans mouvement : {$stationsSansMouvement}, sur un total de {$totalStation} stations.</li>
</ul>
<p>Nombre de stations par départements :</p>
......@@ -22,8 +26,10 @@
Ainsi, le système considèrera de la même façon si deux vélos ont été pris à une station que si dans la même minute
quatres vélos ont été pris et deux rendus.
Les nombres ainsi obtenus ne sont que des minimums, et comprennent à la fois les locations comme les actions de régulations.<br />
Les bornes inutilisables correspond au calcul pour chaque station : (nombre de bornes total) - (nombre de vélos mécaniques + nombre de vélos
électriques + nombres de bornes disponibles)<br />
Le nombre de stations ne différencie pas les stations en travaux des stations ouvertes.
</p>
{include file="credits.tpl"}
</div>
{include file="footer.tpl"}
\ No newline at end of file
{include file="footer.tpl"}
<?php
require_once('config.php');
include_once('functions.php');
require_once('libs/Smarty.class.php');
//$smarty = new Smarty();
$minPeriode = new DateTime("2018-01-08");
$maxPeriode = new DateTime("2018-02-02");
$periodeEnCours = $minPeriode;
while($periodeEnCours < $maxPeriode)
{
$h = intval($periodeEnCours->format('G'));
$periodeEnCours->setTime($h - ($h % 6), 0);
$filtreDate = $periodeEnCours->format('Y-m-d H:i:s');
$maxDate = clone $periodeEnCours;
$maxDate->add(new DateInterval('P1D'));
$filtreMaxDate = $maxDate->format('Y-m-d H:i:s');
//On récupère toutes les resume
$requete = $pdo->query('SELECT r.*, s.insee
FROM resumeStatus r
INNER JOIN stations s ON s.code = r.code
WHERE r.date >= "'.$filtreDate.'" AND r.date < "'.$filtreMaxDate.'" AND r.duree = 360 ORDER BY r.code, r.date ASC');
$resumes = $requete->fetchAll();
//On parcourt les résumes, et on agglomère par station
$stations = array();
$minDate = null;
$maxDate = null;
foreach($resumes as $resume)
{
$codeStation = $resume['code'];
if(!isset($stations[$codeStation]))
$stations[$codeStation] = array('pris' => 0, 'rendu' => 0, 'Epris' => 0, 'Erendu' => 0, 'bornesPerdues' => [], 'bornesPerduesMax' => 0, 'insee' => $resume['insee']);
$stations[$codeStation]['pris'] += $resume['nbBikePris'];
$stations[$codeStation]['Epris'] += $resume['nbEBikePris'];
$stations[$codeStation]['rendu'] += $resume['nbBikeRendu'];
$stations[$codeStation]['Erendu'] += $resume['nbEBikeRendu'];
if(isset($resume['nbEDockPerdusMoyenne']) && !is_null($resume['nbEDockPerdusMoyenne']))
$stations[$codeStation]['bornesPerdues'][] = $resume['nbEDockPerdusMoyenne'];
if(isset($resume['nbEDockPerdusMax']) && !is_null($resume['nbEDockPerdusMax']))
$stations[$codeStation]['bornesPerduesMax'] = max($resume['nbEDockPerdusMax'], $stations[$codeStation]['bornesPerduesMax']);
if($minDate == null || $minDate > $resume['date'])
$minDate = $resume['date'];
if($maxDate == null || $maxDate < $resume['date'])
$maxDate = $resume['date'];
}
$minDateObj = new DateTime($minDate);
$maxDateObj = new DateTime($maxDate);
$maxDateObj->add(new DateInterval('PT6H')); //On ajoute 6 heures pour avoir la fin de la période
/*$smarty->assign(array(
'minDate' => $minDateObj->format('d/m à H:i'),
'maxDate' => $maxDateObj->format('d/m à H:i')
));*/
//On fait les stats sur les stations
$stationsSansMouvement = 0;
$totalPris = 0;
$totalEPris = 0;
$totalRendu = 0;
$totalERendu = 0;
$totalMoyenneBornesPerdues = 0;
$totalMaxBornesPerdues = 0;
$depts = array();
$nomDept = array(
75 => 'Paris',
78 => 'Yvelines',
91 => 'Essonne',
92 => 'Hauts-de-Seine',
93 => 'Seine-Saint-Denis',
94 => 'Val-de-Marne',
95 => 'Val-d\'Oise'
);
foreach($stations as $code => $stats)
{
if($stats['pris'] + $stats['rendu'] == 0)
$stationsSansMouvement++;
else
{
$totalPris += $stats['pris'];
$totalRendu += $stats['rendu'];
$totalEPris += $stats['Epris'];
$totalERendu += $stats['Erendu'];
}
$deptStation = floor($stats['insee'] / 1000);
if(!isset($depts[$deptStation]))
$depts[$deptStation] = array('nb' => 1, 'nom' => (isset($nomDept[$deptStation]) ? $nomDept[$deptStation] : 'Inconnu'));
else
$depts[$deptStation]['nb']++;
if(count($stats['bornesPerdues']) > 0)
$totalMoyenneBornesPerdues += array_sum($stats['bornesPerdues']) / count($stats['bornesPerdues']);
$totalMaxBornesPerdues += $stats['bornesPerduesMax'];
}
echo $periodeEnCours->format('d/m').': Retirés : '.($totalPris + $totalEPris).' (mécanique : '.$totalPris.' | électrique : '.$totalEPris.'); '.
'Rendus : '.($totalRendu + $totalERendu).' (mécanique : '.$totalRendu.' | électrique : '.$totalERendu.'); '.
'Bornes inutilisables : '.round($totalMoyenneBornesPerdues, 2).' (max : '.$totalMaxBornesPerdues.'); Stations sans mouvements : '.$stationsSansMouvement.'/'.count($stations)."<br />";
/*$smarty->assign(array(
'totalPris' => $totalPris,
'totalRendu' => $totalRendu,
'totalStation' => count($stations),
'stationsSansMouvement' => $stationsSansMouvement
));
$smarty->assign(array(
'departements' => $depts
));*/
$periodeEnCours->add(new DateInterval('P1D'));
}
//$smarty->display('stats.tpl');
exit();
?>
\ No newline at end of file
......@@ -69,7 +69,10 @@ CREATE TABLE `resumeStatus` (
`nbEBikeOverflowMin` int(3) NOT NULL,
`nbEBikeOverflowMax` int(3) NOT NULL,
`nbEBikeOverflowMoyenne` decimal(5,2) NOT NULL,
`maxBikeOverflow` int(3) NOT NULL
`maxBikeOverflow` int(3) NOT NULL,
`nbEDockPerdusMin` int(3) DEFAULT NULL,
`nbEDockPerdusMax` int(3) DEFAULT NULL,
`nbEDockPerdusMoyenne` decimal(5,2) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
-- --------------------------------------------------------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment