[Scipy-svn] r2376 - trunk/Lib/sandbox/timeseries

scipy-svn at scipy.org scipy-svn at scipy.org
Fri Dec 8 11:26:40 EST 2006


Author: mattknox_ca
Date: 2006-12-08 10:26:36 -0600 (Fri, 08 Dec 2006)
New Revision: 2376

Added:
   trunk/Lib/sandbox/timeseries/cseries.c
Removed:
   trunk/Lib/sandbox/timeseries/cseriesmodule.c
Log:
Renamed remotely

Copied: trunk/Lib/sandbox/timeseries/cseries.c (from rev 2375, trunk/Lib/sandbox/timeseries/cseriesmodule.c)

Deleted: trunk/Lib/sandbox/timeseries/cseriesmodule.c
===================================================================
--- trunk/Lib/sandbox/timeseries/cseriesmodule.c	2006-12-08 16:07:01 UTC (rev 2375)
+++ trunk/Lib/sandbox/timeseries/cseriesmodule.c	2006-12-08 16:26:36 UTC (rev 2376)
@@ -1,538 +0,0 @@
-#include <Python.h>
-//#include <datetime.h>
-#include <structmember.h>
-#include <stdio.h>
-#include <string.h>
-#include "mxDateTime.h"
-#include "arrayobject.h"
-
-static char cseries_doc[] = "Speed sensitive time series operations";
-
-///////////////////////////////////////////////////////////////////////
-
-
-static int
-freqVal(char freq)
-{
-	switch(freq)
-	{
-		case 'A':
-			//annual
-			return 1;
-		case 'Q':
-			//quarterly
-			return 2;
-		case 'M':
-			//monthly
-			return 3;
-		case 'B':
-			//business
-			return 4;
-		case 'D':
-			//daily
-			return 5;
-		default:
-			return 0;
-	}
-}
-
-
-//fromDate is periods since Dec 31, 1849
-static long
-convert(long fromDate, char fromFreq, char toFreq, int notStartInd, int atEnd)
-{
-    long absdate, origin, secondorigin, secsInDay;
-    long converted;
-    int rem;
-    int y,m,d,s;
-
-	mxDateTimeObject *theDate;
-	mxDateTimeObject *convDate;
-
-    origin = 675333;
-    secondorigin = 722814;
-    secsInDay = 86400;
-
-	//convert fromDate to days since Dec 31, 1849 (Jan 1, 1850 would have absdate of 1)
-    switch(fromFreq)
-    {
-        case 'D':
-            absdate = fromDate;
-            break;
-        case 'B':
-            absdate = (fromDate/5)*7 + fromDate%5;
-            break;
-        case 'M':
-			y = fromDate/12 + 1;
-			m = fromDate%12;
-			if (atEnd) m++;
-			if (m == 0)
-			{
-				m = 12;
-				y--;
-			}
-			d=1;
-			break;
-        case 'Q':
-        	y = fromDate/4 + 1;
-        	m = (fromDate%4) * 3;
-			if (!atEnd) m -= 2;	//change to first month of quarter
-			else m += 1;
-			if (m < 1)
-			{
-				m += 12;
-				y--;
-			}
-			else if (m == 12)
-			{
-				m = 1;
-				y++;
-			}
-			d=1;
-			break;
-        case 'A':
-        	y = fromDate-1;
-        	if (atEnd == 1) y++;
-        	m = 1;
-        	d = 1;
-        	break;
-        default:
-            return -1;
-    }
-
-	if (freqVal(fromFreq) < 4)
-	{
-		//switch to years from 0 for mxDateTime
-		y+= 1849;
-
-		theDate = (mxDateTimeObject *)mxDateTime.DateTime_FromDateAndTime(y,m,d,0,0,0);
-		absdate = (long)(theDate->absdate);
-		if (atEnd == 1) absdate--;
-	}
-	else
-	{
-		//days from 0 for mxDateTime
-		absdate += origin;
-	}
-
-	if (atEnd) s = secsInDay-1;
-	else s = 0;
-
-	convDate = (mxDateTimeObject *)mxDateTime.DateTime_FromAbsDateAndTime(absdate,s);
-
-	//switch back to days and years since 1849 for pyTSA Date
-	absdate -= origin;
-	y = convDate->year - 1849;
-	m = convDate->month;
-
-	//convert convDate to appropriate # of periods according to toFreq
-    switch(toFreq)
-    {
-        case 'D':
-            converted = absdate;
-            break;
-        case 'B':
-        	rem = absdate%7;
-            if (rem > 4) //is weekend day
-            {
-				if (notStartInd == 1 && freqVal(fromFreq) > 4)
-				{
-					return -1;
-				}
-				else
-				{
-					d = convDate->day;
-					d -= rem - 4;	//change to friday before weekend
-					if (d < 1) d += 3; //if friday was prev. month, change to monday instead
-					absdate = absdate - convDate->day + d;
-					converted = (long)((absdate / 7 * 5.0) + absdate%7);
-				}
-			}
-			else
-			{
-				converted = (long)((absdate / 7 * 5.0) + rem);
-			}
-            break;
-        case 'M':
-        	converted = (long)((y-1)*12 + m);
-        	break;
-       	case 'Q':
-       		converted = (long)((y-1)*4 + ((m-1)/3) + 1);
-       		break;
-       	case 'A':
-       		converted = (long)(y+1);
-       		break;
-        default:
-            return -1;
-    }
-
-    return converted;
-}
-
-
-static long
-expand(long oldSize, char fromFr, char toFr)
-{
-	long newSize;
-	int fromFreq, toFreq;
-
-	if (fromFr == toFr) return oldSize;
-
-	fromFreq = freqVal(fromFr);
-	toFreq = freqVal(toFr);
-	if (fromFreq*toFreq == 0) return oldSize; //invalid frequency
-
-	newSize = oldSize;
-
-	while (toFreq > fromFreq)
-	{
-		if (fromFreq == 1)	//Annual
-		{
-			newSize *= 4; //quarters in year
-			fromFreq++;
-		}
-		else if (fromFreq == 2) //Quarterly
-		{
-			newSize *= 3; //months in quarter
-			fromFreq++;
-		}
-		else if (fromFreq == 3)	//Monthly
-		{
-			newSize *= 31; //max days in month
-			fromFreq++;
-		}
-		else if (fromFreq == 4)	//Business
-		{
-			newSize *= 2; //max d days for each b days
-			fromFreq++;
-		}
-	}
-
-
-	return newSize;
-}
-
-
-///////////////////////////////////////////////////////////////////////
-/*
-OBSERVED
-
-from lower freq to higher freq
-----------------------
-
-summed --	all values in period set as lower freq's value / # of values
-
-rest --		all values in period set as lower freq's value
-
-from higher freq to lower freq
-----------------------
-begin - 	lower freq's value set as first value in period
-end - 		lower freq's value set as end value in period
-summed -	lower freq's value set as sum of all values in period
-averaged -	lower freq's value set as average of all values in period
-high - 		lower freq's value set as largest value in period
-low - 		lower freq's value set as smallest value in period
-
-*/
-///////////////////////////////////////////////////////////////////////
-
-static void
-adjValForObsSet(PyArrayObject *theArray, char obs, PyObject **newVal, PyObject **newValMask, PyObject *val, PyObject *valMask,  long curPerLen)
-{
-	double dblVal;
-	long lngValMask, lngAllMasked;
-
-	lngValMask = PyInt_AsLong(valMask);
-	lngAllMasked = PyInt_AsLong(*newValMask);
-
-	if (!lngValMask) {
-
-		// if any value is not masked, then we shall not mask the aggregated result
-		*newValMask = valMask;
-
-		if (obs == 'B')
-		{
-			if (lngAllMasked) {
-				*newVal = val;
-			}
-		}
-		else if ( PyArray_ISFLOAT(theArray) && (obs=='S' || obs=='A') )
-		{
-
-			if (obs == 'S')
-			{
-				//observed is summed
-
-				dblVal = PyFloat_AsDouble(*newVal);
-				dblVal += PyFloat_AsDouble(val);
-				*newVal = PyFloat_FromDouble(dblVal);
-			}
-			else
-			{
-				//observed is averaged
-
-				dblVal = PyFloat_AsDouble(*newVal);
-				dblVal *= (curPerLen-1);
-				dblVal += PyFloat_AsDouble(val);
-				dblVal /= curPerLen;
-				*newVal = PyFloat_FromDouble(dblVal);
-			}
-
-		}
-		else if ( PyArray_ISNUMBER(theArray) && (obs=='H' || obs=='L') )
-		{
-
-			if (obs == 'H')
-			{
-				//observed is high
-
-				if (PyFloat_AsDouble(val) > PyFloat_AsDouble(*newVal)) *newVal = val;
-			}
-			else if (obs == 'L')
-			{
-				//observed is low
-
-				if (PyFloat_AsDouble(val) < PyFloat_AsDouble(*newVal)) *newVal = val;
-			}
-
-		}
-		else
-		{
-			//observed is not beginning and
-			//val is string or (val is date and observed is summed/averaged)
-			//or observed is end or not supported
-
-			*newVal = val;
-		}
-	}
-
-}
-
-
-static //PyArrayObject *
-setArrayItem(PyArrayObject **theArray, long index, PyObject *newVal)
-{
-	char *setptr;
-
-	if (index >= 0)
-	{
-		//set value in array
-		setptr = (*theArray)->data + (index) * (*theArray)->strides[0];
-		PyArray_SETITEM(*theArray,setptr,newVal);
-	}
-
-	//return theArray;
-}
-
-
-static char cseries_reindex_doc[] = "";
-static PyObject *
-cseries_reindex(PyObject *self, PyObject *args)
-{
-    PyArrayObject *array;
-    PyArrayObject *tempArray;
-    PyArrayObject *newArray;
-
-    PyArrayObject *mask;
-    PyArrayObject *tempMask;
-    PyArrayObject *newMask;
-
-    PyObject *returnVal = NULL;
-
-    int notStartInd, atEnd;
-    long startIndex, newStart;
-    long i, curPerInd, nextPerInd, prevIndex, curIndex;
-    long dim;
-    long curPerLen;
-    long lngValMask;
-    char *fromFreq, *toFreq, *observed;
-
-    char *getptr;
-    PyObject *val, *newVal;
-
-    char *getptrMask;
-    PyObject *valMask, *newValMask;
-
-    int toFrVal, fromFrVal;
-
-	returnVal = PyDict_New();
-
-	if (!PyArg_ParseTuple(args, "OssslO:reindex(array, fromfreq, tofreq, observed, startIndex,mask)", &tempArray, &fromFreq, &toFreq, &observed, &startIndex, &tempMask)) return NULL;
-
-    if (toFreq[0] == fromFreq[0])
-    {
-
-        PyDict_SetItemString(returnVal, "values", (PyObject*)tempArray);
-        PyDict_SetItemString(returnVal, "mask", (PyObject*)tempMask);
-
-        return returnVal;
-    }
-
-    array = PyArray_GETCONTIGUOUS(tempArray);
-    mask = PyArray_GETCONTIGUOUS(tempMask);
-
-	//expand size to fit new values if needed
-	dim = expand(array->dimensions[0], fromFreq[0], toFreq[0]);
-
-	//initialize new array
-    newArray = (PyArrayObject*)PyArray_SimpleNew(array->nd, &dim, array->descr->type_num);
-    newMask  = (PyArrayObject*)PyArray_SimpleNew(mask->nd, &dim, mask->descr->type_num);
-
-    for (i = 0; i < dim; i++)
-    {
-		setArrayItem(&newArray, i, PyInt_FromLong(1));
-		setArrayItem(&newMask, i, PyInt_FromLong(1));
-	}
-
-	//convert start index to new frequency
-	notStartInd = 0;
-	atEnd = 0;
-    newStart = convert(startIndex, fromFreq[0], toFreq[0], notStartInd, atEnd);
-
-	//initialize prevIndex
-	prevIndex = newStart - 1;
-
-	notStartInd = 1;
-	atEnd = 0;
-
-	//set values in the new array
-    for (i = 0; i < array->dimensions[0]; i++)
-    {
-		//find index for start of current period in new frequency
-        curPerInd = convert(startIndex + i, fromFreq[0], toFreq[0], notStartInd, atEnd);
-
-		//get frequency numeric mapping
-		fromFrVal = freqVal(fromFreq[0]);
-		toFrVal = freqVal(toFreq[0]);
-
-		//get value from old array
-		getptr = array->data + i*array->strides[0];
-		val = PyArray_GETITEM(array,getptr);
-
-		//get the mask corresponding to the old value
-		getptrMask = mask->data + i*mask->strides[0];
-		valMask = PyArray_GETITEM(mask,getptrMask);
-
-        if (fromFrVal < toFrVal)
-        {
-			//from lower freq to higher freq
-
-			newVal = val;
-			newValMask = valMask;
-
-			//find index for start of next period in new frequency
-			nextPerInd = convert(startIndex + i + 1, fromFreq[0], toFreq[0], notStartInd, atEnd);
-
-			//adjust for observed setting
-			if (observed[0] == 'S' && PyArray_ISFLOAT(array) && !( (fromFrVal == 4 && toFrVal == 5) || (fromFrVal == 5 && toFrVal == 4) ) )
-			{
-				//summed
-
-				//all values in period set as old array's value / # of values
-				newVal = PyFloat_FromDouble( PyFloat_AsDouble(val) / (nextPerInd - curPerInd) );
-			}
-
-			//set each value in period
-			for (curIndex = curPerInd; curIndex < nextPerInd; curIndex++)
-			{
-				setArrayItem(&newArray, curIndex-newStart, newVal);
-				setArrayItem(&newMask, curIndex-newStart, newValMask);
-			}
-		}
-		else
-		{
-
-			lngValMask = PyInt_AsLong(valMask);
-
-			//from higher freq to lower freq
-
-			if (curPerInd != prevIndex)
-			{
-				//starting new period in old array
-
-
-				//set value in the new array
-				setArrayItem(&newArray, prevIndex-newStart, newVal);
-				setArrayItem(&newMask, prevIndex-newStart, newValMask);
-
-				//reset period length
-				curPerLen = 0;
-
-
-
-				if (!lngValMask) {
-					curPerLen++;
-				}
-
-
-
-				//store current index and value
-				prevIndex = curPerInd;
-				newVal = val;
-				newValMask = valMask;
-
-			}
-			else
-			{
-				//still in same period
-
-
-
-				if (!lngValMask) {
-					curPerLen++;
-				}
-
-				//adjust new value according to observed setting
-				adjValForObsSet(array, observed[0], &newVal, &newValMask, val, valMask, curPerLen);
-			}
-
-		}
-
-    }
-
-	//set value of last item in the new array
-	setArrayItem(&newArray, curPerInd-newStart, newVal);
-	setArrayItem(&newMask, curPerInd-newStart, newValMask);
-
-	PyDict_SetItemString(returnVal, "values", (PyObject*)newArray);
-	PyDict_SetItemString(returnVal, "mask", (PyObject*)newMask);
-
-	return returnVal;
-
-}
-
-
-static char cseries_convert_doc[] = "";
-static PyObject *
-cseries_convert(PyObject *self, PyObject *args)
-{
-    long fromDate;
-    char* fromFreq;
-    char* toFreq;
-    int notStartInd, atEnd;
-
-    if (!PyArg_ParseTuple(args, "lss:convert(fromDate, fromfreq, tofreq)", &fromDate, &fromFreq, &toFreq)) return NULL;
-
-	//always want start of period (only matters when converting from lower freq to higher freq ie. m -> d)
-	atEnd = 0;
-	notStartInd = 0;
-
-    return PyInt_FromLong(convert(fromDate, fromFreq[0], toFreq[0], notStartInd, atEnd));
-}
-
-
-///////////////////////////////////////////////////////////////////////
-
-static PyMethodDef cseries_methods[] = {
-    {"reindex", cseries_reindex, METH_VARARGS, cseries_reindex_doc},
-    {"convert", cseries_convert, METH_VARARGS, cseries_convert_doc},
-    {NULL, NULL}
-};
-
-PyMODINIT_FUNC
-initcseries(void)
-{
-    Py_InitModule3("cseries", cseries_methods, cseries_doc);
-    mxDateTime_ImportModuleAndAPI();
-    import_array();
-}
\ No newline at end of file




More information about the Scipy-svn mailing list