/// <summary> /// преобразует ряд наблюдений в статистику /// </summary> /// <param name="range"></param> public Dataset(RawRange range, MeteorologyParameters param, IHoursModel model) : this() { for (int i = 1; i <= 12; i++) //цикл по месяцам { switch (param) { case MeteorologyParameters.AllSkyInsolation: double aver = (from t in range where t.Date.Month == i select t.AllSkyInsolation).Average(); DataHours <double> hours = model.GetData(aver, param); Months month = (Months)i; this[month] = hours; break; case MeteorologyParameters.ClearSkyInsolation: double aver2 = (from t in range where t.Date.Month == i select t.ClearSkyInsolation).Average(); DataHours <double> hours2 = model.GetData(aver2, param); Months month2 = (Months)i; this[month2] = hours2; break; default: throw new Exception("Этот параметр не реализован"); } } }
public DataHours <double> GetData(double dailySum, MeteorologyParameters allSkyInsolation) { DataHours <double> res = new DataHours <double>(); for (int i = 0; i < 24; i++) { res.Add(i, dailySum / 24d); } return(res); }
/// <summary> /// загрузка таблицы, начиная с заданной ячейки /// </summary> /// <param name="array"></param> /// <param name="startLine"></param> /// <param name="startCol"></param> /// <returns></returns> private Dataset loadTable(string[] array, int startLine, int startCol) { Dataset res = new Dataset(); for (int i = startLine; i < startLine + 12; i++) { DataHours <double> dh = new DataHours <double>(); Months month = (Months)(i - startLine + 1); string[] line = array[i].Split(';'); for (int j = startCol; j < startCol + 24; j++) { int hour = j - startCol; double val = double.Parse(line[j].Replace(',', Constants.DecimalSeparator)); dh[hour] = val; } res[month] = dh; } return(res); }
/// <summary> /// интерполяция каждого часа отдельно для всех месяцев /// </summary> /// <param name="data"></param> /// <returns></returns> private DataHours <double> prepareData(Dataset data) { DataHours <double> res = new DataHours <double>(); double[,] arr = new double[24, 365]; //заполнение недостающих значений for (int h = 0; h < 24; h++) { for (int d = 0; d < 365;) { foreach (Months month in Months.All.GetEnumItems()) { if (month == Months.All) { continue; } arr[h, d] = data[month][h]; int daysInMonth = DateTime.DaysInMonth(1999, (int)month); // количество дней в месяце обычного года if (month != Months.December) //если это не последний месяц, то заполняем промежуток { fillSpace(ref arr, h, d + 1, daysInMonth - 1, arr[h, d], data[month + 1][h]); } d += daysInMonth; //следующее значение через месяц } } } //заполнение результата for (int h = 0; h < 24; h++) { for (int d = 0; d < 365; d++) { int hour = d * 24 + h; res[hour] = arr[h, d]; } } return(res); }
public DataRange GenerateRange(DataItem dataItem) { allSky = prepareData(dataItem.DatasetAllsky); clearSky = prepareData(dataItem.DatasetClearSky); DataRange res = new DataRange(); for (int i = 0; i < 8760; i++) { long ticks = (long)(i * 60 * 60 * 10e6); DateTime date = new DateTime(ticks); Months month = (Months)date.Month; int hour = date.Hour; double clsk = clearSky[i]; double alsk = allSky[i]; RawItem ni = new RawItem(date, alsk, clsk); res.Add(ni); } return(res); }
/// <summary> /// получить ряд и суточных наблюдений /// </summary> /// <param name="data"></param> /// <param name="param"></param> /// <returns></returns> private DataRange getFromDaily(RawRange data, DataRangeConverterParams param) { //выбоор данных RawRange selectedRange = new RawRange(); switch (param.SourceType) { case NasaSourceTypes.AllPeriod: for (int i = 0; i < 365; i++) { var thisDay = from t in data where t.Date.DayOfYear == i + 1 select t; double averAllsk = 0, allskCount = 0; double averClearsk = 0, clskCount = 0; foreach (RawItem ri in thisDay) { averAllsk += !double.IsNaN(ri.AllSkyInsolation) ? ri.AllSkyInsolation : 0; averClearsk += !double.IsNaN(ri.ClearSkyInsolation) ? ri.ClearSkyInsolation : 0; clskCount += !double.IsNaN(ri.AllSkyInsolation) ? 1 : 0; allskCount += !double.IsNaN(ri.ClearSkyInsolation) ? 1 : 0; } averClearsk /= clskCount; averAllsk /= allskCount; DateTime dt = new DateTime(0) + TimeSpan.FromDays(i); selectedRange.Add(new RawItem(dt, averAllsk, averClearsk)); } break; case NasaSourceTypes.Maximal: for (int i = 0; i < 365; i++) { var thisDay = from t in data where t.Date.DayOfYear == i + 1 select t; double maxD = double.MinValue; RawItem max = null; foreach (RawItem ri in thisDay) { if (maxD < ri.AllSkyInsolation && !double.IsNaN(ri.AllSkyInsolation) && !double.IsNaN(ri.ClearSkyInsolation)) { maxD = ri.AllSkyInsolation; max = ri; } } DateTime dt = new DateTime(0) + TimeSpan.FromDays(i); selectedRange.Add(new RawItem(dt, max.AllSkyInsolation, max.ClearSkyInsolation)); } break; case NasaSourceTypes.Minimal: for (int i = 0; i < 365; i++) { var thisDay = from t in data where t.Date.DayOfYear == i + 1 select t; double minD = double.MaxValue; RawItem min = null; foreach (RawItem ri in thisDay) { if (minD > ri.AllSkyInsolation && !double.IsNaN(ri.AllSkyInsolation) && !double.IsNaN(ri.ClearSkyInsolation)) { minD = ri.AllSkyInsolation; min = ri; } } DateTime dt = new DateTime(0) + TimeSpan.FromDays(i); selectedRange.Add(new RawItem(dt, min.AllSkyInsolation, min.ClearSkyInsolation)); } break; case NasaSourceTypes.SelectedYear: var collection = from t in data where t.Date.Year == param.Year select t; selectedRange.AddRange(collection); break; default: throw new Exception("Этот тип источников данных не реализован"); } if (selectedRange.Count != 365) { throw new Exception("Не все данные получены"); } //выбор модели IHoursModel model; switch (param.HourModel) { case HourModels.Uniform: model = new UniformModel(); break; default: throw new Exception("Эта модель не реализована"); } //преобразование к часовому ряду DataRange res = new DataRange(); foreach (RawItem item in selectedRange) { DataHours <double> hoursAll = model.GetData(item.AllSkyInsolation, MeteorologyParameters.AllSkyInsolation); DataHours <double> hoursClear = model.GetData(item.ClearSkyInsolation, MeteorologyParameters.ClearSkyInsolation); DataRange day = new DataRange(); for (int h = 0; h < 24; h++) { DateTime dt = new DateTime(01999, item.Date.Month, item.Date.Day, h, 0, 0); double alsk = hoursAll[h]; double clsk = hoursClear[h]; RawItem ri = new RawItem(dt, alsk, clsk); day.Add(ri); } res.AddRange(day); } if (res.Count != 8760) { throw new WindEnergyException("Ошибка при преобразованииряда наблюдений"); } return(res); }