Пример #1
0
        /// <summary>
        /// Calculate all assets linked with indices
        /// </summary>
        /// <param name="sensivityIndexID"></param>
        /// <param name="startDateForecast"></param>
        /// <param name="frequencyID"></param>
        public static Dictionary<string, HashSet<int>> CalculateAssetsByIndex(List<int> sensivityIndexIDs, K_DataManager.OuterData outerData)
        {
            var calculatedAssets = new Dictionary<string, HashSet<int>>();

            // All assets by item
            foreach (var assets in K_DataManager.AssetsByItemCode.Values)
            {
                foreach (var assetType in assets.Keys)
                {
                    var calculatedAssetIDs = new HashSet<int>();
                    foreach (var assetID in assets[assetType])
                    {
                        if (calculatedAssets.ContainsKey(assetType) && calculatedAssets[assetType].Contains(assetID))
                            continue;

                        // Check if asset linked with target index
                        if (K_DataManager.IndexIDsByAsset.ContainsKey(assetType) && K_DataManager.IndexIDsByAsset[assetType].ContainsKey(assetID))
                        {
                            if (K_DataManager.IndexIDsByAsset[assetType][assetID].Any(id => sensivityIndexIDs.Contains(id)))
                            {
                                K_DataManager.CalculateFinancialInstruments(assetID, assetType, DateTime.Parse(outerData.StartDateForecast), 1, outerData.FrequencyID);
                                calculatedAssetIDs.Add(assetID);
                            }
                        }
                    }

                    if (calculatedAssetIDs.Count == 0)
                        continue;

                    if (calculatedAssets.ContainsKey(assetType))
                    {
                        calculatedAssets[assetType].UnionWith(calculatedAssetIDs);
                    }
                    else
                    {
                        calculatedAssets.Add(assetType, calculatedAssetIDs);
                    }
                }
            }

            return calculatedAssets;
        }
Пример #2
0
        public static void CalculateIndex(K_DataManager.OuterData outerData)
        {
            outerData.History = 0;
                outerData.nullSigma = true;

                try
                {
                    outerData.ModelID = (int)K_DataManager.ExecuteSQLQuery(String.Format(@"select ModelID from Series where LanguageID = 1 and SeriesID = {0}", outerData.SeriesID));
                    if (outerData.ModelID == 11)
                    {
                        outerData.formula = K_DataManager.ExecuteSQLQuery(String.Format(@"select parameters from Series where LanguageID = 1 and SeriesID = {0}", outerData.SeriesID)).ToString();
                    }

                    outerData.Estimate = false;
                }
                catch (Exception)
                {
                    outerData.ModelID = 1; //base model
                    outerData.Estimate = true;
                }

                K_Forecast.ForecastModel(outerData);
        }
Пример #3
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="outerData"></param>
        /// <param name="link"></param>
        public static void CalculateItem(K_DataManager.OuterData outerData)
        {
            var link = K_DataManager.LinkItemsScript;
            if (File.Exists(link) && File.Exists(K_DataManager.LinkGetValueScript))
            {
                link = link.Replace(@"\", @"/");

                K_DataManager.ExecuteSQLQuery("delete from {0} where BudgetItemID in (select BudgetItemID from BudgetItems where CompanyID in ({1}))", outerData.BudgetItemTable, K_DataManager.CompanyList);
                var items = new Dictionary<int, string>();
                K_DataManager.K_DataModel.BudgetItems.Where(b => K_DataManager.CompanyIDsList.Contains((int)b.CompanyID) && b.Formula != "").OrderByDescending(b => b.BudgetItemID).ToList().ForEach(b => items.Add(b.BudgetItemID, b.Formula));

                var iterNum = 0;
                var startDate = Convert.ToDateTime(outerData.StartDateForecast);
                var endDate = Convert.ToDateTime(outerData.EndDateForecast);
                // Для записи не рассчитанных статей.
                var calclulatedItems = new List<int>();

                // Need preload data from db
                //K_DataManager.engine.Evaluate(String.Format(@"source('{0}')", K_DataManager.LinkGetValueScript.Replace(@"\", @"/")));
                K_DataManager.engine.Evaluate(String.Format(@"source('{0}')", @"R scripts\Forecasting\getValueSpeedUp.R".Replace(@"\", @"/")));

                K_DataManager.engine.Evaluate(String.Format(@"DataSource <- ""{0}""", K_DataManager.DataSource));
                K_DataManager.engine.Evaluate(String.Format(@"f_s <- as.Date(""{0}"")", outerData.StartDateForecast));
                K_DataManager.engine.Evaluate(String.Format(@"f_e <- as.Date(""{0}"")", outerData.EndDateForecast));
                K_DataManager.engine.Evaluate(String.Format(@"mc_num <- {0}", outerData.ScenarioNumber));
                K_DataManager.engine.Evaluate(String.Format(@"frequencyID <- {0}", outerData.FrequencyID));
                K_DataManager.engine.Evaluate(String.Format(@"item_table <- ""{0}""", outerData.BudgetItemTable));
                K_DataManager.engine.Evaluate(@"library(RODBC)");
                K_DataManager.engine.Evaluate(@"conn <- odbcConnect(DataSource)");

                // Пробегаем по всем статьям, чтобы рассчитать.
                while (items.Count > 0)
                {
                    var notCalculated = new Dictionary<int, string>();
                    iterNum++;

                    foreach (var itemID in items.Keys)
                    {
                        try
                        {
                            // Обработка базовых статей
                            var IsAllBaseItemsCalculated = true;
                            foreach (var baseItemID in K_DataManager.GetDependentItems(items[itemID], "item"))
                            {
                                if (calclulatedItems.Contains(baseItemID) || baseItemID == itemID) //Статья ссылается на саму себя
                                {
                                    continue;
                                }
                                else// Базовая статья не рассчитана
                                {
                                    if (!items.ContainsKey(baseItemID)) continue;// Базовая статья не принадлежит текущей компании, Пропускаем её

                                    notCalculated.Add(itemID, items[itemID]);
                                    IsAllBaseItemsCalculated = false;
                                    break;
                                }
                            }

                            if (IsAllBaseItemsCalculated)
                            {
                                #region Calculate Item
                                try
                                {
                                    var item = K_DataManager.K_DataModel.BudgetItems.Local.Where(b => b.BudgetItemID == itemID).First();

                                    #region Preload Indices to dataframe
                                    var indices = K_DataManager.GetItemIndexIDs( item.Formula, isRecursive: false);
                                    foreach (var indexID in indices)
                                    {
                                        var indexCode = K_DataManager.K_DataModel.Series.Find(indexID).SeriesCode;
                                        var list = K_DataManager.K_DataModel.SeriesScenarioValues.Where(i => i.SeriesID == indexID && i.FrequencyID == outerData.FrequencyID &&
                                            i.Date >= startDate && i.Date <= endDate && i.ScenarioNumber <= outerData.ScenarioNumber).ToList();
                                        var colNames = new string[] { "Date", "ScenarioNumber", "Value" };
                                        if (list.Count > 0)
                                        {
                                            K_DataManager.RDataFramePassToR("index." + indexCode.ToLower(), list, "SeriesScenarioValues", colNames);
                                        }
                                        else
                                        {
                                            var listHistory = K_DataManager.K_DataModel.SeriesHistoryValues.Where(i => i.SeriesID == indexID && i.FrequencyID == outerData.FrequencyID &&
                                            i.Date >= startDate && i.Date <= endDate).ToList();
                                            colNames = new string[] { "Date", "Value" };
                                            K_DataManager.RDataFramePassToR("index." + indexCode.ToLower(), listHistory, "SeriesHistoryValues", colNames);
                                        }
                                    }
                                    #endregion

                                    #region Preload Assets to dataframe
                                    K_DataManager.PreloadAssets(item.Formula, startDate, endDate);

                                    #endregion
                                    K_DataManager.engine.Evaluate(String.Format(@"item_path <- '{0}'", String.Format(@"item.{0}.{1}", item.CompanyID, item.BudgetItemCode).ToLower()));
                                    K_DataManager.engine.Evaluate(String.Format(@"item_formula <- '{0}'", item.Formula));
                                    K_DataManager.engine.Evaluate(String.Format(@"item_id <- {0}", item.BudgetItemID));
                                    K_DataManager.engine.Evaluate(String.Format(@"source('{0}')", link));

                                    DataFrame res = K_DataManager.engine.Evaluate("forecast").AsDataFrame();
                                    if (res.RowCount > 0)
                                    {
                                        K_DataManager.engine.Evaluate(String.Format(@"dict[['{0}']] <- forecast[,c(""Date"",""ScenarioNumber"",""Value"")]", item.BudgetItemCode.ToLower()));
                                        #region Save data to DB overhead ~0
                                        DataTable table = new DataTable(outerData.BudgetItemTable);
                                        K_DataManager.RDataFrameToDataTable(res, table);
                                        K_DataManager.DataTableBulkCopyAsync(table);
                                        //K_DataManager.DataTableBulkCopy(table);
                                        #endregion
                                    }
                                }
                                catch (Exception exc)
                                {
                                    MessageBox.Show(exc.Message);
                                }
                                #endregion

                                calclulatedItems.Add(itemID);
                            }
                        }
                        catch (Exception exc)
                        {
                            MessageBox.Show(exc.Message);
                        }
                    }

                    items = notCalculated;
                }
            }
            K_DataManager.engine.Evaluate(@"close(conn)");
            K_DataManager.MemoryRelease();
        }
Пример #4
0
        public static void CalculateTornado(K_DataManager.OuterData outerData)
        {
            var frequencyID = outerData.FrequencyID;
            var forecastStartDate = outerData.StartDateForecast;
            var forecastEndDate = outerData.EndDateForecast;
            var forecastStartHistoryDate = outerData.StartDateHistory;

            K_DataManager.K_DataModel.Tornadoes.RemoveRange(K_DataManager.K_DataModel.Tornadoes.Where(s =>
                K_DataManager.K_DataModel.BudgetItems.Where(b => K_DataManager.CompanyList.Contains(b.CompanyID.ToString())).Select(b => b.BudgetItemID).Contains(s.BudgetItemID)));
            K_DataManager.K_DataModel.SaveChanges();

            K_DataManager.ExecuteSQLQuery(String.Format(@"update SeriesScenarioValues set RestoreValue = Value where FrequencyID = {0} and Date >= '{1}' and Date <= '{2}'", frequencyID, forecastStartDate, forecastEndDate));

            foreach (int id in K_DataManager.sensitivityIndexes.Values)
            {
                var data = K_Chart.GetQuantiles(String.Format(@"select * from SeriesHistoryValues where SeriesID = {0} and date >= '{1}' and date <= '{2}' order by Value asc", id, forecastStartHistoryDate, forecastStartDate), K_DataManager.Quantiles);

                if (data != null)
                {
                    for (int k = 0; k < data.Length; k++)
                    {
                        K_DataManager.ExecuteSQLQuery(String.Format(@"update SeriesScenarioValues set Value = {0} where SeriesID = {1} and FrequencyID = {2} and Date >= '{3}' and Date <= '{4}'", data[k], id, frequencyID, forecastStartDate, forecastEndDate));
                        K_Forecast.CalculateItem(outerData);
                        K_Forecast.UpdateInsertTornadoData((int)(K_DataManager.Quantiles[k] * 100), id);
                    }
                }
            }

            K_DataManager.ExecuteSQLQuery(String.Format(@"update SeriesScenarioValues set Value = RestoreValue where FrequencyID = {0} and Date >= '{1}' and Date <= '{2}'", frequencyID, forecastStartDate, forecastEndDate));
            K_DataManager.ExecuteSQLQuery(String.Format(@"update SeriesScenarioValues set RestoreValue = NULL where FrequencyID = {0} and Date >= '{1}' and Date <= '{2}'", frequencyID, forecastStartDate, forecastEndDate));
        }
Пример #5
0
        public static void CalculateSensivity(K_DataManager.OuterData outerData, double h)
        {
            //Sensitivity data initialization
            K_Forecast.UpdateInsertSensitivityData(K_DataManager.sensitivityIndexes.Values.ToArray<int>());

            //Adding h to indexes`
            foreach (int indexID in K_DataManager.sensitivityIndexes.Values)
            {
                //TODO: Maybe h% from AVG value
                var query = String.Format(@"Select AVG(Value) from SeriesScenarioValues where SeriesID = {0} and FrequencyID = {1} and Date >= '{2}' and Value <> 0 group by SeriesID", indexID, outerData.FrequencyID, outerData.StartDateForecast);
                double v0 = Convert.ToDouble(K_DataManager.ExecuteSQLQuery(query));
                double delta = h * (v0 == 0 ? 1 : v0);

                //K_DataManager.ExecuteSQLQuery(String.Format(@"update SeriesScenarioValues set Value = Value + {0} where SeriesID = {1} and FrequencyID = {2} and Date >= '{3}' and Date <= '{4}'",
                //    h, indexID, outerData.FrequencyID, outerData.StartDateForecast, outerData.EndDateForecast));

                K_DataManager.K_DataModel.SeriesScenarioValues.Where(s => s.SeriesID == indexID && s.FrequencyID == outerData.FrequencyID && s.Date >= outerData.StartDate && s.Date <= outerData.EndDate).ToList().ForEach(i => i.Value += delta);
               // K_DataManager.K_DataModel.SaveChanges();

                // Save indices restore values
                var linkedIndexIDs = K_DataManager.GetLinkedIndicies(indexID).ToList();

                //Calculate linked indices
                outerData.SeriesID = indexID;
                K_DataManager.CalculateLinkedIndicies(outerData);
                //Calculate assets linked with index
                var calculatedAssets = K_Forecast.CalculateAssetsByIndex(linkedIndexIDs, outerData);

                K_Forecast.CalculateItem(outerData);
                K_Forecast.UpdateInsertSensitivityData(K_DataManager.sensitivityIndexes.Values.ToArray<int>(), indexID);

                K_DataManager.K_DataModel.SeriesScenarioValues.Where(s => s.SeriesID == indexID && s.FrequencyID == outerData.FrequencyID && s.Date >= outerData.StartDate && s.Date <= outerData.EndDate).ToList().ForEach(i => i.Value -= delta);
                K_DataManager.K_DataModel.SaveChanges();

                // Restore linked and base indices values
                if (linkedIndexIDs.Count > 0)
                {
                    K_DataManager.ExecuteSQLQuery(String.Format(@"delete from SeriesScenarioValues where SeriesID in ({0}) and FrequencyID = {1} and Date >= '{2}' and Date <= '{3}'",
                        String.Join(",", linkedIndexIDs), outerData.FrequencyID, outerData.StartDateForecast, outerData.EndDateForecast));
                    query = String.Format(@"insert into SeriesScenarioValues select [SeriesID],[FrequencyID],[Date],[ScenarioNumber],[Value],RestoreValue=NULL  from SeriesRestoreValues where SeriesID in ({0}) and FrequencyID = {1} and Date >= '{2}' and Date <= '{3}'",
                        String.Join(",", linkedIndexIDs), outerData.FrequencyID, outerData.StartDateForecast, outerData.EndDateForecast);
                    K_DataManager.ExecuteSQLQuery(query);
                    // Restore changed assets
                    K_Forecast.RestoreAssetValues(calculatedAssets, outerData.StartDateForecast, outerData.EndDateForecast);
                }

                //K_DataManager.ExecuteSQLQuery(String.Format(@"Update Sensitivity set h = {0} where seriesID = {1}", h, indexID));
                K_DataManager.K_DataModel.Sensitivities.Where(s => s.SeriesID == indexID).ToList().ForEach(i => i.h = delta);
                K_DataManager.K_DataModel.SaveChanges();
            }

            // TODO: Delete restore infor from series assets items
            K_DataManager.K_DataModel.Sensitivities.Where(s =>
                K_DataManager.K_DataModel.BudgetItems.Where(b => K_DataManager.CompanyList.Contains(b.CompanyID.ToString())).Select(b => b.BudgetItemID).Contains(s.BudgetItemID)).ToList().ForEach(i => i.Sensitivity1 = Math.Round((i.NewValue.Value - i.OldValue.Value) / i.h.Value, 3));
            K_DataManager.K_DataModel.SaveChanges();

            //            K_DataManager.ExecuteSQLQuery(String.Format(@"update Sensitivity set Sensitivity = round((NewValue - OldValue)/h, 3)
            //                                                        where BudgetItemID in (select BudgetItemID from BudgetItems where CompanyID in ({0}))", K_DataManager.CompanyList));
        }
Пример #6
0
        /// <summary>
        /// Calculate all assets linked with items
        /// </summary>
        /// <param name="outerData"></param>
        /// <param name="items"></param>
        public static void CalculateLinkedAssets(K_DataManager.OuterData outerData, List<string> items, bool isSaveRestore = false)
        {
            var calculatedAssetIDsByType = new Dictionary<string, HashSet<int>>();

            foreach (var item in items)
            {
                if (!K_DataManager.AssetsByItemCode.ContainsKey(item))
                    continue;
                foreach (var assetType in K_DataManager.AssetsByItemCode[item])
                {
                    var calculatedIDs = new HashSet<int>();
                    foreach (var assetID in assetType.Value)
                    {
                        if (calculatedAssetIDsByType.ContainsKey(assetType.Key) && calculatedAssetIDsByType[assetType.Key].Contains(assetID))
                            continue;

                        K_DataManager.CalculateFinancialInstruments(assetID, assetType.Key, DateTime.Parse(outerData.StartDateForecast), 1, outerData.FrequencyID);
                        calculatedIDs.Add(assetID);
                    }

                    if (calculatedIDs.Count == 0)
                        continue;

                    if (calculatedAssetIDsByType.ContainsKey(assetType.Key))
                    {
                        calculatedAssetIDsByType[assetType.Key].UnionWith(calculatedIDs);
                    }
                    else
                    {
                        calculatedAssetIDsByType.Add(assetType.Key, calculatedIDs);
                    }
                }
            }
            if (isSaveRestore)
            {
                K_Forecast.SaveAssetRestoreValues(calculatedAssetIDsByType, outerData.StartDateForecast, outerData.EndDateForecast);
            }
        }