Initial adjustment for calories burned based on weight
This commit is contained in:
parent
b856ed01cd
commit
1ad530127e
@ -131,11 +131,13 @@ async fn svg_calorie_intake(
|
||||
|
||||
let nutrition_val_promise = Nutrition::get_nutrition_hashmap(state.sql_pool.clone());
|
||||
let purchases_val_promise = Purchase::get_purchase_rows(state.sql_pool.clone());
|
||||
let weight_val_promise = Weight::get_weight_rows(state.sql_pool.clone());
|
||||
|
||||
let nutrition_val = nutrition_val_promise.await?;
|
||||
let purchases_val = purchases_val_promise.await?;
|
||||
let weight_val = weight_val_promise.await?;
|
||||
|
||||
let plotfun = math::plot_calories_per_day(nutrition_val, purchases_val);
|
||||
let plotfun = math::plot_calories_per_day(nutrition_val, purchases_val, weight_val);
|
||||
Ok(plotting::SVGPlotter::plot(640, 480, plotfun))
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,8 @@ use time::*;
|
||||
const MEALS_PER_DAY: f32 = 2.3;
|
||||
const SMOOTHING_DAYS: usize = 21;
|
||||
const CALORIES_BURNED_PER_DAY: f32 = 2270.;
|
||||
const CALORIES_BURNED_PER_DAY_BASE_WEIGHT: f32 = 83.;
|
||||
const CALORIES_BURNED_LESS_PER_DAY_PER_KG: f32 = 12.5;
|
||||
|
||||
fn time_date_to_chrono_naive_date(d: Date) -> chrono::NaiveDate {
|
||||
chrono::NaiveDate::from_ymd_opt(d.year(), d.month() as u32, d.day() as u32).unwrap()
|
||||
@ -82,6 +84,7 @@ fn calculate_calories_per_day(
|
||||
pub fn plot_calories_per_day(
|
||||
nutrition_map: HashMap<u32, Nutrition>,
|
||||
purchases: Vec<my_structs::Purchase>,
|
||||
weight: Vec<my_structs::Weight>,
|
||||
) -> plotting::SVGPlotFun {
|
||||
let (mindate, calorie_days) = calculate_calories_per_day(nutrition_map, purchases);
|
||||
|
||||
@ -99,6 +102,28 @@ pub fn plot_calories_per_day(
|
||||
.reduce(|a, b| a.max(b))
|
||||
.unwrap();
|
||||
|
||||
let weight_dates: Vec<f32> = weight
|
||||
.iter()
|
||||
.map(|w| (w.datetime.date() - mindate).whole_days() as f32)
|
||||
.collect();
|
||||
let weight_values: Vec<f32> = weight.iter().map(|w| w.weight).collect();
|
||||
let weight_days = interp_slice(
|
||||
&weight_dates,
|
||||
&weight_values,
|
||||
&(0..calorie_days.len())
|
||||
.map(|x| x as f32)
|
||||
.collect::<Vec<f32>>(),
|
||||
&InterpMode::FirstLast,
|
||||
);
|
||||
let calories_burned_per_day_days: Vec<f32> = weight_days
|
||||
.iter()
|
||||
.map(|weight| {
|
||||
CALORIES_BURNED_PER_DAY
|
||||
+ CALORIES_BURNED_LESS_PER_DAY_PER_KG
|
||||
* (weight - CALORIES_BURNED_PER_DAY_BASE_WEIGHT)
|
||||
})
|
||||
.collect();
|
||||
|
||||
let plotfun = Box::new(move |root: plotting::SVGPlotRoot| {
|
||||
root.fill(&WHITE).unwrap();
|
||||
let mut chart = ChartBuilder::on(&root)
|
||||
@ -128,10 +153,17 @@ pub fn plot_calories_per_day(
|
||||
|
||||
chart
|
||||
.draw_series(LineSeries::new(
|
||||
vec![
|
||||
(mindate_chrono, CALORIES_BURNED_PER_DAY),
|
||||
(maxdate_chrono, CALORIES_BURNED_PER_DAY),
|
||||
],
|
||||
calories_burned_per_day_days
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(i, cal)| {
|
||||
(
|
||||
mindate_chrono
|
||||
.checked_add_days(chrono::Days::new(i.try_into().unwrap()))
|
||||
.unwrap(),
|
||||
*cal,
|
||||
)
|
||||
}),
|
||||
BLACK.stroke_width(2),
|
||||
))
|
||||
.unwrap()
|
||||
@ -206,7 +238,11 @@ pub fn plot_weight_loss(
|
||||
.iter()
|
||||
.enumerate()
|
||||
.scan(0., |deficit, (i, &calories)| {
|
||||
*deficit += calories - CALORIES_BURNED_PER_DAY - running_days[i];
|
||||
*deficit += calories
|
||||
- (CALORIES_BURNED_PER_DAY
|
||||
+ CALORIES_BURNED_LESS_PER_DAY_PER_KG
|
||||
* (weight_days[i] - CALORIES_BURNED_PER_DAY_BASE_WEIGHT))
|
||||
- running_days[i];
|
||||
Some(*deficit)
|
||||
})
|
||||
.collect();
|
||||
|
Loading…
Reference in New Issue
Block a user