##// END OF EJS Templates
HS_outliers in C
rflores -
r1543:a3a1a4029bf5
parent child
Show More
@@ -0,0 +1,86
1 #include <Python.h>
2 #include <numpy/arrayobject.h>
3 #include <math.h>
4
5
6 static PyObject *HS_algorithm(PyObject *self, PyObject *args) {
7 double navg;
8 PyObject *data_obj, *data_array;
9
10 if (!PyArg_ParseTuple(args, "Od", &data_obj, &navg)) {
11 return NULL;
12 }
13
14 data_array = PyArray_FROM_OTF(data_obj, NPY_FLOAT64, NPY_IN_ARRAY);
15
16 if (data_array == NULL) {
17 Py_XDECREF(data_array);
18 Py_XDECREF(data_obj);
19 return NULL;
20 }
21 double *sortdata = (double*)PyArray_DATA(data_array);
22 int lenOfData = (int)PyArray_SIZE(data_array) ;
23 double nums_min = lenOfData*0.75;
24 if (nums_min <= 5) nums_min = 5;
25 double sump = 0;
26 double sumq = 0;
27 long j = 0;
28 int cont = 1;
29 double rtest = 0;
30 while ((cont == 1) && (j < lenOfData)) {
31 sump = sump + sortdata[j];
32 sumq = sumq + pow(sortdata[j], 2);
33 if (j > nums_min) {
34 rtest = (double)j/(j-1) + 1/navg;
35 //printf("%ld\n", j);
36 //printf("%f \n", rtest);
37 //printf("%f \n", sump);
38 if ((sumq*j) > (rtest*pow(sump, 2))) {
39 j = j - 1;
40 sump = sump - sortdata[j];
41 sumq = sumq - pow(sortdata[j],2);
42 cont = 0;
43 }
44 }
45 //printf("%ld\n", j);
46 j = j + 1;
47 }
48
49 double lnoise = sump / j;
50
51 Py_DECREF(data_array);
52
53 // return PyLong_FromLong(lnoise);
54 return PyFloat_FromDouble(j);
55 }
56
57
58 static PyMethodDef noiseMethods[] = {
59 { "HS_algorithm", HS_algorithm, METH_VARARGS, "Applies hildebrand_sekhon algorithm" },
60 { NULL, NULL, 0, NULL }
61 };
62
63 #if PY_MAJOR_VERSION >= 3
64
65 static struct PyModuleDef noisemodule = {
66 PyModuleDef_HEAD_INIT,
67 "_HS_algorithm",
68 "Applies hildebrand_sekhon algorithm",
69 -1,
70 noiseMethods
71 };
72
73 #endif
74
75 #if PY_MAJOR_VERSION >= 3
76 PyMODINIT_FUNC PyInit__HS_algorithm(void) {
77 Py_Initialize();
78 import_array();
79 return PyModule_Create(&noisemodule);
80 }
81 #else
82 PyMODINIT_FUNC init_HS_algorithm() {
83 Py_InitModule("_HS_algorithm", noiseMethods);
84 import_array();
85 }
86 #endif
General Comments 0
You need to be logged in to leave comments. Login now