added some more data functions.

- AQDG_Data_DayAverage() average data over days
- AQDG_Data_MinutesAverage() average data over variable minutes
This commit is contained in:
Martin Preuss
2025-10-01 22:27:00 +02:00
parent 27f4919ef3
commit bac8537939
2 changed files with 134 additions and 3 deletions

View File

@@ -15,6 +15,8 @@
#include <gwenhywfar/gwendate.h>
#include <gwenhywfar/debug.h>
#include <math.h>
AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_DaySums(const AQDG_GRAPH_DATAPAIR_LIST *dpList)
@@ -97,7 +99,6 @@ AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MonthSums(const AQDG_GRAPH_DATAPAIR_LIST *dp
AQDG_Graph_DataPair_SetValueX(newDp, GWEN_Date_toLocalTime(lastDate));
AQDG_Graph_DataPair_SetValueY(newDp, AQDG_Graph_DataPair_GetValueY(dp));
AQDG_Graph_DataPair_List_Add(newDp, newList);
DBG_ERROR(NULL, "Added first value: %.2f", AQDG_Graph_DataPair_GetValueY(dp));
}
else {
GWEN_DATE *dt;
@@ -114,7 +115,6 @@ AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MonthSums(const AQDG_GRAPH_DATAPAIR_LIST *dp
AQDG_Graph_DataPair_SetValueX(newDp, GWEN_Date_toLocalTime(lastDate));
AQDG_Graph_DataPair_SetValueY(newDp, AQDG_Graph_DataPair_GetValueY(dp));
AQDG_Graph_DataPair_List_Add(newDp, newList);
DBG_ERROR(NULL, "Added value: %.2f", AQDG_Graph_DataPair_GetValueY(dp));
}
else {
double v2;
@@ -122,7 +122,6 @@ AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MonthSums(const AQDG_GRAPH_DATAPAIR_LIST *dp
/* add to existing date value */
v2=AQDG_Graph_DataPair_GetValueY(newDp);
AQDG_Graph_DataPair_SetValueY(newDp, v2+v);
DBG_ERROR(NULL, "Added %.2f to existing value: %.2f", v, v2);
GWEN_Date_free(newDate);
}
}
@@ -136,3 +135,132 @@ AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MonthSums(const AQDG_GRAPH_DATAPAIR_LIST *dp
AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_DayAverage(const AQDG_GRAPH_DATAPAIR_LIST *dpList)
{
if (dpList && AQDG_Graph_DataPair_List_GetCount(dpList)) {
AQDG_GRAPH_DATAPAIR_LIST *newList;
const AQDG_GRAPH_DATAPAIR *dp;
GWEN_DATE *currentDate=NULL;
double currentSum;
int currentCount;
newList=AQDG_Graph_DataPair_List_new();
dp=AQDG_Graph_DataPair_List_First(dpList);
while(dp) {
if (currentDate==NULL) {
/* first value */
currentDate=GWEN_Date_fromLocalTime(AQDG_Graph_DataPair_GetValueX(dp));
currentSum=AQDG_Graph_DataPair_GetValueY(dp);
currentCount=1;
}
else {
GWEN_DATE *newDate;
newDate=GWEN_Date_fromLocalTime(AQDG_Graph_DataPair_GetValueX(dp));
if (GWEN_Date_Compare(newDate, currentDate)!=0) {
AQDG_GRAPH_DATAPAIR *newDp;
/* new date */
newDp=AQDG_Graph_DataPair_new();
AQDG_Graph_DataPair_SetValueX(newDp, GWEN_Date_toLocalTime(currentDate));
AQDG_Graph_DataPair_SetValueY(newDp, currentSum/(double)currentCount);
AQDG_Graph_DataPair_List_Add(newDp, newList);
currentSum=AQDG_Graph_DataPair_GetValueY(dp);
currentCount=1;
GWEN_Date_free(currentDate);
currentDate=newDate;
}
else {
/* add to existing date value */
currentSum+=AQDG_Graph_DataPair_GetValueY(dp);
currentCount++;
GWEN_Date_free(newDate);
}
}
dp=AQDG_Graph_DataPair_List_Next(dp);
}
if (currentCount && currentDate) {
AQDG_GRAPH_DATAPAIR *newDp;
/* store data for last value */
newDp=AQDG_Graph_DataPair_new();
AQDG_Graph_DataPair_SetValueX(newDp, GWEN_Date_toLocalTime(currentDate));
AQDG_Graph_DataPair_SetValueY(newDp, currentSum/(double)currentCount);
AQDG_Graph_DataPair_List_Add(newDp, newList);
}
GWEN_Date_free(currentDate);
return newList;
}
return NULL;
}
AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MinutesAverage(const AQDG_GRAPH_DATAPAIR_LIST *dpList, int minutes)
{
if (dpList && AQDG_Graph_DataPair_List_GetCount(dpList)) {
AQDG_GRAPH_DATAPAIR_LIST *newList;
const AQDG_GRAPH_DATAPAIR *dp;
double currentTimeMinutes=0;
double currentTimeValue;
double currentSum;
int currentCount=0;
newList=AQDG_Graph_DataPair_List_new();
dp=AQDG_Graph_DataPair_List_First(dpList);
while(dp) {
if (currentCount==0) {
/* first value */
currentTimeValue=AQDG_Graph_DataPair_GetValueX(dp);
currentTimeMinutes=floor(currentTimeValue/60.0);
currentSum=AQDG_Graph_DataPair_GetValueY(dp);
currentCount=1;
}
else {
double newTimeValue;
double newTimeMinutes;
newTimeValue=AQDG_Graph_DataPair_GetValueX(dp);
newTimeMinutes=floor(newTimeValue/60.0);
if ((newTimeMinutes-currentTimeMinutes)<(double)minutes) {
/* add to existing sum */
currentSum+=AQDG_Graph_DataPair_GetValueY(dp);
currentCount++;
}
else {
AQDG_GRAPH_DATAPAIR *newDp;
/* new date */
newDp=AQDG_Graph_DataPair_new();
AQDG_Graph_DataPair_SetValueX(newDp, (floor(currentTimeMinutes/(double) minutes)*(double) minutes)*60.0);
// AQDG_Graph_DataPair_SetValueX(newDp, floor(currentTimeMinutes*60.0));
AQDG_Graph_DataPair_SetValueY(newDp, currentSum/(double)currentCount);
AQDG_Graph_DataPair_List_Add(newDp, newList);
currentSum=AQDG_Graph_DataPair_GetValueY(dp);
currentCount=1;
currentTimeValue=newTimeValue;
currentTimeMinutes=newTimeMinutes;
}
}
dp=AQDG_Graph_DataPair_List_Next(dp);
}
if (currentCount) {
AQDG_GRAPH_DATAPAIR *newDp;
/* store data for last value */
newDp=AQDG_Graph_DataPair_new();
AQDG_Graph_DataPair_SetValueX(newDp, (floor(currentTimeMinutes/(double) minutes)*(double) minutes)*60.0);
// AQDG_Graph_DataPair_SetValueX(newDp, floor(currentTimeMinutes*60.0));
AQDG_Graph_DataPair_SetValueY(newDp, currentSum/(double)currentCount);
AQDG_Graph_DataPair_List_Add(newDp, newList);
}
return newList;
}
return NULL;
}

View File

@@ -16,6 +16,9 @@
AQDG_API AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_DaySums(const AQDG_GRAPH_DATAPAIR_LIST *dpList);
AQDG_API AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MonthSums(const AQDG_GRAPH_DATAPAIR_LIST *dpList);
AQDG_API AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_DayAverage(const AQDG_GRAPH_DATAPAIR_LIST *dpList);
AQDG_API AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MinutesAverage(const AQDG_GRAPH_DATAPAIR_LIST *dpList, int minutes);