Bonjour,
j'essaye de trouver un moyen de calculer efficacement les quantiles d'une série de double.
Pour l'instant j'utilise la librairie Statistic qui me permet de calculer les frontières de quantiles, et voici comment je l'utilise pour le moment :
PS : la fonction qui permet de calculer les frontières est Qi (cf code)
Comme vous le voyez c'est très lourd, du coup dés que je prend un step à 100 (pour calculer un percentile) avec une grosse datatable c'est la cata !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 public class GQDQuantil { DataTable dt_ = new DataTable(); string axe_; List<int> quantil_ = new List<int>(); List<double> frontier_ = new List<double>(); public DataTable dt { get { return dt_; } } public List<int> quantil { get { return quantil_; } } public List<double> frontier { get { return frontier_; } } public GQDQuantil() { } public GQDQuantil(DataTable dt, string axe, double step) { axe_ = axe; dt_ = dt.Clone(); double[] tmp = new double[dt.Rows.Count]; int i=0; foreach (DataRow currow in dt.Rows) { dt_.ImportRow(currow); tmp[i] = Convert.ToDouble(currow[axe]); i++; } GQDstatistic.statistics Res = new GQDstatistic.statistics(tmp); for (double k = 0 + 1/step; k < 1; k= k + 1/step) frontier_.Add(Res.Qi(k)); dt_.Columns.Add("quantil"); foreach (DataRow currow in dt_.Rows) { int j = 0; foreach (double f in frontier_) { if (Convert.ToDouble(currow[axe]) < f) { currow["quantil"] = Convert.ToString(j + 1); break; } else { j++; currow["quantil"] = Convert.ToString(j + 1); } } } } }
alors si vous avez une meilleur solution je suis preneur
Merci
Partager