first step for statistics

This commit is contained in:
Joachim Lusiardi 2016-07-10 13:40:49 +02:00
parent 43e3f9c98b
commit 4ea42a7efd
2 changed files with 160 additions and 150 deletions

View File

@ -17,129 +17,94 @@
<h3>{{vehicle.name}}</h3> <h3>{{vehicle.name}}</h3>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-bordered table-condensed"> <table class="table table-striped table-bordered table-condensed">
<tr>
<th>Number of Pitstops:</th>
<td>{{ vehicle.pitstop_count }}</td>
</tr>
<tr> <tr>
<th>Logged Distance:</th> <th>Logged Distance:</th>
<td>{{ vehicle.overall_distance | round(2) }} km</td> <td>{{ vehicle.overall_distance | round(2) }} km</td>
</tr> </tr>
<tr>
<th>Average Distance:</th>
<td>{{ vehicle.average_distance | round(2) }} km</td>
</tr>
<tr>
<th>Litres fuelled:</th>
<td>{{ vehicle.overall_litres | round(2) }} l</td>
</tr>
<tr>
<th>Average Litres fuelled:</th>
<td>{{ vehicle.average_litres_fuelled | round(2) }} l</td>
</tr>
<tr>
<th>Average Litres used:</th>
<td>{{ vehicle.average_litres_used | round(2) }} l/100km</td>
</tr>
<tr> <tr>
<th>Logged Costs:</th> <th>Logged Costs:</th>
<td>{{ vehicle.overall_costs | round(2) }} €</td> <td>{{ vehicle.overall_costs | round(2) }} €</td>
</tr> </tr>
<tr>
<th>Average Costs per Litre:</th>
<td>{{ vehicle.average_costs_per_litre | round(2) }} €/l</td>
</tr>
</table> </table>
</div> </div>
<ul id="charts_tabs" class="nav nav-tabs" data-tabs="tabs">
<li class="active"> <ul id="consumable_tabs" class="nav nav-tabs" data-tabs="tabs">
<a href="#v{{vehicle.id}}_c3" id="i{{vehicle.id}}_c3" data-toggle="tab"> {% for consumable in vehicle.consumables %}
Consumption <li class="{% if loop.first %}active{% endif %}">
</a> <a href="#v{{vehicle.id}}_c{{consumable.id}}" id="i{{vehicle.id}}_c{{consumable.id}}" data-toggle="tab" >
</li> {{ consumable.name }}
<li> </a>
<a href="#v{{vehicle.id}}_c1" id="i{{vehicle.id}}_c1" data-toggle="tab"> </li>
Fuelled litres {% endfor %}
</a> </ul>
</li> <div id="consumable_tabs-content" class="tab-content">
<li> {% for consumable in vehicle.consumables %}
<a href="#v{{vehicle.id}}_c2" id="i{{vehicle.id}}_c2" data-toggle="tab"> <div class="tab-pane {% if loop.first %}active{% endif %}" id="v{{vehicle.id}}_c{{consumable.id}}">
Odometer <table class="table table-striped table-bordered table-condensed">
</a> <tr>
</li> <th>Average Distance:</th>
<li> <td>{{ consumable.average_distance | round(2) }} km</td>
<a href="#v{{vehicle.id}}_c4" id="i{{vehicle.id}}_c4" data-toggle="tab"> </tr>
Costs per litre <tr>
</a> <th>Amount fuelled:</th>
</li> <td>{{ consumable.amount | round(2) }} {{ consumable.unit }}</td>
<li> </tr>
<a href="#v{{vehicle.id}}_c5" id="i{{vehicle.id}}_c5" data-toggle="tab"> <tr>
Costs <th>Average Amount fuelled:</th>
</a> <td>{{ consumable.average_amount_fuelled | round(2) }} {{ consumable.unit }}</td>
</li> </tr>
</ul> <tr>
<div id="charts_tabs-content" class="tab-content"> <th>Average Amount used:</th>
<div class="tab-pane active" id="v{{vehicle.id}}_c3"> <td>{{ consumable.average_amount_used | round(2) }} {{ consumable.unit }}/100km</td>
{% if vehicle.pitstop_count > 1 %} </tr>
<div id="averageUsageDiv{{vehicle.id}}" style="width:100%; height:500px;"></div> </table>
<script type="text/javascript"> </div>
{{ chartScript('averageUsageDiv'+vehicle.id|str, vehicle.average_litres, 'l/100 km') }} {% endfor %}
</script> </div>
{% else %}
<div class="alert alert-warning" role="alert"> <ul id="charts_tabs" class="nav nav-tabs" data-tabs="tabs">
not enough data: <a href="{{ url_for('select_consumable_for_new_pitstop', vid=vehicle.id) }}">log a pitstop</a>? <li class="active">
</div> <a href="#v{{vehicle.id}}_codometer" id="i{{vehicle.id}}_codometer" data-toggle="tab" >
{% endif %} Odometer
</div> </a>
<div class="tab-pane " id="v{{vehicle.id}}_c1"> </li>
{% if vehicle.pitstop_count > 0 %} {% for consumable in vehicle.consumables %}
<div id="fuelledChartDiv{{vehicle.id}}" style="width:100%; height:500px;"></div> <li>
<script type="text/javascript"> <a href="#v{{vehicle.id}}_c{{consumable.id}}_consumption" id="i{{vehicle.id}}_c{{consumable.id}}_consumption" data-toggle="tab" >
{{ chartScript('fuelledChartDiv'+vehicle.id|str, vehicle.litres, 'l') }} {{ consumable.name }} consumption
</script> </a>
{% else %} </li>
<div class="alert alert-warning" role="alert"> {% endfor %}
not enough data: <a href="{{ url_for('select_consumable_for_new_pitstop', vid=vehicle.id) }}">log a pitstop</a>? </ul>
</div> <div id="charts_tabs-content" class="tab-content">
{% endif %} <div class="tab-pane active" id="v{{vehicle.id}}_codometer">
</div> {% if vehicle.odometers|length > 0 %}
<div class="tab-pane " id="v{{vehicle.id}}_c2"> <div id="odometerChartDiv{{vehicle.id}}" style="width:100%; height:500px;"></div>
{% if vehicle.pitstop_count > 0 %} <script type="text/javascript">
<div id="odometerChartDiv{{vehicle.id}}" style="width:100%; height:500px;"></div> {{ chartScript('odometerChartDiv'+vehicle.id|str, vehicle.odometers, 'km') }}
<script type="text/javascript"> </script>
{{ chartScript('odometerChartDiv'+vehicle.id|str, vehicle.odometers, 'km') }} {% else %}
</script> <div class="alert alert-warning" role="alert">
{% else %} not enough data: <a href="{{ url_for('select_consumable_for_new_pitstop', vid=vehicle.id) }}">log a pitstop</a>?
<div class="alert alert-warning" role="alert"> </div>
not enough data: <a href="{{ url_for('select_consumable_for_new_pitstop', vid=vehicle.id) }}">log a pitstop</a>? {% endif %}
</div> </div>
{% endif %} {% for consumable in vehicle.consumables %}
</div> <div class="tab-pane active" id="v{{vehicle.id}}_c{{consumable.id}}_consumption">
<div class="tab-pane " id="v{{vehicle.id}}_c4"> {% if consumable.average_amount|length > 0 %}
{% if vehicle.pitstop_count > 0 %} <div id="consumptionChartDiv{{vehicle.id}}_c{{consumable.id}}" style="width:100%; height:500px;"></div>
<div id="costsPerLitre{{vehicle.id}}" style="width:100%; height:500px;"></div> <script type="text/javascript">
<script type="text/javascript"> {{ chartScript('consumptionChartDiv'+vehicle.id|str+'_c'+consumable.id|str, consumable.average_amount, consumable.unit+'/100km') }}
{{ chartScript('costsPerLitre'+vehicle.id|str, vehicle.costsPerLitre, '€/l') }} </script>
</script> {% else %}
{% else %} <div class="alert alert-warning" role="alert">
<div class="alert alert-warning" role="alert"> not enough data: <a href="{{ url_for('create_pit_stop_form', vid=vehicle.id, cid=consumable.id) }}">log a pitstop</a>?
not enough data: <a href="{{ url_for('select_consumable_for_new_pitstop', vid=vehicle.id) }}">log a pitstop</a>? </div>
</div> {% endif %}
{% endif %} </div>
</div> {% endfor %}
<div class="tab-pane " id="v{{vehicle.id}}_c5"> </div>
{% if vehicle.pitstop_count > 0 %}
<div id="costs{{vehicle.id}}" style="width:100%; height:500px;"></div>
<script type="text/javascript">
{{ chartScript('costs'+vehicle.id|str, vehicle.costs, '€') }}
</script>
{% else %}
<div class="alert alert-warning" role="alert">
not enough data: <a href="{{ url_for('select_consumable_for_new_pitstop', vid=vehicle.id) }}">log a pitstop</a>?
</div>
{% endif %}
</div>
</div>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
@ -153,6 +118,18 @@
$('a[href="' + window.location.hash + '"]').click() $('a[href="' + window.location.hash + '"]').click()
} }
}); });
jQuery(document).ready(function ($) {
$('#consumable_tabs').tab();
if(window.location.hash != "") {
$('a[href="' + window.location.hash + '"]').click()
}
});
jQuery(document).ready(function ($) {
$('#charts_tabs').tab();
if(window.location.hash != "") {
$('a[href="' + window.location.hash + '"]').click()
}
});
</script> </script>

View File

@ -5,52 +5,85 @@ from dis import code_info
from rollerverbrauch.entities import \ from rollerverbrauch.entities import \
Pitstop Pitstop
class ConsumableStats:
def __init__(self, vehicle, consumable):
self.name = consumable.name
self.id = consumable.id
self.unit = consumable.unit
self.amount = 0
self.average_distance = 0
self.average_amount_fuelled = 0
self.average_amount_used = 0
self.average_amount = []
pitstops = [stop for stop in vehicle.pitstops if stop.consumable_id == consumable.id]
pitstop_count = len(pitstops)
if pitstop_count > 0:
for pitstop in pitstops:
self.amount += pitstop.amount
self.average_amount_fuelled = self.amount / pitstop_count
if pitstop_count > 1:
overall_distance = vehicle.pitstops[-1].odometer - vehicle.pitstops[0].odometer
self.average_distance = overall_distance / (pitstop_count - 1)
self.average_amount_used = 100 * (self.amount - pitstops[0].amount) / overall_distance
for index in range(1, pitstop_count):
last_ps = pitstops[index - 1]
current_ps = pitstops[index]
self.average_amount.append(
StatsEvent(
current_ps.date,
round(100 * current_ps.amount/(current_ps.odometer - last_ps.odometer), 2)))
class VehicleStats: class VehicleStats:
def __init__(self, vehicle): def __init__(self, vehicle):
self.name = vehicle.name self.name = vehicle.name
self.id = vehicle.id self.id = vehicle.id
self.pitstop_count = len(vehicle.pitstops)
self.overall_distance = 0 self.overall_distance = 0
self.average_distance = 0
self.overall_litres = 0
self.average_litres_fuelled = 0
self.average_litres_used = 0
self.litres = []
self.average_litres = []
self.odometers = []
self.costsPerLitre = []
self.costs = []
self.overall_costs = 0 self.overall_costs = 0
self.average_costs_per_litre = 0 self.consumables = []
cost_count = 0; self.odometers = []
if self.pitstop_count > 0: for consumable in vehicle.consumables:
for pitstop in vehicle.pitstops: self.consumables.append(ConsumableStats(vehicle, consumable))
self.overall_litres += pitstop.litres
self.litres.append(StatsEvent(pitstop.date, pitstop.litres))
self.odometers.append(StatsEvent(pitstop.date, pitstop.odometer))
self.costsPerLitre.append(StatsEvent(pitstop.date, pitstop.costs / pitstop.litres))
self.costs.append(StatsEvent(pitstop.date, pitstop.costs))
self.overall_costs += pitstop.costs
self.average_costs_per_litre += (pitstop.costs / pitstop.litres)
if pitstop.costs > 0:
cost_count += 1
self.average_litres_fuelled = self.overall_litres / self.pitstop_count
if cost_count > 0:
self.average_costs_per_litre = self.average_costs_per_litre / cost_count
else:
self.average_costs_per_litre = 0
if self.pitstop_count > 1: # self.overall_litres = 0
#
# self.litres = []
# self.average_litres = []
# self.costsPerLitre = []
# self.costs = []
# self.average_costs_per_litre = 0
# cost_count = 0;
pitstop_count = len(vehicle.pitstops)
if pitstop_count > 0:
for pitstop in vehicle.pitstops:
# self.overall_litres += pitstop.amount
# self.litres.append(StatsEvent(pitstop.date, pitstop.amount))
self.odometers.append(StatsEvent(pitstop.date, pitstop.odometer))
# self.costsPerLitre.append(StatsEvent(pitstop.date, pitstop.costs / pitstop.amount))
# self.costs.append(StatsEvent(pitstop.date, pitstop.costs))
self.overall_costs += pitstop.costs
# self.average_costs_per_litre += (pitstop.costs / pitstop.amount)
# if pitstop.costs > 0:
# cost_count += 1
# if cost_count > 0:
# self.average_costs_per_litre = self.average_costs_per_litre / cost_count
# else:
# self.average_costs_per_litre = 0
if pitstop_count > 1:
self.overall_distance = vehicle.pitstops[-1].odometer - vehicle.pitstops[0].odometer self.overall_distance = vehicle.pitstops[-1].odometer - vehicle.pitstops[0].odometer
self.average_distance = self.overall_distance / (self.pitstop_count - 1) # for index in range(1, self.pitstop_count):
self.average_litres_used = 100 * (self.overall_litres - vehicle.pitstops[0].litres) / self.overall_distance # last_ps = vehicle.pitstops[index - 1]
for index in range(1, self.pitstop_count): # current_ps = vehicle.pitstops[index]
last_ps = vehicle.pitstops[index - 1] # self.average_litres.append(StatsEvent(
current_ps = vehicle.pitstops[index] # current_ps.date,
self.average_litres.append(StatsEvent( # round(100 * current_ps.litres/(current_ps.odometer - last_ps.odometer), 2)))
current_ps.date,
round(100 * current_ps.litres/(current_ps.odometer - last_ps.odometer), 2)))
class StatsEvent: class StatsEvent: