Projekt

Obecné

Profil

Stáhnout (5.09 KB) Statistiky
| Větev: | Tag: | Revize:
1 ebe96ca4 Roman Kalivoda
//
2
// Author: Roman Kalivoda
3
//
4
5
using System.Collections.Generic;
6
using System;
7
using ServerApp.Parser.Parsers;
8 d358b79e Roman Kalivoda
using ServerApp.Parser.OutputInfo;
9
using System.Linq;
10 ebe96ca4 Roman Kalivoda
11
namespace ServerApp.Predictor
12
{
13
    /// <summary>
14
    /// A class responsible for preparation of features for classifiers.
15
    /// </summary>
16 cdeee9f8 Roman Kalivoda
    class FeatureExtractor
17 ebe96ca4 Roman Kalivoda
    {
18
        /// <summary>
19
        /// A DataParser instance used to access info objects.
20
        /// </summary>
21 cdeee9f8 Roman Kalivoda
        private readonly IDataParser DataParser;
22 ebe96ca4 Roman Kalivoda
23 cdeee9f8 Roman Kalivoda
        /// <summary>
24
        /// A configuration object of the <c>Predictor</c> package
25
        /// </summary>
26
        private PredictorConfiguration Configuration;
27 ebe96ca4 Roman Kalivoda
28
        /// <summary>
29
        /// Instantiates new FeatureExtractor class.
30
        /// </summary>
31
        /// <param name="dataParser">Data parser used to access training data.</param>
32 cdeee9f8 Roman Kalivoda
        public FeatureExtractor(IDataParser dataParser, PredictorConfiguration configuration)
33 ebe96ca4 Roman Kalivoda
        {
34 cdeee9f8 Roman Kalivoda
            this.DataParser = dataParser;
35
            this.Configuration = configuration;
36 ebe96ca4 Roman Kalivoda
        }
37
38
        /// <summary>
39 d358b79e Roman Kalivoda
        /// TODO comment
40 ebe96ca4 Roman Kalivoda
        /// </summary>
41 d358b79e Roman Kalivoda
        /// <param name="area"></param>
42
        /// <param name="startDate"></param>
43
        /// <param name="endDate"></param>
44
        /// <param name="interval"></param>
45
        /// <param name="wholeDay"></param>
46
        /// <returns></returns>
47 cdeee9f8 Roman Kalivoda
        public List<ModelInput> PrepareTrainingInput(int area, DateTime startDate, DateTime endDate, int interval = 3, bool wholeDay = true)
48 ebe96ca4 Roman Kalivoda
        {
49 cdeee9f8 Roman Kalivoda
            DataParser.Parse(startDate, endDate, interval, wholeDay);
50 ebe96ca4 Roman Kalivoda
            List<string> buildings = new List<string>();
51
52
            // find all buildings in area
53 cdeee9f8 Roman Kalivoda
            foreach (KeyValuePair<string, int> kvp in Configuration.BuildingsToAreas)
54 ebe96ca4 Roman Kalivoda
            {
55
                if (kvp.Value == area)
56
                {
57
                    buildings.Add(kvp.Key);
58
                }
59
            }
60
61 d358b79e Roman Kalivoda
            var res = new List<ModelInput>();
62 cdeee9f8 Roman Kalivoda
            foreach (WeatherInfo val in DataParser.WeatherList)
63 662b2404 Roman Kalivoda
            {
64 d358b79e Roman Kalivoda
                res.Add(new ModelInput
65 662b2404 Roman Kalivoda
                {
66 d358b79e Roman Kalivoda
                    Time = val.startTime,
67 60a60164 Roman Kalivoda
                    Temp = (float)val.temp,
68
                    Hour = val.startTime.Hour,
69 d358b79e Roman Kalivoda
                    Wind = (float)val.wind,
70
                    Rain = (float)val.rain,
71
                });
72
            }
73
74 cdeee9f8 Roman Kalivoda
            List<ActivityInfo> attendance = DataParser.AttendanceList;
75 d358b79e Roman Kalivoda
            foreach (ModelInput input in res)
76
            {
77
                List<int> amounts = new List<int>();
78
                List<int> maxima = new List<int>();
79
                foreach (string building in buildings)
80 662b2404 Roman Kalivoda
                {
81 d358b79e Roman Kalivoda
82
                    amounts.Add(attendance.Where(activity => activity.building.Equals(building) && activity.startTime.Equals(input.Time)).Select(activity => activity.amount).First());
83
                    maxima.Add(attendance.Where(activity => activity.building.Equals(building)).Select(activity => activity.amount).Max());
84 ebe96ca4 Roman Kalivoda
                }
85 d358b79e Roman Kalivoda
                double ratio = amounts.Sum() / (double)maxima.Sum();
86
                input.Label = RatioToLabel(ratio);
87 ebe96ca4 Roman Kalivoda
            }
88
89
            return res;
90
        }
91 d358b79e Roman Kalivoda
92
        private string RatioToLabel(double ratio)
93
        {
94
            if (ratio < 0.1f)
95
            {
96
                return "10%";
97 60a60164 Roman Kalivoda
            }
98
            else if (ratio < 0.2f)
99 d358b79e Roman Kalivoda
            {
100
                return "20%";
101 60a60164 Roman Kalivoda
            }
102
            else if (ratio < 0.3f)
103 d358b79e Roman Kalivoda
            {
104
                return "30%";
105 60a60164 Roman Kalivoda
            }
106
            else if (ratio < 0.4f)
107 d358b79e Roman Kalivoda
            {
108
                return "40%";
109 60a60164 Roman Kalivoda
            }
110
            else if (ratio < 0.5f)
111 d358b79e Roman Kalivoda
            {
112
                return "50%";
113 60a60164 Roman Kalivoda
            }
114
            else if (ratio < 0.6f)
115 d358b79e Roman Kalivoda
            {
116
                return "60%";
117 60a60164 Roman Kalivoda
            }
118
            else if (ratio < 0.7f)
119
            {
120 d358b79e Roman Kalivoda
                return "70%";
121 60a60164 Roman Kalivoda
            }
122
            else if (ratio < 0.8f)
123 d358b79e Roman Kalivoda
            {
124
                return "80%";
125 60a60164 Roman Kalivoda
            }
126
            else if (ratio < 0.9f)
127 d358b79e Roman Kalivoda
            {
128
                return "90%";
129 60a60164 Roman Kalivoda
            }
130
            else
131 d358b79e Roman Kalivoda
            {
132
                return "100%";
133
            }
134
        }
135
136
        private double LabelToRatio(string label)
137
        {
138 60a60164 Roman Kalivoda
            if (label.Equals("10%"))
139
            {
140 d358b79e Roman Kalivoda
                return 0.1f;
141
            }
142 60a60164 Roman Kalivoda
            else if (label.Equals("20%"))
143
            {
144 d358b79e Roman Kalivoda
                return 0.2f;
145
            }
146 60a60164 Roman Kalivoda
            else if (label.Equals("30%"))
147
            {
148 d358b79e Roman Kalivoda
                return 0.3f;
149
            }
150 60a60164 Roman Kalivoda
            else if (label.Equals("40%"))
151
            {
152 d358b79e Roman Kalivoda
                return 0.4f;
153
            }
154 60a60164 Roman Kalivoda
            else if (label.Equals("50%"))
155
            {
156 d358b79e Roman Kalivoda
                return 0.5f;
157
            }
158 60a60164 Roman Kalivoda
            else if (label.Equals("60%"))
159
            {
160 d358b79e Roman Kalivoda
                return 0.6f;
161
            }
162 60a60164 Roman Kalivoda
            else if (label.Equals("70%"))
163
            {
164 d358b79e Roman Kalivoda
                return 0.7f;
165
            }
166 60a60164 Roman Kalivoda
            else if (label.Equals("80%"))
167
            {
168 d358b79e Roman Kalivoda
                return 0.8f;
169
            }
170 60a60164 Roman Kalivoda
            else if (label.Equals("90%"))
171
            {
172 d358b79e Roman Kalivoda
                return 0.9f;
173
            }
174
            else
175
            {
176
                return 1.0f;
177
            }
178
        }
179 ebe96ca4 Roman Kalivoda
    }
180
}