Python measures(all=False, group="Body")

Similar to R measures returning a dict with a list for each
measure field in the requested group (Body or Hrv).
This commit is contained in:
Alejandro Martinez
2017-12-17 13:00:17 -03:00
parent bbfc4e44fe
commit f47607d725
6 changed files with 154 additions and 38 deletions

View File

@@ -759,7 +759,6 @@ Bindings::pmc(bool all, QString metric) const
} else {
unsigned int index=0;
QDate start = pmcData.start();
for(int k=0; k < pmcData.days(); k++) {
// day today
@@ -790,6 +789,79 @@ Bindings::pmc(bool all, QString metric) const
return NULL;
}
PyObject*
Bindings::measures(bool all, QString group) const
{
Context *context = python->contexts.value(threadid());
// return a dict with Measures data for all or the current season
if (context && context->athlete && context->athlete->measures) {
// import datetime if necessary
if (PyDateTimeAPI == NULL) PyDateTime_IMPORT;
// get the currently selected date range
DateRange range(context->currentDateRange());
// convert the group symbol to an index, default to Body=0
int groupIdx = context->athlete->measures->getGroupSymbols().indexOf(group);
if (groupIdx < 0) groupIdx = 0;
// Update range for all
if (all) {
range.from = context->athlete->measures->getStartDate(groupIdx);
range.to = context->athlete->measures->getEndDate(groupIdx);
}
// how many entries ?
unsigned int size = range.from.daysTo(range.to) + 1;
// returning a dict with
// date, field1, field2, ...
PyObject* ans = PyDict_New();
// DATE - 1 a day from start
PyObject* datelist = PyList_New(size);
QDate start = range.from;
for(unsigned int k=0; k<size; k++) {
QDate d = start.addDays(k);
PyList_SET_ITEM(datelist, k, PyDate_FromDate(d.year(), d.month(), d.day()));
}
// add to the dict
PyDict_SetItemString(ans, "date", datelist);
// MEASURES DATA
QStringList fieldSymbols = context->athlete->measures->getFieldSymbols(groupIdx);
QVector<PyObject*> fields(fieldSymbols.count());
for (int i=0; i<fieldSymbols.count(); i++)
fields[i] = PyList_New(size);
unsigned int index = 0;
for(int k=0; k < size; k++) {
// day today
if (start.addDays(k) >= range.from && start.addDays(k) <= range.to) {
for (int fieldIdx=0; fieldIdx<fields.count(); fieldIdx++)
PyList_SET_ITEM(fields[fieldIdx], index, PyFloat_FromDouble(context->athlete->measures->getFieldValue(groupIdx, start.addDays(k), fieldIdx)));
index++;
}
}
// add to the dict
for (int fieldIdx=0; fieldIdx<fields.count(); fieldIdx++)
PyDict_SetItemString(ans, fieldSymbols[fieldIdx].toUtf8().constData(), fields[fieldIdx]);
// return it
return ans;
}
// nothing to return
return NULL;
}
int
Bindings::webpage(QString url) const
{

View File

@@ -38,6 +38,7 @@ class Bindings {
PyObject* seasonMetrics(bool all=false, QString filter=QString(), bool compare=false) const;
PythonDataSeries *metrics(QString metric, bool all=false, QString filter=QString()) const;
PyObject* pmc(bool all=false, QString metric=QString("TSS")) const;
PyObject* measures(bool all=false, QString group=QString("Body")) const;
// working with meanmax data
PyObject* activityMeanmax(bool compare=false) const;

View File

@@ -127,6 +127,7 @@ public:
PyObject* seasonMetrics(bool all=false, QString filter=QString(), bool compare=false) /TransferBack/;
PythonDataSeries *metrics(QString metric, bool all=false, QString filter=QString()) /TransferBack/;
PyObject* pmc(bool all=false, QString metric=QString("TSS")) /TransferBack/;
PyObject* measures(bool all=false, QString group=QString("Body")) /TransferBack/;
// working with meanmax data
PyObject* activityMeanmax(bool compare=false) /TransferBack/;

View File

@@ -33,42 +33,46 @@
#define sipName_seriesLast &sipStrings_goldencheetah[117]
#define sipNameNr_seriesName 128
#define sipName_seriesName &sipStrings_goldencheetah[128]
#define sipNameNr_threadid 139
#define sipName_threadid &sipStrings_goldencheetah[139]
#define sipNameNr_Bindings 148
#define sipName_Bindings &sipStrings_goldencheetah[148]
#define sipNameNr_webpage 157
#define sipName_webpage &sipStrings_goldencheetah[157]
#define sipNameNr_metrics 165
#define sipName_metrics &sipStrings_goldencheetah[165]
#define sipNameNr_compare 173
#define sipName_compare &sipStrings_goldencheetah[173]
#define sipNameNr_version 181
#define sipName_version &sipStrings_goldencheetah[181]
#define sipNameNr_athlete 189
#define sipName_athlete &sipStrings_goldencheetah[189]
#define sipNameNr___len__ 197
#define sipName___len__ &sipStrings_goldencheetah[197]
#define sipNameNr___str__ 205
#define sipName___str__ &sipStrings_goldencheetah[205]
#define sipNameNr_QString 213
#define sipName_QString &sipStrings_goldencheetah[213]
#define sipNameNr_metric 221
#define sipName_metric &sipStrings_goldencheetah[221]
#define sipNameNr_filter 228
#define sipName_filter &sipStrings_goldencheetah[228]
#define sipNameNr_series 235
#define sipName_series &sipStrings_goldencheetah[235]
#define sipNameNr_build 242
#define sipName_build &sipStrings_goldencheetah[242]
#define sipNameNr_type 248
#define sipName_type &sipStrings_goldencheetah[248]
#define sipNameNr_url 253
#define sipName_url &sipStrings_goldencheetah[253]
#define sipNameNr_pmc 257
#define sipName_pmc &sipStrings_goldencheetah[257]
#define sipNameNr_all 261
#define sipName_all &sipStrings_goldencheetah[261]
#define sipNameNr_measures 139
#define sipName_measures &sipStrings_goldencheetah[139]
#define sipNameNr_threadid 148
#define sipName_threadid &sipStrings_goldencheetah[148]
#define sipNameNr_Bindings 157
#define sipName_Bindings &sipStrings_goldencheetah[157]
#define sipNameNr_webpage 166
#define sipName_webpage &sipStrings_goldencheetah[166]
#define sipNameNr_metrics 174
#define sipName_metrics &sipStrings_goldencheetah[174]
#define sipNameNr_compare 182
#define sipName_compare &sipStrings_goldencheetah[182]
#define sipNameNr_version 190
#define sipName_version &sipStrings_goldencheetah[190]
#define sipNameNr_athlete 198
#define sipName_athlete &sipStrings_goldencheetah[198]
#define sipNameNr___len__ 206
#define sipName___len__ &sipStrings_goldencheetah[206]
#define sipNameNr___str__ 214
#define sipName___str__ &sipStrings_goldencheetah[214]
#define sipNameNr_QString 222
#define sipName_QString &sipStrings_goldencheetah[222]
#define sipNameNr_metric 230
#define sipName_metric &sipStrings_goldencheetah[230]
#define sipNameNr_filter 237
#define sipName_filter &sipStrings_goldencheetah[237]
#define sipNameNr_series 244
#define sipName_series &sipStrings_goldencheetah[244]
#define sipNameNr_group 251
#define sipName_group &sipStrings_goldencheetah[251]
#define sipNameNr_build 257
#define sipName_build &sipStrings_goldencheetah[257]
#define sipNameNr_type 263
#define sipName_type &sipStrings_goldencheetah[263]
#define sipNameNr_url 268
#define sipName_url &sipStrings_goldencheetah[268]
#define sipNameNr_pmc 272
#define sipName_pmc &sipStrings_goldencheetah[272]
#define sipNameNr_all 276
#define sipName_all &sipStrings_goldencheetah[276]
#define sipMalloc sipAPI_goldencheetah->api_malloc
#define sipFree sipAPI_goldencheetah->api_free

View File

@@ -374,6 +374,41 @@ static PyObject *meth_Bindings_pmc(PyObject *sipSelf, PyObject *sipArgs, PyObjec
}
extern "C" {static PyObject *meth_Bindings_measures(PyObject *, PyObject *, PyObject *);}
static PyObject *meth_Bindings_measures(PyObject *sipSelf, PyObject *sipArgs, PyObject *sipKwds)
{
PyObject *sipParseErr = NULL;
{
bool a0 = 0;
::QString a1def = QString("Body");
::QString* a1 = &a1def;
int a1State = 0;
::Bindings *sipCpp;
static const char *sipKwdList[] = {
sipName_all,
sipName_group,
};
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|bJ1", &sipSelf, sipType_Bindings, &sipCpp, &a0, sipType_QString,&a1, &a1State))
{
PyObject * sipRes;
sipRes = sipCpp->measures(a0,*a1);
sipReleaseType(a1,sipType_QString,a1State);
return sipRes;
}
}
/* Raise an exception if the arguments couldn't be parsed. */
sipNoMethod(sipParseErr, sipName_Bindings, sipName_measures, NULL);
return NULL;
}
extern "C" {static PyObject *meth_Bindings_activityMeanmax(PyObject *, PyObject *, PyObject *);}
static PyObject *meth_Bindings_activityMeanmax(PyObject *sipSelf, PyObject *sipArgs, PyObject *sipKwds)
{
@@ -546,6 +581,7 @@ static PyMethodDef methods_Bindings[] = {
{SIP_MLNAME_CAST(sipName_activityMetrics), (PyCFunction)meth_Bindings_activityMetrics, METH_VARARGS|METH_KEYWORDS, NULL},
{SIP_MLNAME_CAST(sipName_athlete), meth_Bindings_athlete, METH_VARARGS, NULL},
{SIP_MLNAME_CAST(sipName_build), meth_Bindings_build, METH_VARARGS, NULL},
{SIP_MLNAME_CAST(sipName_measures), (PyCFunction)meth_Bindings_measures, METH_VARARGS|METH_KEYWORDS, NULL},
{SIP_MLNAME_CAST(sipName_metrics), (PyCFunction)meth_Bindings_metrics, METH_VARARGS|METH_KEYWORDS, NULL},
{SIP_MLNAME_CAST(sipName_pmc), (PyCFunction)meth_Bindings_pmc, METH_VARARGS|METH_KEYWORDS, NULL},
{SIP_MLNAME_CAST(sipName_seasonMeanmax), (PyCFunction)meth_Bindings_seasonMeanmax, METH_VARARGS|METH_KEYWORDS, NULL},
@@ -573,7 +609,7 @@ sipClassTypeDef sipTypeDef_goldencheetah_Bindings = {
{
sipNameNr_Bindings,
{0, 0, 1},
15, methods_Bindings,
16, methods_Bindings,
0, 0,
0, 0,
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

View File

@@ -25,6 +25,7 @@ const char sipStrings_goldencheetah[] = {
'_', '_', 'g', 'e', 't', 'i', 't', 'e', 'm', '_', '_', 0,
's', 'e', 'r', 'i', 'e', 's', 'L', 'a', 's', 't', 0,
's', 'e', 'r', 'i', 'e', 's', 'N', 'a', 'm', 'e', 0,
'm', 'e', 'a', 's', 'u', 'r', 'e', 's', 0,
't', 'h', 'r', 'e', 'a', 'd', 'i', 'd', 0,
'B', 'i', 'n', 'd', 'i', 'n', 'g', 's', 0,
'w', 'e', 'b', 'p', 'a', 'g', 'e', 0,
@@ -38,6 +39,7 @@ const char sipStrings_goldencheetah[] = {
'm', 'e', 't', 'r', 'i', 'c', 0,
'f', 'i', 'l', 't', 'e', 'r', 0,
's', 'e', 'r', 'i', 'e', 's', 0,
'g', 'r', 'o', 'u', 'p', 0,
'b', 'u', 'i', 'l', 'd', 0,
't', 'y', 'p', 'e', 0,
'u', 'r', 'l', 0,