private void outcome_sampling_button_Click(object sender, EventArgs e) { DataminingInputDialog id = new DataminingInputDialog(new string[] { "instrument", "steps", "indicatorid", "outcometimeframe" }, dataminingDb.getInfo()); id.ShowDialog(); if (id.isValidResult()) { new Thread(delegate() { Dictionary <string, string> parameters = id.getResult(); if (Directory.Exists(Application.StartupPath + @"\Analysis\") == false) { Directory.CreateDirectory(Application.StartupPath + @"\Analysis\"); } SampleOutcomeExcelGenerator excel = new SampleOutcomeExcelGenerator(Application.StartupPath + @"\Analysis\" + DateTime.Now.ToString("yyyy_dd_mm") + "_" + parameters["instrument"] + ".xls"); setState("Outcomesampling"); dataminingDb.getOutcomeIndicatorSampling(excel, parameters["indicatorid"], Convert.ToInt32(parameters["outcometimeframe"]), Convert.ToInt32(parameters["steps"]), dataminingDb.getInfo(parameters["indicatorid"]).getDecentRange(), parameters["instrument"]); excel.FinishDoc(); excel.ShowDocument(); }).Start(); } }
void IDataminingDatabase.getOutcomeIndicatorSampling(SampleOutcomeExcelGenerator excel, string indicatorId, int outcomeTimeframe, string instument) { throw new NotImplementedException(); }
void IDataminingDatabase.getOutcomeIndicatorSampling(SampleOutcomeExcelGenerator excel, double min, double max, int steps, string indicatorId, int outcomeTimeframe, string instument) { List <Thread> threads = new List <Thread>(); string sheetName = indicatorId + "_" + outcomeTimeframe + "_" + instument; if (sheetName.Length >= 30) { sheetName = sheetName.Substring(0, 29); } excel.CreateSheet(sheetName); var collection = mongodb.getDB().GetCollection("prices"); double stepsize = (Convert.ToDouble(max - min) / Convert.ToDouble(steps)); int startedThreads = 0; double current = min; while (current <= max) { startedThreads++; double valueMin = current; double valueMax = current + stepsize; Thread thread = new Thread(delegate() { instument = null; IMongoQuery query = Query.And(Query.Exists(indicatorId), Query.Exists("last"), Query.Exists("outcome_actual_" + outcomeTimeframe), Query.Exists("outcome_max_" + outcomeTimeframe), Query.Exists("outcome_min_" + outcomeTimeframe), Query.LT(indicatorId, valueMax), Query.GTE(indicatorId, valueMin)); if (instument != null) { query = Query.And(query, Query.EQ("instrument", instument)); } var docs = collection.FindAs <BsonDocument>(query); double sumMax = 0d, sumMin = 0d, sumActual = 0d; double count = docs.Count(); foreach (BsonDocument doc in docs) { double onePercent = doc["last"].AsDouble / 100d; double maxDiff = doc["outcome_max_" + outcomeTimeframe].AsDouble / onePercent - 100d; //calculate percent difference double minDiff = doc["outcome_min_" + outcomeTimeframe].AsDouble / onePercent - 100d; double actualDiff = doc["outcome_actual_" + outcomeTimeframe].AsDouble / onePercent - 100d; sumMax += maxDiff; sumMin += minDiff; sumActual += actualDiff; } if (count == 0) { excel.addRow(sheetName, 0, 0, 0, 0, 0, 0, 0, 0); } else { double maxAvg = sumMax / count; double minAvg = sumMin / count; double actualAvg = sumActual / count; double minVsMax = sumMin + sumMax / count; excel.addRow(sheetName, valueMin, valueMax, Convert.ToInt32(count), maxAvg, minAvg, minVsMax, actualAvg, (maxAvg + minAvg)); } }); thread.Start(); threads.Add(thread); current += stepsize; } //Darstellungsthread waitForThreads(threads); excel.FinishSheet(sheetName); }