/// <summary> /// Filters loaded data based on a given criteria set /// </summary> /// <param name="vm"></param> private void FilterStudentsByGrade(TimelineAnalysisViewModel vm) { //present options to filter by List <string> gradingCriteria = vm.GetAllGrades(); Console.WriteLine("***Grading Categories***"); for (int i = 0; i < gradingCriteria.Count; i++) { Console.WriteLine("{0}: {1}", i, gradingCriteria[i]); } Console.Write("Select category: "); string categoryStr = Console.ReadLine(); //ask for min/max filter Console.Write("Enter max score [100%]: "); string maxScoreStr = Console.ReadLine(); Console.Write("Enter min score [0%]: "); string minScoreStr = Console.ReadLine(); //parse strings, send off to VM for processing int category = -1; double maxScore = 200; double minScore = 0; if (Int32.TryParse(categoryStr, out category) && category > -1) { if (Double.TryParse(maxScoreStr, out maxScore) == false) { maxScore = 200; } if (Double.TryParse(minScoreStr, out minScore) == false) { minScore = 0; } int result = vm.FilterByGrade(gradingCriteria[category], minScore, maxScore); Console.WriteLine("{0} entries removed from dataset.", result); } else { Console.WriteLine("Error parsing user input."); } }
/// <summary> /// Locates common transition sequence cycles /// </summary> /// <param name="vm"></param> private void LocateCommonTransitionCycles(TimelineAnalysisViewModel vm) { //write results to a file vm.NormalizeProgrammingStates(); vm.AttachGrades(); CsvWriter writer = new CsvWriter(); //build header writer.AddToCurrentLine("UserId"); writer.AddToCurrentLine("TotalTimeProgramming"); writer.AddToCurrentLine("NumberOfCycles"); foreach (string[] sequence in vm.InterestingSequences) { string sequenceHeader = String.Join("_", sequence); writer.AddToCurrentLine("Time_" + sequenceHeader); writer.AddToCurrentLine("NormalizedTime_" + sequenceHeader); writer.AddToCurrentLine("Count_" + sequenceHeader); writer.AddToCurrentLine("NormalizedCount_" + sequenceHeader); } writer.AddToCurrentLine("CycleTime"); writer.AddToCurrentLine("PercentTimeAccountedFor"); //add grades if loaded List <string> grades = vm.GetAllGrades(); foreach (string grade in grades) { writer.AddToCurrentLine(grade); } writer.CreateNewRow(); //write data cells foreach (int userId in vm.StatesByUser.Keys) { writer.AddToCurrentLine(userId); //get total time spent programming StudentTimeline userTimeline = vm.Timeline[userId]; TimelineState timeState = userTimeline.GetAggregateState("normalized_total_time"); TimeSpan totalTime = timeState.EndTime - timeState.StartTime; writer.AddToCurrentLine(totalTime.TotalMinutes); TimeSpan cycleTime = new TimeSpan(); //and total number of cycles int totalCycles = 0; foreach (string[] sequence in vm.InterestingSequences) { string sequenceKey = String.Join("_", sequence); totalCycles += vm.StatesByUser[userId][sequenceKey].Count; } writer.AddToCurrentLine(totalCycles); //write total time spent in cycle foreach (string[] sequence in vm.InterestingSequences) { string sequenceKey = String.Join("_", sequence); TimeSpan sequenceTime = new TimeSpan(); foreach (PatternParserResult pattern in vm.StatesByUser[userId][sequenceKey]) { foreach (TimelineState state in pattern.StateSequence) { if (state.EndTime < state.StartTime) { throw new Exception("EndTime must be larger than StartTime"); } sequenceTime += state.EndTime - state.StartTime; } } cycleTime += sequenceTime; //total time writer.AddToCurrentLine(sequenceTime.TotalMinutes); //normalized time writer.AddToCurrentLine(Math.Round((sequenceTime.TotalMinutes / totalTime.TotalMinutes) * 100, 2)); //count writer.AddToCurrentLine(vm.StatesByUser[userId][sequenceKey].Count); //normalized count double normalizedCount = ((vm.StatesByUser[userId][sequenceKey].Count) / (double)totalCycles) * 100; writer.AddToCurrentLine(Math.Round(normalizedCount, 2)); } writer.AddToCurrentLine(cycleTime.TotalMinutes); writer.AddToCurrentLine(Math.Round((cycleTime.TotalMinutes / totalTime.TotalMinutes) * 100, 2)); //add grade information foreach (string grade in grades) { if (userTimeline.Grades.ContainsKey(grade) == true) { writer.AddToCurrentLine(userTimeline.Grades[grade].ToString()); } else { writer.AddToCurrentLine("0"); } } writer.CreateNewRow(); } using (TextWriter tw = File.CreateText("sequence_cycles.csv")) { tw.Write(writer.ToString()); } Console.WriteLine("Finished locating sequences."); }