示例#1
0
        /// <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("Этот параметр не реализован");
                }
            }
        }
示例#2
0
        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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
        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);
        }
示例#6
0
        /// <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);
        }