/// <summary> /// Downloads and imports the real NBA stats of a specific team and its players. /// </summary> /// <param name="teamAbbr">The team name-abbreviation KeyValuePair.</param> /// <param name="ts">The resulting team stats instance.</param> /// <param name="tsopp">The opposing team stats instance.</param> /// <param name="pst">The resulting player stats dictionary.</param> public static void ImportRealStats(KeyValuePair<string, string> teamAbbr, out TeamStats ts, out TeamStats tsopp, out Dictionary<int, PlayerStats> pst) { string[] recordparts; DataSet ds = getSeasonTeamStats(@"http://www.basketball-reference.com/teams/" + teamAbbr.Value + @"/2013.html", out recordparts); teamStatsFromDataTable(ds.Tables[0], teamAbbr.Key, recordparts, out ts, out tsopp); ds = getPlayerStats(@"http://www.basketball-reference.com/teams/" + teamAbbr.Value + @"/2013.html"); playerStatsFromDataSet(ds, ts.ID, out pst); }
/// <summary> /// Initializes a new instance of the <see cref="MainWindow" /> class. Creates the program's documents directories if needed, /// initializes structures, and loads the settings from registry. /// </summary> public MainWindow() { InitializeComponent(); MWInstance = this; TempBSE_BS = new TeamBoxScore(); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US"); setDefaultCulture(CultureInfo.CreateSpecificCulture("en-US")); //btnInject.Visibility = Visibility.Hidden; #if DEBUG btnTest.Visibility = Visibility.Visible; #else btnTest.Visibility = Visibility.Hidden; #endif if (Directory.Exists(PSFiltersPath) == false) { Directory.CreateDirectory(PSFiltersPath); } if (Directory.Exists(ASCFiltersPath) == false) { Directory.CreateDirectory(ASCFiltersPath); } var appTempPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\NBA Stats Tracker\" + @"Temp\"; if (Directory.Exists(appTempPath) == false) { Directory.CreateDirectory(appTempPath); } TST[0] = new TeamStats(-1, "$$NewDB"); TSTOpp[0] = new TeamStats(-1, "$$NewDB"); for (var i = 0; i < 30; i++) { RealTST[i] = new TeamStats(); } RegistryKey rk = null; try { rk = Registry.CurrentUser; } catch (Exception ex) { App.ForceCriticalError(ex, "Registry.CurrentUser"); } Debug.Assert(rk != null, "rk != null"); rk = rk.OpenSubKey(@"SOFTWARE\2K Sports\NBA 2K12"); if (rk == null) { SavesPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\2K Sports\NBA 2K12\Saves\"; } else { try { SavesPath = rk.GetValue("Saves").ToString(); } catch (Exception) { SavesPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\2K Sports\NBA 2K12\Saves\"; } } CSV.ReplaceREDitorSortingChars = true; if (App.RealNBAOnly) { mnuFileGetRealStats_Click(null, null); MessageBox.Show("Nothing but net! Thanks for using NBA Stats Tracker!"); Environment.Exit(-1); } else { var exportTeamsOnly = Tools.GetRegistrySetting("ExportTeamsOnly", 1); mnuOptionsExportTeamsOnly.IsChecked = exportTeamsOnly == 1; var compatibilityCheck = Tools.GetRegistrySetting("CompatibilityCheck", 1); mnuOptionsCompatibilityCheck.IsChecked = compatibilityCheck == 1; IsImperial = Tools.GetRegistrySetting("IsImperial", 1) == 1; mnuOptionsIsImperial.IsChecked = IsImperial; // Displays a message to urge the user to donate at the 50th start of the program. var timesStarted = Tools.GetRegistrySetting("TimesStarted", -1); if (timesStarted == -1) { Tools.SetRegistrySetting("TimesStarted", 1); } else if (timesStarted <= 50) { if (timesStarted == 50) { var r = MessageBox.Show( "Hey there! This is a friendly reminder from the creator of NBA Stats Tracker.\n\n" + "You seem to like using NBA Stats Tracker a lot, and I'm sure you enjoy the fact that it's free. " + "However, if you believe that I deserve your support and you want to help me to continue my studies, " + "as well as continue developing and supporting NBA Stats Tracker, you can always donate!\n\n" + "Even a small amount can help a lot!\n\n" + "Would you like to find out how you can donate?\n\n" + "Clicking Cancel will make sure this message never shows up again.", "NBA Stats Tracker - A friendly reminder", MessageBoxButton.YesNoCancel, MessageBoxImage.Information); if (r == MessageBoxResult.Yes) { mnuHelpDonate_Click(null, null); } else if (r == MessageBoxResult.No) { timesStarted = -1; } } Tools.SetRegistrySetting("TimesStarted", timesStarted + 1); } } UIScheduler = TaskScheduler.FromCurrentSynchronizationContext(); SearchCache = new List<SearchItem>(); #region Keyboard Shortcuts CmndImport.InputGestures.Add(new KeyGesture(Key.I, ModifierKeys.Control)); CommandBindings.Add(new CommandBinding(CmndImport, btnImport2K12_Click)); CmndExport.InputGestures.Add(new KeyGesture(Key.E, ModifierKeys.Control)); CommandBindings.Add(new CommandBinding(CmndExport, btnExport2K12_Click)); CmndOpen.InputGestures.Add(new KeyGesture(Key.O, ModifierKeys.Control)); CommandBindings.Add(new CommandBinding(CmndOpen, btnOpen_Click)); CmndSave.InputGestures.Add(new KeyGesture(Key.S, ModifierKeys.Control)); CommandBindings.Add(new CommandBinding(CmndSave, btnSaveCurrentSeason_Click)); CmndFind.InputGestures.Add(new KeyGesture(Key.F, ModifierKeys.Control)); CommandBindings.Add(new CommandBinding(CmndFind, QuickFind)); #endregion //prepareImageCache(); }
/// <summary>Adds the team stats from a TeamStats instance to the current stats.</summary> /// <param name="rhs">The team stats to add.</param> /// <param name="mode">The time-span.</param> /// <exception cref="System.Exception">Team Add Stats called with invalid parameter.</exception> public void AddTeamStats(TeamStats rhs, Span mode) { switch (mode) { case Span.Season: { Record[0] += rhs.Record[0]; Record[1] += rhs.Record[1]; for (var i = 0; i < Totals.Length; i++) { Totals[i] += rhs.Totals[i]; } CalcAvg(); break; } case Span.Playoffs: { PlRecord[0] += rhs.PlRecord[0]; PlRecord[1] += rhs.PlRecord[1]; for (var i = 0; i < PlTotals.Length; i++) { PlTotals[i] += rhs.PlTotals[i]; } CalcAvg(); break; } case Span.SeasonAndPlayoffsToSeason: { Record[0] += rhs.Record[0]; Record[1] += rhs.Record[1]; for (var i = 0; i < Totals.Length; i++) { Totals[i] += rhs.Totals[i]; } Record[0] += rhs.PlRecord[0]; Record[1] += rhs.PlRecord[1]; for (var i = 0; i < PlTotals.Length; i++) { Totals[i] += rhs.PlTotals[i]; } CalcAvg(); break; } case Span.SeasonAndPlayoffs: { AddTeamStats(rhs, Span.Season); AddTeamStats(rhs, Span.Playoffs); break; } default: { throw new Exception("Team Add Stats called with invalid parameter: " + mode); } } }
/// <summary>Adds the team stats from a box score.</summary> /// <param name="bsToAdd">The box score to add.</param> /// <param name="ts1">The first team's team stats.</param> /// <param name="ts2">The second team's team stats.</param> /// <param name="ignorePlayoffFlag">Whether to ignore the playoff flag in the box score and add the stats to the season totals.</param> public static void AddTeamStatsFromBoxScore( TeamBoxScore bsToAdd, ref TeamStats ts1, ref TeamStats ts2, bool ignorePlayoffFlag = false) { var tst = new Dictionary<int, TeamStats> { { 1, ts1 }, { 2, ts2 } }; var tstOpp = new Dictionary<int, TeamStats> { { 1, new TeamStats() }, { 2, new TeamStats() } }; AddTeamStatsFromBoxScore(bsToAdd, ref tst, ref tstOpp, 1, 2, ignorePlayoffFlag); ts1 = tst[1]; ts2 = tst[2]; }
/// <summary>Adds a box score resulting from an SQLite query to a TeamStats instance.</summary> /// <param name="r">The result of the query containing the box score record.</param> /// <param name="ts">The TeamStats instance to be modified.</param> /// <param name="tsopp">The opposing TeamStats instance to be modified.</param> private static void addToTeamStatsFromSQLBoxScore(DataRow r, ref TeamStats ts, ref TeamStats tsopp) { var playoffs = ParseCell.GetBoolean(r, "isPlayoff"); if (!playoffs) { var t1PTS = Convert.ToInt32(r["T1PTS"].ToString()); var t2PTS = Convert.ToInt32(r["T2PTS"].ToString()); if (r["T1Name"].ToString().Equals(ts.Name)) { if (t1PTS > t2PTS) { ts.Record[0]++; } else { ts.Record[1]++; } tsopp.Totals[TAbbrT.MINS] = ts.Totals[TAbbrT.MINS] += Convert.ToUInt16(r["T1MINS"].ToString()); tsopp.Totals[TAbbrT.PA] = ts.Totals[TAbbrT.PF] += Convert.ToUInt16(r["T1PTS"].ToString()); tsopp.Totals[TAbbrT.PF] = ts.Totals[TAbbrT.PA] += Convert.ToUInt16(r["T2PTS"].ToString()); ts.Totals[TAbbrT.FGM] += Convert.ToUInt16(r["T1FGM"].ToString()); ts.Totals[TAbbrT.FGA] += Convert.ToUInt16(r["T1FGA"].ToString()); ts.Totals[TAbbrT.TPM] += Convert.ToUInt16(r["T13PM"].ToString()); ts.Totals[TAbbrT.TPA] += Convert.ToUInt16(r["T13PA"].ToString()); ts.Totals[TAbbrT.FTM] += Convert.ToUInt16(r["T1FTM"].ToString()); ts.Totals[TAbbrT.FTA] += Convert.ToUInt16(r["T1FTA"].ToString()); var t1REB = Convert.ToUInt16(r["T1REB"].ToString()); var t1OREB = Convert.ToUInt16(r["T1OREB"].ToString()); ts.Totals[TAbbrT.DREB] += (ushort) (t1REB - t1OREB); ts.Totals[TAbbrT.OREB] += t1OREB; ts.Totals[TAbbrT.STL] += Convert.ToUInt16(r["T1STL"].ToString()); ts.Totals[TAbbrT.TOS] += Convert.ToUInt16(r["T1TOS"].ToString()); ts.Totals[TAbbrT.BLK] += ParseCell.GetUInt16(r, "T1BLK"); ts.Totals[TAbbrT.AST] += ParseCell.GetUInt16(r, "T1AST"); ts.Totals[TAbbrT.FOUL] += ParseCell.GetUInt16(r, "T1FOUL"); tsopp.Totals[TAbbrT.FGM] += Convert.ToUInt16(r["T2FGM"].ToString()); tsopp.Totals[TAbbrT.FGA] += Convert.ToUInt16(r["T2FGA"].ToString()); tsopp.Totals[TAbbrT.TPM] += Convert.ToUInt16(r["T23PM"].ToString()); tsopp.Totals[TAbbrT.TPA] += Convert.ToUInt16(r["T23PA"].ToString()); tsopp.Totals[TAbbrT.FTM] += Convert.ToUInt16(r["T2FTM"].ToString()); tsopp.Totals[TAbbrT.FTA] += Convert.ToUInt16(r["T2FTA"].ToString()); var t2REB = Convert.ToUInt16(r["T2REB"].ToString()); var t2OREB = Convert.ToUInt16(r["T2OREB"].ToString()); tsopp.Totals[TAbbrT.DREB] += (ushort) (t2REB - t2OREB); tsopp.Totals[TAbbrT.OREB] += t2OREB; tsopp.Totals[TAbbrT.STL] += Convert.ToUInt16(r["T2STL"].ToString()); tsopp.Totals[TAbbrT.TOS] += Convert.ToUInt16(r["T2TOS"].ToString()); tsopp.Totals[TAbbrT.BLK] += ParseCell.GetUInt16(r, "T2BLK"); tsopp.Totals[TAbbrT.AST] += ParseCell.GetUInt16(r, "T2AST"); tsopp.Totals[TAbbrT.FOUL] += ParseCell.GetUInt16(r, "T2FOUL"); } else { if (t2PTS > t1PTS) { ts.Record[0]++; } else { ts.Record[1]++; } tsopp.Totals[TAbbrT.MINS] = ts.Totals[TAbbrT.MINS] += Convert.ToUInt16(r["T2MINS"].ToString()); tsopp.Totals[TAbbrT.PA] = ts.Totals[TAbbrT.PF] += Convert.ToUInt16(r["T2PTS"].ToString()); tsopp.Totals[TAbbrT.PF] = ts.Totals[TAbbrT.PA] += Convert.ToUInt16(r["T1PTS"].ToString()); ts.Totals[TAbbrT.FGM] += Convert.ToUInt16(r["T2FGM"].ToString()); ts.Totals[TAbbrT.FGA] += Convert.ToUInt16(r["T2FGA"].ToString()); ts.Totals[TAbbrT.TPM] += Convert.ToUInt16(r["T23PM"].ToString()); ts.Totals[TAbbrT.TPA] += Convert.ToUInt16(r["T23PA"].ToString()); ts.Totals[TAbbrT.FTM] += Convert.ToUInt16(r["T2FTM"].ToString()); ts.Totals[TAbbrT.FTA] += Convert.ToUInt16(r["T2FTA"].ToString()); var t2REB = Convert.ToUInt16(r["T2REB"].ToString()); var t2OREB = Convert.ToUInt16(r["T2OREB"].ToString()); ts.Totals[TAbbrT.DREB] += (ushort) (t2REB - t2OREB); ts.Totals[TAbbrT.OREB] += t2OREB; ts.Totals[TAbbrT.STL] += Convert.ToUInt16(r["T2STL"].ToString()); ts.Totals[TAbbrT.TOS] += Convert.ToUInt16(r["T2TOS"].ToString()); ts.Totals[TAbbrT.BLK] += ParseCell.GetUInt16(r, "T2BLK"); ts.Totals[TAbbrT.AST] += ParseCell.GetUInt16(r, "T2AST"); ts.Totals[TAbbrT.FOUL] += ParseCell.GetUInt16(r, "T2FOUL"); tsopp.Totals[TAbbrT.FGM] += Convert.ToUInt16(r["T1FGM"].ToString()); tsopp.Totals[TAbbrT.FGA] += Convert.ToUInt16(r["T1FGA"].ToString()); tsopp.Totals[TAbbrT.TPM] += Convert.ToUInt16(r["T13PM"].ToString()); tsopp.Totals[TAbbrT.TPA] += Convert.ToUInt16(r["T13PA"].ToString()); tsopp.Totals[TAbbrT.FTM] += Convert.ToUInt16(r["T1FTM"].ToString()); tsopp.Totals[TAbbrT.FTA] += Convert.ToUInt16(r["T1FTA"].ToString()); var t1REB = Convert.ToUInt16(r["T1REB"].ToString()); var t1OREB = Convert.ToUInt16(r["T1OREB"].ToString()); tsopp.Totals[TAbbrT.DREB] += (ushort) (t1REB - t1OREB); tsopp.Totals[TAbbrT.OREB] += t1OREB; tsopp.Totals[TAbbrT.STL] += Convert.ToUInt16(r["T1STL"].ToString()); tsopp.Totals[TAbbrT.TOS] += Convert.ToUInt16(r["T1TOS"].ToString()); tsopp.Totals[TAbbrT.BLK] += ParseCell.GetUInt16(r, "T1BLK"); tsopp.Totals[TAbbrT.AST] += ParseCell.GetUInt16(r, "T1AST"); tsopp.Totals[TAbbrT.FOUL] += ParseCell.GetUInt16(r, "T1FOUL"); } tsopp.Record[1] = ts.Record[0]; tsopp.Record[0] = ts.Record[1]; } else { var t1PTS = Convert.ToInt32(r["T1PTS"].ToString()); var t2PTS = Convert.ToInt32(r["T2PTS"].ToString()); if (r["T1Name"].ToString().Equals(ts.Name)) { if (t1PTS > t2PTS) { ts.PlRecord[0]++; } else { ts.PlRecord[1]++; } tsopp.PlTotals[TAbbrT.MINS] = ts.PlTotals[TAbbrT.MINS] += Convert.ToUInt16(r["T1MINS"].ToString()); tsopp.PlTotals[TAbbrT.PA] = ts.PlTotals[TAbbrT.PF] += Convert.ToUInt16(r["T1PTS"].ToString()); tsopp.PlTotals[TAbbrT.PF] = ts.PlTotals[TAbbrT.PA] += Convert.ToUInt16(r["T2PTS"].ToString()); ts.PlTotals[TAbbrT.FGM] += Convert.ToUInt16(r["T1FGM"].ToString()); ts.PlTotals[TAbbrT.FGA] += Convert.ToUInt16(r["T1FGA"].ToString()); ts.PlTotals[TAbbrT.TPM] += Convert.ToUInt16(r["T13PM"].ToString()); ts.PlTotals[TAbbrT.TPA] += Convert.ToUInt16(r["T13PA"].ToString()); ts.PlTotals[TAbbrT.FTM] += Convert.ToUInt16(r["T1FTM"].ToString()); ts.PlTotals[TAbbrT.FTA] += Convert.ToUInt16(r["T1FTA"].ToString()); var t1REB = Convert.ToUInt16(r["T1REB"].ToString()); var t1OREB = Convert.ToUInt16(r["T1OREB"].ToString()); ts.PlTotals[TAbbrT.DREB] += (ushort) (t1REB - t1OREB); ts.PlTotals[TAbbrT.OREB] += t1OREB; ts.PlTotals[TAbbrT.STL] += Convert.ToUInt16(r["T1STL"].ToString()); ts.PlTotals[TAbbrT.TOS] += Convert.ToUInt16(r["T1TOS"].ToString()); ts.PlTotals[TAbbrT.BLK] += ParseCell.GetUInt16(r, "T1BLK"); ts.PlTotals[TAbbrT.AST] += ParseCell.GetUInt16(r, "T1AST"); ts.PlTotals[TAbbrT.FOUL] += ParseCell.GetUInt16(r, "T1FOUL"); tsopp.PlTotals[TAbbrT.FGM] += Convert.ToUInt16(r["T2FGM"].ToString()); tsopp.PlTotals[TAbbrT.FGA] += Convert.ToUInt16(r["T2FGA"].ToString()); tsopp.PlTotals[TAbbrT.TPM] += Convert.ToUInt16(r["T23PM"].ToString()); tsopp.PlTotals[TAbbrT.TPA] += Convert.ToUInt16(r["T23PA"].ToString()); tsopp.PlTotals[TAbbrT.FTM] += Convert.ToUInt16(r["T2FTM"].ToString()); tsopp.PlTotals[TAbbrT.FTA] += Convert.ToUInt16(r["T2FTA"].ToString()); var t2REB = Convert.ToUInt16(r["T2REB"].ToString()); var t2OREB = Convert.ToUInt16(r["T2OREB"].ToString()); tsopp.PlTotals[TAbbrT.DREB] += (ushort) (t2REB - t2OREB); tsopp.PlTotals[TAbbrT.OREB] += t2OREB; tsopp.PlTotals[TAbbrT.STL] += Convert.ToUInt16(r["T2STL"].ToString()); tsopp.PlTotals[TAbbrT.TOS] += Convert.ToUInt16(r["T2TOS"].ToString()); tsopp.PlTotals[TAbbrT.BLK] += ParseCell.GetUInt16(r, "T2BLK"); tsopp.PlTotals[TAbbrT.AST] += ParseCell.GetUInt16(r, "T2AST"); tsopp.PlTotals[TAbbrT.FOUL] += ParseCell.GetUInt16(r, "T2FOUL"); } else { if (t2PTS > t1PTS) { ts.PlRecord[0]++; } else { ts.PlRecord[1]++; } tsopp.PlTotals[TAbbrT.MINS] = ts.PlTotals[TAbbrT.MINS] += Convert.ToUInt16(r["T2MINS"].ToString()); tsopp.PlTotals[TAbbrT.PA] = ts.PlTotals[TAbbrT.PF] += Convert.ToUInt16(r["T2PTS"].ToString()); tsopp.PlTotals[TAbbrT.PF] = ts.PlTotals[TAbbrT.PA] += Convert.ToUInt16(r["T1PTS"].ToString()); ts.PlTotals[TAbbrT.FGM] += Convert.ToUInt16(r["T2FGM"].ToString()); ts.PlTotals[TAbbrT.FGA] += Convert.ToUInt16(r["T2FGA"].ToString()); ts.PlTotals[TAbbrT.TPM] += Convert.ToUInt16(r["T23PM"].ToString()); ts.PlTotals[TAbbrT.TPA] += Convert.ToUInt16(r["T23PA"].ToString()); ts.PlTotals[TAbbrT.FTM] += Convert.ToUInt16(r["T2FTM"].ToString()); ts.PlTotals[TAbbrT.FTA] += Convert.ToUInt16(r["T2FTA"].ToString()); var t2REB = Convert.ToUInt16(r["T2REB"].ToString()); var t2OREB = Convert.ToUInt16(r["T2OREB"].ToString()); ts.PlTotals[TAbbrT.DREB] += (ushort) (t2REB - t2OREB); ts.PlTotals[TAbbrT.OREB] += t2OREB; ts.PlTotals[TAbbrT.STL] += Convert.ToUInt16(r["T2STL"].ToString()); ts.PlTotals[TAbbrT.TOS] += Convert.ToUInt16(r["T2TOS"].ToString()); ts.PlTotals[TAbbrT.BLK] += ParseCell.GetUInt16(r, "T2BLK"); ts.PlTotals[TAbbrT.AST] += ParseCell.GetUInt16(r, "T2AST"); ts.PlTotals[TAbbrT.FOUL] += ParseCell.GetUInt16(r, "T2FOUL"); tsopp.PlTotals[TAbbrT.FGM] += Convert.ToUInt16(r["T1FGM"].ToString()); tsopp.PlTotals[TAbbrT.FGA] += Convert.ToUInt16(r["T1FGA"].ToString()); tsopp.PlTotals[TAbbrT.TPM] += Convert.ToUInt16(r["T13PM"].ToString()); tsopp.PlTotals[TAbbrT.TPA] += Convert.ToUInt16(r["T13PA"].ToString()); tsopp.PlTotals[TAbbrT.FTM] += Convert.ToUInt16(r["T1FTM"].ToString()); tsopp.PlTotals[TAbbrT.FTA] += Convert.ToUInt16(r["T1FTA"].ToString()); var t1REB = Convert.ToUInt16(r["T1REB"].ToString()); var t1OREB = Convert.ToUInt16(r["T1OREB"].ToString()); tsopp.PlTotals[TAbbrT.DREB] += (ushort) (t1REB - t1OREB); tsopp.PlTotals[TAbbrT.OREB] += t1OREB; tsopp.PlTotals[TAbbrT.STL] += Convert.ToUInt16(r["T1STL"].ToString()); tsopp.PlTotals[TAbbrT.TOS] += Convert.ToUInt16(r["T1TOS"].ToString()); tsopp.PlTotals[TAbbrT.BLK] += ParseCell.GetUInt16(r, "T1BLK"); tsopp.PlTotals[TAbbrT.AST] += ParseCell.GetUInt16(r, "T1AST"); tsopp.PlTotals[TAbbrT.FOUL] += ParseCell.GetUInt16(r, "T1FOUL"); } tsopp.PlRecord[1] = ts.PlRecord[0]; tsopp.PlRecord[0] = ts.PlRecord[1]; } ts.CalcAvg(); tsopp.CalcAvg(); }
/// <summary>Determines whether a specific team should be shown or not, based on the current filter.</summary> /// <param name="ts">The team's TeamStats instance.</param> /// <returns>true if it should be shown; otherwise, false</returns> private bool inCurrentFilter(TeamStats ts) { if (_filterType == TeamFilter.League) { return true; } if (_filterType == TeamFilter.Conference) { var confID = -1; foreach (var conf in MainWindow.Conferences) { if (conf.Name == _filterDescription) { confID = conf.ID; break; } } var div = MainWindow.Divisions.Find(division => division.ID == ts.Division); if (div.ConferenceID == confID) { return true; } else { return false; } } else { var div = MainWindow.Divisions.Find(division => division.ID == ts.Division); if (div.Name == _filterDescription) { return true; } else { return false; } } }
/// <summary>Prepares the presentation fields of the class.</summary> /// <param name="teamID">The team.</param> public void PrepareForDisplay(Dictionary<int, TeamStats> tst, int teamID) { FGp1 = (float) FGM1 / FGA1; TPp1 = (float) TPM1 / TPA1; FTp1 = (float) FTM1 / FTA1; FGp2 = (float) FGM2 / FGA2; TPp2 = (float) TPM2 / TPA2; FTp2 = (float) FTM2 / FTA2; DREB1 = (ushort) (REB1 - OREB1); DREB2 = (ushort) (REB2 - OREB2); if (teamID == Team1ID) { DisplayTeam = tst[Team1ID].DisplayName; DisplayOpponent = tst[Team2ID].DisplayName; DisplayLocation = "Away"; DisplayResult = PTS1 > PTS2 ? "W " : "L "; DisplayREB = REB1; DisplayOREB = OREB1; DisplayAST = AST1; DisplayTO = TOS1; DisplayBLK = BLK1; DisplaySTL = STL1; DisplayFOUL = FOUL1; FGp = FGp1; TPp = TPp1; FTp = FTp1; var temp = new TeamStats(); var tempopp = new TeamStats(); TeamStats.AddTeamStatsFromBoxScore(this, ref temp, ref tempopp); temp.CalcMetrics(tempopp); tempopp.CalcMetrics(temp); DisplayGmSc = temp.Metrics["GmSc"]; GmSc1 = temp.Metrics["GmSc"]; GmSc2 = tempopp.Metrics["GmSc"]; } else { DisplayTeam = tst[Team2ID].DisplayName; DisplayOpponent = tst[Team1ID].DisplayName; DisplayLocation = "Home"; DisplayResult = PTS1 < PTS2 ? "W " : "L "; DisplayREB = REB2; DisplayOREB = OREB2; DisplayAST = AST2; DisplayTO = TOS2; DisplayBLK = BLK2; DisplaySTL = STL2; DisplayFOUL = FOUL2; FGp = FGp2; TPp = TPp2; FTp = FTp2; var temp = new TeamStats(); var tempopp = new TeamStats(); TeamStats.AddTeamStatsFromBoxScore(this, ref tempopp, ref temp); temp.CalcMetrics(tempopp); tempopp.CalcMetrics(temp); DisplayGmSc = temp.Metrics["GmSc"]; GmSc2 = temp.Metrics["GmSc"]; GmSc1 = tempopp.Metrics["GmSc"]; } DisplayResult += PTS1 + "-" + PTS2; }
/// <summary> /// Creates the team and opposing team stats instances using data from the downloaded DataTable. /// </summary> /// <param name="dt">The DataTable.</param> /// <param name="name">The name of the team.</param> /// <param name="recordparts">The parts of the team's record string.</param> /// <param name="ts">The resulting team stats instance.</param> /// <param name="tsopp">The resulting opposing team stats instance.</param> private static void teamStatsFromDataTable(DataTable dt, string name, string[] recordparts, out TeamStats ts, out TeamStats tsopp) { ts = new TeamStats(MainWindow.TST.Single(pair => pair.Value.Name == name).Key, name); tsopp = new TeamStats(MainWindow.TST.Single(pair => pair.Value.Name == name).Key, name); tsopp.Record[1] = ts.Record[0] = Convert.ToByte(recordparts[0]); tsopp.Record[0] = ts.Record[1] = Convert.ToByte(recordparts[1]); DataRow tr = dt.Rows[0]; DataRow toppr = dt.Rows[2]; ts.Totals[TAbbr.MINS] = (ushort) (ParseCell.GetUInt16(tr, "MP")/5); ts.Totals[TAbbr.FGM] = ParseCell.GetUInt16(tr, "FG"); ts.Totals[TAbbr.FGA] = ParseCell.GetUInt16(tr, "FGA"); ts.Totals[TAbbr.TPM] = ParseCell.GetUInt16(tr, "3P"); ts.Totals[TAbbr.TPA] = ParseCell.GetUInt16(tr, "3PA"); ts.Totals[TAbbr.FTM] = ParseCell.GetUInt16(tr, "FT"); ts.Totals[TAbbr.FTA] = ParseCell.GetUInt16(tr, "FTA"); ts.Totals[TAbbr.OREB] = ParseCell.GetUInt16(tr, "ORB"); ts.Totals[TAbbr.DREB] = ParseCell.GetUInt16(tr, "DRB"); ts.Totals[TAbbr.AST] = ParseCell.GetUInt16(tr, "AST"); ts.Totals[TAbbr.STL] = ParseCell.GetUInt16(tr, "STL"); ts.Totals[TAbbr.BLK] = ParseCell.GetUInt16(tr, "BLK"); ts.Totals[TAbbr.TOS] = ParseCell.GetUInt16(tr, "TOV"); ts.Totals[TAbbr.FOUL] = ParseCell.GetUInt16(tr, "PF"); ts.Totals[TAbbr.PF] = ParseCell.GetUInt16(tr, "PTS"); ts.Totals[TAbbr.PA] = ParseCell.GetUInt16(toppr, "PTS"); ts.CalcAvg(); tsopp.Totals[TAbbr.MINS] = (ushort) (ParseCell.GetUInt16(toppr, "MP")/5); tsopp.Totals[TAbbr.FGM] = ParseCell.GetUInt16(toppr, "FG"); tsopp.Totals[TAbbr.FGA] = ParseCell.GetUInt16(toppr, "FGA"); tsopp.Totals[TAbbr.TPM] = ParseCell.GetUInt16(toppr, "3P"); tsopp.Totals[TAbbr.TPA] = ParseCell.GetUInt16(toppr, "3PA"); tsopp.Totals[TAbbr.FTM] = ParseCell.GetUInt16(toppr, "FT"); tsopp.Totals[TAbbr.FTA] = ParseCell.GetUInt16(toppr, "FTA"); tsopp.Totals[TAbbr.OREB] = ParseCell.GetUInt16(toppr, "ORB"); tsopp.Totals[TAbbr.DREB] = ParseCell.GetUInt16(toppr, "DRB"); tsopp.Totals[TAbbr.AST] = ParseCell.GetUInt16(toppr, "AST"); tsopp.Totals[TAbbr.STL] = ParseCell.GetUInt16(toppr, "STL"); tsopp.Totals[TAbbr.BLK] = ParseCell.GetUInt16(toppr, "BLK"); tsopp.Totals[TAbbr.TOS] = ParseCell.GetUInt16(toppr, "TOV"); tsopp.Totals[TAbbr.FOUL] = ParseCell.GetUInt16(toppr, "PF"); tsopp.Totals[TAbbr.PF] = ParseCell.GetUInt16(toppr, "PTS"); tsopp.Totals[TAbbr.PA] = ParseCell.GetUInt16(tr, "PTS"); tsopp.CalcAvg(); }
/// <summary>Updates the metric stats for the specified team's players.</summary> /// <param name="team">1 if the away team's players' metric stats should be updated; anything else for the home team.</param> private void updateMetric(int team) { var ts = new TeamStats(-1, team == 1 ? cmbTeam1.SelectedItem.ToString() : cmbTeam2.SelectedItem.ToString()); var tsopp = new TeamStats(-1, team == 1 ? cmbTeam2.SelectedItem.ToString() : cmbTeam1.SelectedItem.ToString()); tryParseBS(); if (!MainWindow.TempBSE_BS.Done) { return; } var bs = MainWindow.TempBSE_BS; if (team == 1) { TeamStats.AddTeamStatsFromBoxScore(bs, ref ts, ref tsopp); } else { TeamStats.AddTeamStatsFromBoxScore(bs, ref tsopp, ref ts); } ts.CalcMetrics(tsopp); tsopp.CalcMetrics(ts); var ls = new TeamStats(-1); ls.AddTeamStats(ts, Span.SeasonAndPlayoffsToSeason); ls.AddTeamStats(tsopp, Span.SeasonAndPlayoffsToSeason); var pmsrList = new List<PlayerStatsRow>(); var pbsList = team == 1 ? pbsAwayList : pbsHomeList; foreach (var pbs in pbsList) { if (pbs.PlayerID == -1) { continue; } var ps = _pst[pbs.PlayerID].BinarySerializationClone(); ps.ResetStats(); ps.AddBoxScore(pbs, bs.IsPlayoff); ps.CalcMetrics(ts, tsopp, ls); pmsrList.Add(new PlayerStatsRow(ps)); } pmsrList.Sort((pmsr1, pmsr2) => pmsr1.GmSc.CompareTo(pmsr2.GmSc)); pmsrList.Reverse(); var tsr = new TeamStatsRow(ts); if (team == 1) { _psrListAway = new List<PlayerStatsRow>(pmsrList); dgvAwayPlayerMetricStats.ItemsSource = _psrListAway; dgvAwayTeamMetricStats.ItemsSource = new[] { tsr }; } else { _psrListHome = new List<PlayerStatsRow>(pmsrList); dgvHomePlayerMetricStats.ItemsSource = _psrListHome; dgvHomeTeamMetricStats.ItemsSource = new[] { tsr }; } }
/// <summary>Calculates the league PerGame.</summary> /// <param name="playerStats">The player stats.</param> /// <param name="teamStats">The team stats.</param> /// <returns></returns> public static PlayerStats CalculateLeagueAverages( Dictionary<int, PlayerStats> playerStats, Dictionary<int, TeamStats> teamStats) { var lps = new PlayerStats(new Player(-1, -1, "League", "Averages", Position.None, Position.None)); foreach (var key in playerStats.Keys) { lps.AddPlayerStats(playerStats[key]); } var ls = new TeamStats(-2, "League"); for (var i = 0; i < teamStats.Count; i++) { ls.AddTeamStats(teamStats[i], Span.Season); ls.AddTeamStats(teamStats[i], Span.Playoffs); } ls.CalcMetrics(ls); ls.CalcMetrics(ls, true); foreach (var name in PlayerStatsHelper.MetricsNames) { try { lps.Metrics[name] = playerStats.Where(ps => !Double.IsNaN(ps.Value.Metrics[name]) && !Double.IsInfinity(ps.Value.Metrics[name])) .Average(ps => ps.Value.Metrics[name]); } catch (InvalidOperationException) { lps.Metrics[name] = Double.NaN; } try { lps.PlMetrics[name] = playerStats.Where(ps => !Double.IsNaN(ps.Value.PlMetrics[name]) && !Double.IsInfinity(ps.Value.Metrics[name])) .Average(ps => ps.Value.PlMetrics[name]); } catch (InvalidOperationException) { lps.Metrics[name] = Double.NaN; } } var playerCount = (uint) playerStats.Count; for (var i = 0; i < lps.Totals.Length; i++) { lps.Totals[i] /= playerCount; lps.PlTotals[i] /= playerCount; } //ps.CalcAvg(); return lps; }
/// <summary>Calculates all metrics.</summary> /// <param name="playerStats">The player stats.</param> /// <param name="teamStats">The team stats.</param> /// <param name="oppStats">The opposing team stats.</param> /// <param name="leagueOv"> /// set to <c>true</c> if calling from the LeagueOverview window. /// </param> /// <param name="playoffs"> /// if set to <c>true</c>, the metrics will be calculated for the playoff stats. /// </param> /// <param name="teamsPerPlayer"> /// if set to <c>true</c>, the team stats dictionary is assumed to be per player. /// </param> public static void CalculateAllMetrics( ref Dictionary<int, PlayerStats> playerStats, Dictionary<int, TeamStats> teamStats, Dictionary<int, TeamStats> oppStats, bool leagueOv = false, bool playoffs = false, bool teamsPerPlayer = false) { var tCount = teamStats.Count; var ls = new TeamStats(); var tKeys = teamStats.Keys.ToList(); for (var i = 0; i < tCount; i++) { var key = tKeys[i]; if (!playoffs) { ls.AddTeamStats(teamStats[key], Span.Season); teamStats[key].CalcMetrics(oppStats[key]); oppStats[key].CalcMetrics(teamStats[key]); } else { ls.AddTeamStats(teamStats[key], Span.Playoffs); teamStats[key].CalcMetrics(oppStats[key], true); oppStats[key].CalcMetrics(teamStats[key], true); } } ls.CalcMetrics(ls, playoffs); double lgAvgPER = 0; double plLgAvgPER = 0; double totalMins = 0; double plTotalMins = 0; foreach (var playerid in playerStats.Keys.ToList()) { if (playerStats[playerid].TeamF == -1) { continue; } var teamid = playerStats[playerid].TeamF; TeamStats ts; TeamStats tsopp; if (!teamsPerPlayer) { ts = teamStats[teamid]; tsopp = oppStats[teamid]; } else { ts = teamStats[playerid]; tsopp = oppStats[playerid]; } playerStats[playerid].CalcMetrics(ts, tsopp, ls, leagueOv, playoffs: playoffs); if (!playoffs) { if (!(Double.IsNaN(playerStats[playerid].Metrics["aPER"])) && !(Double.IsInfinity(playerStats[playerid].Metrics["aPER"]))) { lgAvgPER += playerStats[playerid].Metrics["aPER"] * playerStats[playerid].Totals[PAbbrT.MINS]; totalMins += playerStats[playerid].Totals[PAbbrT.MINS]; } } else { if (!(Double.IsNaN(playerStats[playerid].PlMetrics["aPER"])) && !(Double.IsInfinity(playerStats[playerid].PlMetrics["aPER"]))) { plLgAvgPER += playerStats[playerid].PlMetrics["aPER"] * playerStats[playerid].PlTotals[PAbbrT.MINS]; plTotalMins += playerStats[playerid].PlTotals[PAbbrT.MINS]; } } } if (!playoffs) { lgAvgPER /= totalMins; } else { plLgAvgPER /= plTotalMins; } foreach (var playerid in playerStats.Keys.ToList()) { if (playerStats[playerid].TeamF == -1) { continue; } if (!playoffs) { playerStats[playerid].calcPER(lgAvgPER); } else { playerStats[playerid].calcPER(plLgAvgPER, true); } } }
/// <summary>Calculates the Metric Stats for this Player</summary> /// <param name="ts">The player's team's stats</param> /// <param name="tsopp">The player's team's opponents' stats</param> /// <param name="ls">The total league stats</param> /// <param name="leagueOv">Whether CalcMetrics is being called from the League Overview screen</param> /// <param name="GmScOnly">Whether to only calculate the GmSc metric.</param> /// <param name="playoffs">Whether to calculate the metrics based on the playoffs stats.</param> public void CalcMetrics( TeamStats ts, TeamStats tsopp, TeamStats ls, bool leagueOv = false, bool GmScOnly = false, bool playoffs = false) { var pstats = new double[Totals.Length]; for (var i = 0; i < Totals.Length; i++) { if (!playoffs) { pstats[i] = Totals[i]; } else { pstats[i] = PlTotals[i]; } } var tstats = new double[ts.Totals.Length]; for (var i = 0; i < ts.Totals.Length; i++) { if (!playoffs) { tstats[i] = ts.Totals[i]; } else { tstats[i] = ts.PlTotals[i]; } } var toppstats = new double[tsopp.Totals.Length]; for (var i = 0; i < tsopp.Totals.Length; i++) { if (!playoffs) { toppstats[i] = tsopp.Totals[i]; } else { toppstats[i] = tsopp.PlTotals[i]; } } var lstats = new double[ls.Totals.Length]; for (var i = 0; i < ls.Totals.Length; i++) { if (!playoffs) { lstats[i] = ls.Totals[i]; } else { lstats[i] = ls.PlTotals[i]; } } var pREB = pstats[PAbbrT.OREB] + pstats[PAbbrT.DREB]; var tREB = tstats[TAbbrT.OREB] + tstats[TAbbrT.DREB]; var tempTeamMetricsOwn = !playoffs ? ts.Metrics : ts.PlMetrics; var tempMetrics = new Dictionary<string, double>(PlayerStatsHelper.MetricsDict); var gmSc = pstats[PAbbrT.PTS] + 0.4 * pstats[PAbbrT.FGM] - 0.7 * pstats[PAbbrT.FGA] - 0.4 * (pstats[PAbbrT.FTA] - pstats[PAbbrT.FTM]) + 0.7 * pstats[PAbbrT.OREB] + 0.3 * pstats[PAbbrT.DREB] + pstats[PAbbrT.STL] + 0.7 * pstats[PAbbrT.AST] + 0.7 * pstats[PAbbrT.BLK] - 0.4 * pstats[PAbbrT.FOUL] - pstats[PAbbrT.TOS]; tempMetrics["GmSc"] = gmSc / pstats[PAbbrT.GP]; var gmScE = 36 * (1 / pstats[PAbbrT.MINS]) * gmSc; tempMetrics["GmScE"] = gmScE; if (!GmScOnly) { #region Metrics that do not require Opponent Stats var ASTp = pstats[PAbbrT.AST] / (((pstats[PAbbrT.MINS] / (tstats[TAbbrT.MINS])) * tstats[TAbbrT.FGM]) - pstats[PAbbrT.FGM]); tempMetrics["AST%"] = ASTp; var EFGp = (pstats[PAbbrT.FGM] + 0.5 * pstats[PAbbrT.TPM]) / pstats[PAbbrT.FGA]; tempMetrics["EFG%"] = EFGp; var tempTeamMetricsOpp = !playoffs ? tsopp.Metrics : tsopp.PlMetrics; var STLp = (pstats[PAbbrT.STL] * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * tempTeamMetricsOpp["Poss"]); tempMetrics["STL%"] = STLp; var TOp = pstats[PAbbrT.TOS] / (pstats[PAbbrT.FGA] + 0.44 * pstats[PAbbrT.FTA] + pstats[PAbbrT.TOS]); tempMetrics["TO%"] = TOp; var TSp = pstats[PAbbrT.PTS] / (2 * (pstats[PAbbrT.FGA] + 0.44 * pstats[PAbbrT.FTA])); tempMetrics["TS%"] = TSp; var USGp = ((pstats[PAbbrT.FGA] + 0.44 * pstats[PAbbrT.FTA] + pstats[PAbbrT.TOS]) * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * (tstats[TAbbrT.FGA] + 0.44 * tstats[TAbbrT.FTA] + tstats[TAbbrT.TOS])); tempMetrics["USG%"] = USGp; calculateRates(pstats, ref tempMetrics); // PER preparations var lREB = lstats[TAbbrT.OREB] + lstats[TAbbrT.DREB]; var factor = (2 / 3) - (0.5 * (lstats[TAbbrT.AST] / lstats[TAbbrT.FGM])) / (2 * (lstats[TAbbrT.FGM] / lstats[TAbbrT.FTM])); var VOP = lstats[TAbbrT.PF] / (lstats[TAbbrT.FGA] - lstats[TAbbrT.OREB] + lstats[TAbbrT.TOS] + 0.44 * lstats[TAbbrT.FTA]); var lDRBp = lstats[TAbbrT.DREB] / lREB; var uPER = (1 / pstats[PAbbrT.MINS]) * (pstats[PAbbrT.TPM] + (2 / 3) * pstats[PAbbrT.AST] + (2 - factor * (tstats[TAbbrT.AST] / tstats[TAbbrT.FGM])) * pstats[PAbbrT.FGM] + (pstats[PAbbrT.FTM] * 0.5 * (1 + (1 - (tstats[TAbbrT.AST] / tstats[TAbbrT.FGM])) + (2 / 3) * (tstats[TAbbrT.AST] / tstats[TAbbrT.FGM]))) - VOP * pstats[PAbbrT.TOS] - VOP * lDRBp * (pstats[PAbbrT.FGA] - pstats[PAbbrT.FGM]) - VOP * 0.44 * (0.44 + (0.56 * lDRBp)) * (pstats[PAbbrT.FTA] - pstats[PAbbrT.FTM]) + VOP * (1 - lDRBp) * (pREB - pstats[PAbbrT.OREB]) + VOP * lDRBp * pstats[PAbbrT.OREB] + VOP * pstats[PAbbrT.STL] + VOP * lDRBp * pstats[PAbbrT.BLK] - pstats[PAbbrT.FOUL] * ((lstats[TAbbrT.FTM] / lstats[TAbbrT.FOUL]) - 0.44 * (lstats[TAbbrT.FTA] / lstats[TAbbrT.FOUL]) * VOP)); tempMetrics["EFF"] = uPER * 100; #endregion #region Metrics that require Opponents stats if (ts.GetGames() == tsopp.GetGames()) { var BLKp = (pstats[PAbbrT.BLK] * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * (toppstats[TAbbrT.FGA] - toppstats[TAbbrT.TPA])); var DRBp = (pstats[PAbbrT.DREB] * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * (tstats[TAbbrT.DREB] + toppstats[TAbbrT.OREB])); var ORBp = (pstats[PAbbrT.OREB] * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * (tstats[TAbbrT.OREB] + toppstats[TAbbrT.DREB])); var toppREB = toppstats[TAbbrT.OREB] + toppstats[TAbbrT.DREB]; var REBp = (pREB * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * (tREB + toppREB)); #region Metrics that require league stats double aPER; double PPR; if (ls.Name != "$$Empty") { //double paceAdj = ls.temp_metrics["Pace"]/ts.temp_metrics["Pace"]; double estPaceAdj; if (!playoffs) { estPaceAdj = 2 * ls.PerGame[TAbbrPG.PPG] / (ts.PerGame[TAbbrPG.PPG] + tsopp.PerGame[TAbbrPG.PPG]); } else { estPaceAdj = 2 * ls.PlPerGame[TAbbrPG.PPG] / (ts.PlPerGame[TAbbrPG.PPG] + tsopp.PlPerGame[TAbbrPG.PPG]); } aPER = estPaceAdj * uPER; PPR = 100 * estPaceAdj * (((pstats[PAbbrT.AST] * 2 / 3) - pstats[PAbbrT.TOS]) / pstats[PAbbrT.MINS]); } else { aPER = Double.NaN; PPR = Double.NaN; } #endregion tempMetrics["aPER"] = aPER; tempMetrics["BLK%"] = BLKp; tempMetrics["DREB%"] = DRBp; tempMetrics["OREB%"] = ORBp; tempMetrics["REB%"] = REBp; tempMetrics["PPR"] = PPR; #region Offensive Rating var qAST = ((pstats[PAbbrT.MINS] / (tstats[TAbbrT.MINS] / 5)) * (1.14 * ((tstats[TAbbrT.AST] - pstats[PAbbrT.AST]) / tstats[TAbbrT.FGM]))) + ((((tstats[TAbbrT.AST] / tstats[TAbbrT.MINS]) * pstats[PAbbrT.MINS] * 5 - pstats[PAbbrT.AST]) / ((tstats[TAbbrT.FGM] / tstats[TAbbrT.MINS]) * pstats[PAbbrT.MINS] * 5 - pstats[PAbbrT.FGM])) * (1 - (pstats[PAbbrT.MINS] / (tstats[TAbbrT.MINS] / 5)))); var fgPart = pstats[PAbbrT.FGM] * (1 - 0.5 * ((pstats[PAbbrT.PTS] - pstats[PAbbrT.FTM]) / (2 * pstats[PAbbrT.FGA])) * qAST); var astPart = 0.5 * (((tstats[TAbbrT.PF] - tstats[TAbbrT.FTM]) - (pstats[PAbbrT.PTS] - pstats[PAbbrT.FTM])) / (2 * (tstats[TAbbrT.FGA] - pstats[PAbbrT.FGA]))) * pstats[PAbbrT.AST]; var pFTp = pstats[PAbbrT.FTM] / pstats[PAbbrT.FTA]; if (double.IsNaN(pFTp)) { pFTp = 0; } var ftPart = (1 - Math.Pow(1 - pFTp, 2)) * 0.4 * pstats[PAbbrT.FTA]; var tFTp = tstats[TAbbrT.FTM] / tstats[TAbbrT.FTA]; if (double.IsNaN(tFTp)) { tFTp = 0; } var teamScPoss = tstats[TAbbrT.FGM] + (1 - Math.Pow(1 - tFTp, 2)) * tstats[TAbbrT.FTA] * 0.4; var teamOREBPct = tstats[TAbbrT.OREB] / (tstats[TAbbrT.OREB] + toppstats[TAbbrT.DREB]); var teamPlayPct = teamScPoss / (tstats[TAbbrT.FGA] + tstats[TAbbrT.FTA] * 0.4 + tstats[TAbbrT.TOS]); var teamOREBWeight = ((1 - teamOREBPct) * teamPlayPct) / ((1 - teamOREBPct) * teamPlayPct + teamOREBPct * (1 - teamPlayPct)); var orebPart = pstats[PAbbrT.OREB] * teamOREBWeight * teamPlayPct; var scPoss = (fgPart + astPart + ftPart) * (1 - (tstats[TAbbrT.OREB] / teamScPoss) * teamOREBWeight * teamPlayPct) + orebPart; var fgxPoss = (pstats[PAbbrT.FGA] - pstats[PAbbrT.FGM]) * (1 - 1.07 * teamOREBPct); var ftxPoss = Math.Pow(1 - pFTp, 2) * 0.4 * pstats[PAbbrT.FTA]; var totPoss = scPoss + fgxPoss + ftxPoss + pstats[PAbbrT.TOS]; var pprodFGPart = 2 * (pstats[PAbbrT.FGM] + 0.5 * pstats[PAbbrT.TPM]) * (1 - 0.5 * ((pstats[PAbbrT.PTS] - pstats[PAbbrT.FTM]) / (2 * pstats[PAbbrT.FGA])) * qAST); var pprodASTPart = 2 * ((tstats[TAbbrT.FGM] - pstats[PAbbrT.FGM] + 0.5 * (tstats[TAbbrT.TPM] - pstats[PAbbrT.TPM])) / (tstats[TAbbrT.FGM] - pstats[PAbbrT.FGM])) * 0.5 * (((tstats[TAbbrT.PF] - tstats[TAbbrT.FTM]) - (pstats[PAbbrT.PTS] - pstats[PAbbrT.FTM])) / (2 * (tstats[TAbbrT.FGA] - pstats[PAbbrT.FGA]))) * pstats[PAbbrT.AST]; var pprodOREBPart = pstats[PAbbrT.OREB] * teamOREBWeight * teamPlayPct * (tstats[TAbbrT.PF] / (tstats[TAbbrT.FGM] + (1 - Math.Pow(1 - tFTp, 2)) * 0.4 * tstats[TAbbrT.FTA])); var pProd = (pprodFGPart + pprodASTPart + pstats[PAbbrT.FTM]) * (1 - (tstats[TAbbrT.OREB] / teamScPoss) * teamOREBWeight * teamPlayPct) + pprodOREBPart; var ortg = 100 * (pProd / totPoss); var floorPct = scPoss / totPoss; tempMetrics["ORTG"] = ortg; tempMetrics["Floor%"] = floorPct; #endregion #region Defensive Rating var dorPct = toppstats[TAbbrT.OREB] / (toppstats[TAbbrT.OREB] + tstats[TAbbrT.DREB]); var dfgPct = toppstats[TAbbrT.FGM] / toppstats[TAbbrT.FGA]; var fmWt = (dfgPct * (1 - dorPct)) / (dfgPct * (1 - dorPct) + (1 - dfgPct) * dorPct); var stops1 = pstats[PAbbrT.STL] + pstats[PAbbrT.BLK] * fmWt * (1 - 1.07 * dorPct) + pstats[PAbbrT.DREB] * (1 - fmWt); var stops2 = (((toppstats[TAbbrT.FGA] - toppstats[TAbbrT.FGM] - tstats[TAbbrT.BLK]) / tstats[TAbbrT.MINS]) * fmWt * (1 - 1.07 * dorPct) + ((toppstats[TAbbrT.TOS] - tstats[TAbbrT.STL]) / tstats[TAbbrT.MINS])) * pstats[PAbbrT.MINS] + (pstats[PAbbrT.PTS] / tstats[TAbbrT.PF]) * 0.4 * toppstats[TAbbrT.FTA] * Math.Pow(1 - (toppstats[TAbbrT.FTM] / toppstats[TAbbrT.FTA]), 2); var stops = stops1 + stops2; var stopPct = (stops * toppstats[TAbbrT.MINS]) / (tempTeamMetricsOwn["Poss"] * pstats[PAbbrT.MINS]); var dPtsPerScPoss = toppstats[TAbbrT.PF] / (toppstats[TAbbrT.FGM] + (1 - Math.Pow(1 - (toppstats[TAbbrT.FTM] / toppstats[TAbbrT.FTA]), 2)) * toppstats[TAbbrT.FTA] * 0.4); var drtg = tempTeamMetricsOwn["DRTG"] + 0.2 * (100 * dPtsPerScPoss * (1 - stopPct) - tempTeamMetricsOwn["DRTG"]); var rtgd = ortg - drtg; tempMetrics["DRTG"] = drtg; tempMetrics["RTGd"] = rtgd; #endregion } else { tempMetrics["aPER"] = Double.NaN; tempMetrics["BLK%"] = Double.NaN; tempMetrics["DREB%"] = Double.NaN; tempMetrics["OREB%"] = Double.NaN; tempMetrics["REB%"] = Double.NaN; tempMetrics["PPR"] = Double.NaN; tempMetrics["ORTG"] = Double.NaN; tempMetrics["Floor%"] = Double.NaN; tempMetrics["DRTG"] = Double.NaN; tempMetrics["RTGd"] = Double.NaN; } #endregion } var games = (!playoffs) ? ts.GetGames() : ts.GetPlayoffGames(); var gamesRequired = (int) Math.Ceiling(0.8522 * games); if (leagueOv) { if (pstats[PAbbrT.GP] < gamesRequired) { foreach (var name in tempMetrics.Keys.ToList()) { tempMetrics[name] = Double.NaN; } } } if (!playoffs) { Metrics = new Dictionary<string, double>(tempMetrics); } else { PlMetrics = new Dictionary<string, double>(tempMetrics); } }
/// <summary> /// Prepares and presents the team stats. /// </summary> private void prepareTeamStats() { TSRList = new List<TeamStatsRow>(); lssr = new List<TeamStatsRow>(); oppTSRList = new List<TeamStatsRow>(); var ls = new TeamStats(-1, "League"); foreach (int key in _tst.Keys) { if (_tst[key].IsHidden) { continue; } if (!inCurrentFilter(_tst[key])) { continue; } TSRList.Add(new TeamStatsRow(_tst[key], _pst, _splitTeamStats)); oppTSRList.Add(new TeamStatsRow(_tstOpp[key])); } ls = TeamStats.CalculateLeagueAverages(_tst, Span.Season); lssr.Add(new TeamStatsRow(ls)); TSRList.Sort((tmsr1, tmsr2) => tmsr1.EFFd.CompareTo(tmsr2.EFFd)); TSRList.Reverse(); oppTSRList.Sort((tmsr1, tmsr2) => tmsr1.EFFd.CompareTo(tmsr2.EFFd)); //oppTsrList.Reverse(); pl_TSRList = new List<TeamStatsRow>(); pl_Lssr = new List<TeamStatsRow>(); pl_OppTSRList = new List<TeamStatsRow>(); var ls1 = new TeamStats(-1, "League"); foreach (int key1 in _tst.Keys) { if (_tst[key1].IsHidden) { continue; } if (_tst[key1].GetPlayoffGames() == 0) { continue; } if (!inCurrentFilter(_tst[key1])) { continue; } pl_TSRList.Add(new TeamStatsRow(_tst[key1], true)); pl_OppTSRList.Add(new TeamStatsRow(_tstOpp[key1], true)); } ls1 = TeamStats.CalculateLeagueAverages(_tst, Span.Playoffs); pl_Lssr.Add(new TeamStatsRow(ls1, true)); pl_TSRList.Sort((tmsr1, tmsr2) => tmsr1.EFFd.CompareTo(tmsr2.EFFd)); pl_TSRList.Reverse(); pl_OppTSRList.Sort((tmsr1, tmsr2) => tmsr1.EFFd.CompareTo(tmsr2.EFFd)); //pl_oppTsrList.Reverse(); bool isSeason = rbSeason.IsChecked.GetValueOrDefault(); dgvTeamStats.ItemsSource = isSeason ? TSRList : pl_TSRList; dgvLeagueTeamStats.ItemsSource = isSeason ? lssr : pl_Lssr; dgvTeamMetricStats.ItemsSource = isSeason ? TSRList : pl_TSRList; dgvLeagueTeamMetricStats.ItemsSource = isSeason ? lssr : pl_Lssr; dgvOpponentStats.ItemsSource = isSeason ? oppTSRList : pl_OppTSRList; dgvLeagueOpponentStats.ItemsSource = isSeason ? lssr : pl_Lssr; dgvOpponentMetricStats.ItemsSource = isSeason ? oppTSRList : pl_OppTSRList; dgvLeagueOpponentMetricStats.ItemsSource = isSeason ? lssr : pl_Lssr; dgvTeamInfo.ItemsSource = TSRList; }
/// <summary> /// Adds one or more box scores resulting from an SQLite query to a TeamStats instance. /// </summary> /// <param name="res">The result of the query containing the box score records.</param> /// <param name="ts">The TeamStats instance to be modified.</param> /// <param name="tsopp">The opposing TeamStats instance to be modified..</param> public static void AddToTeamStatsFromSQLBoxScores(DataTable res, ref TeamStats ts, ref TeamStats tsopp) { foreach (DataRow r in res.Rows) { AddToTeamStatsFromSQLBoxScore(r, ref ts, ref tsopp); } }
/// <summary> /// Calculates the metric stats for this team. /// </summary> /// <param name="tsopp">The opposing team stats.</param> /// <param name="playoffs"> /// if set to <c>true</c>, the metrics will be calculated based on the team's playoff performances. /// </param> public void CalcMetrics(TeamStats tsopp, bool playoffs = false) { var tempMetrics = new Dictionary<string, double>(); var tempTotals = new double[Totals.Length]; for (int i = 0; i < Totals.Length; i++) { if (!playoffs) { tempTotals[i] = Totals[i]; } else { tempTotals[i] = PlTotals[i]; } } var toppstats = new double[tsopp.Totals.Length]; for (int i = 0; i < tsopp.Totals.Length; i++) { if (!playoffs) { toppstats[i] = tsopp.Totals[i]; } else { toppstats[i] = tsopp.PlTotals[i]; } } uint games = (!playoffs) ? GetGames() : GetPlayoffGames(); double poss = calcPossMetric(tempTotals, toppstats); tempMetrics.Add("Poss", poss); tempMetrics.Add("PossPG", poss/games); poss = calcPossMetric(toppstats, tempTotals); Dictionary<string, double> toppmetrics = (!playoffs) ? tsopp.Metrics : tsopp.PlMetrics; try { toppmetrics.Add("Poss", poss); } catch { Console.WriteLine("Possessions metric couldn't be calculated for team " + ID); } double pace = MainWindow.GameLength*((tempMetrics["Poss"] + toppmetrics["Poss"])/(2*(tempTotals[TAbbr.MINS]))); tempMetrics.Add("Pace", pace); double ortg = (tempTotals[TAbbr.PF]/tempMetrics["Poss"])*100; tempMetrics.Add("ORTG", ortg); double drtg = (tempTotals[TAbbr.PA]/tempMetrics["Poss"])*100; tempMetrics.Add("DRTG", drtg); double astP = (tempTotals[TAbbr.AST])/ (tempTotals[TAbbr.FGA] + tempTotals[TAbbr.FTA]*0.44 + tempTotals[TAbbr.AST] + tempTotals[TAbbr.TOS]); tempMetrics.Add("AST%", astP); double drebP = tempTotals[TAbbr.DREB]/(tempTotals[TAbbr.DREB] + toppstats[TAbbr.OREB]); tempMetrics.Add("DREB%", drebP); double efgP = (tempTotals[TAbbr.FGM] + tempTotals[TAbbr.TPM]*0.5)/tempTotals[TAbbr.FGA]; tempMetrics.Add("EFG%", efgP); double effD = ortg - drtg; tempMetrics.Add("EFFd", effD); double tor = tempTotals[TAbbr.TOS]/(tempTotals[TAbbr.FGA] + 0.44*tempTotals[TAbbr.FTA] + tempTotals[TAbbr.TOS]); tempMetrics.Add("TOR", tor); double orebP = tempTotals[TAbbr.OREB]/(tempTotals[TAbbr.OREB] + toppstats[TAbbr.DREB]); tempMetrics.Add("OREB%", orebP); double ftr = tempTotals[TAbbr.FTM]/tempTotals[TAbbr.FGA]; tempMetrics.Add("FTR", ftr); float[] tempPerGame = (!playoffs) ? PerGame : PlPerGame; double pwP = (((tempPerGame[TAbbr.PPG] - tempPerGame[TAbbr.PAPG])*2.7) + ((double) MainWindow.SeasonLength/2))/ MainWindow.SeasonLength; tempMetrics.Add("PW%", pwP); double tsP = tempTotals[TAbbr.PF]/(2*(tempTotals[TAbbr.FGA] + 0.44*tempTotals[TAbbr.FTA])); tempMetrics.Add("TS%", tsP); double tpr = tempTotals[TAbbr.TPA]/tempTotals[TAbbr.FGA]; tempMetrics.Add("3PR", tpr); double pythW = MainWindow.SeasonLength*(Math.Pow(tempTotals[TAbbr.PF], 16.5))/ (Math.Pow(tempTotals[TAbbr.PF], 16.5) + Math.Pow(tempTotals[TAbbr.PA], 16.5)); tempMetrics.Add("PythW", pythW); double pythL = MainWindow.SeasonLength - pythW; tempMetrics.Add("PythL", pythL); double gmsc = tempTotals[TAbbr.PF] + 0.4*tempTotals[TAbbr.FGM] - 0.7*tempTotals[TAbbr.FGA] - 0.4*(tempTotals[TAbbr.FTA] - tempTotals[TAbbr.FTM]) + 0.7*tempTotals[TAbbr.OREB] + 0.3*tempTotals[TAbbr.DREB] + tempTotals[TAbbr.STL] + 0.7*tempTotals[TAbbr.AST] + 0.7*tempTotals[TAbbr.BLK] - 0.4*tempTotals[TAbbr.FOUL] - tempTotals[TAbbr.TOS]; tempMetrics.Add("GmSc", gmsc/games); if (!playoffs) { Metrics = new Dictionary<string, double>(tempMetrics); } else { PlMetrics = new Dictionary<string, double>(tempMetrics); } }
/// <summary>Updates the Overview tab and loads the appropriate box scores depending on the timeframe.</summary> private void updateOverviewAndBoxScores() { var id = _curTeam; _curts = _tst[id]; _curtsopp = _tstOpp[id]; _tbsList = new List<TeamBoxScore>(); #region Prepare Team Overview _bseList = MainWindow.BSHist.Where(bse => bse.BS.Team1ID == _curTeam || bse.BS.Team2ID == _curTeam).ToList(); _bseListSea = _bseList.Where(bse => bse.BS.IsPlayoff == false).ToList(); _bseListPl = _bseList.Where(bse => bse.BS.IsPlayoff).ToList(); foreach (var r in _bseList) { var bsr = r.BS.CustomClone(); bsr.PrepareForDisplay(_tst, _curTeam); _tbsList.Add(bsr); } #region Regular Season var dr = _dtOv.NewRow(); dr["Type"] = "Stats"; dr["Games"] = _curts.GetGames(); dr["Wins (W%)"] = _curts.Record[0].ToString(); dr["Losses (Weff)"] = _curts.Record[1].ToString(); dr["PF"] = _curts.Totals[TAbbrT.PF].ToString(); dr["PA"] = _curts.Totals[TAbbrT.PA].ToString(); dr["PD"] = " "; dr["FG"] = _curts.Totals[TAbbrT.FGM].ToString() + "-" + _curts.Totals[TAbbrT.FGA].ToString(); dr["3PT"] = _curts.Totals[TAbbrT.TPM].ToString() + "-" + _curts.Totals[TAbbrT.TPA].ToString(); dr["FT"] = _curts.Totals[TAbbrT.FTM].ToString() + "-" + _curts.Totals[TAbbrT.FTA].ToString(); dr["REB"] = (_curts.Totals[TAbbrT.DREB] + _curts.Totals[TAbbrT.OREB]).ToString(); dr["OREB"] = _curts.Totals[TAbbrT.OREB].ToString(); dr["DREB"] = _curts.Totals[TAbbrT.DREB].ToString(); dr["AST"] = _curts.Totals[TAbbrT.AST].ToString(); dr["TO"] = _curts.Totals[TAbbrT.TOS].ToString(); dr["STL"] = _curts.Totals[TAbbrT.STL].ToString(); dr["BLK"] = _curts.Totals[TAbbrT.BLK].ToString(); dr["FOUL"] = _curts.Totals[TAbbrT.FOUL].ToString(); dr["MINS"] = _curts.Totals[TAbbrT.MINS].ToString(); _dtOv.Rows.Add(dr); dr = _dtOv.NewRow(); _curts.CalcAvg(); // Just to be sure... dr["Type"] = "Averages"; //dr["Games"] = curts.getGames(); dr["Wins (W%)"] = String.Format("{0:F3}", _curts.PerGame[TAbbrPG.Wp]); dr["Losses (Weff)"] = String.Format("{0:F2}", _curts.PerGame[TAbbrPG.Weff]); dr["PF"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.PPG]); dr["PA"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.PAPG]); dr["PD"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.PD]); dr["FG"] = String.Format("{0:F3}", _curts.PerGame[TAbbrPG.FGp]); dr["FGeff"] = String.Format("{0:F2}", _curts.PerGame[TAbbrPG.FGeff]); dr["3PT"] = String.Format("{0:F3}", _curts.PerGame[TAbbrPG.TPp]); dr["3Peff"] = String.Format("{0:F2}", _curts.PerGame[TAbbrPG.TPeff]); dr["FT"] = String.Format("{0:F3}", _curts.PerGame[TAbbrPG.FTp]); dr["FTeff"] = String.Format("{0:F2}", _curts.PerGame[TAbbrPG.FTeff]); dr["REB"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.RPG]); dr["OREB"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.ORPG]); dr["DREB"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.DRPG]); dr["AST"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.APG]); dr["TO"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.TPG]); dr["STL"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.SPG]); dr["BLK"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.BPG]); dr["FOUL"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.FPG]); _dtOv.Rows.Add(dr); // Rankings can only be shown based on total stats // ...for now var dr2 = _dtOv.NewRow(); dr2["Type"] = "Rankings"; dr2["Wins (W%)"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.Wp]; dr2["Losses (Weff)"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.Weff]; dr2["PF"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.PPG]; dr2["PA"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.PAPG]; dr2["PD"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.PD]; dr2["FG"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.FGp]; dr2["FGeff"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.FGeff]; dr2["3PT"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.TPp]; dr2["3Peff"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.TPeff]; dr2["FT"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.FTp]; dr2["FTeff"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.FTeff]; dr2["REB"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.RPG]; dr2["OREB"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.ORPG]; dr2["DREB"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.DRPG]; dr2["AST"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.APG]; dr2["TO"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.TPG]; dr2["STL"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.SPG]; dr2["BLK"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.BPG]; dr2["FOUL"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.FPG]; _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Stats"; dr2["Games"] = _curtsopp.GetGames(); dr2["Wins (W%)"] = _curtsopp.Record[0].ToString(); dr2["Losses (Weff)"] = _curtsopp.Record[1].ToString(); dr2["PF"] = _curtsopp.Totals[TAbbrT.PF].ToString(); dr2["PA"] = _curtsopp.Totals[TAbbrT.PA].ToString(); dr2["PD"] = " "; dr2["FG"] = _curtsopp.Totals[TAbbrT.FGM].ToString() + "-" + _curtsopp.Totals[TAbbrT.FGA].ToString(); dr2["3PT"] = _curtsopp.Totals[TAbbrT.TPM].ToString() + "-" + _curtsopp.Totals[TAbbrT.TPA].ToString(); dr2["FT"] = _curtsopp.Totals[TAbbrT.FTM].ToString() + "-" + _curtsopp.Totals[TAbbrT.FTA].ToString(); dr2["REB"] = (_curtsopp.Totals[TAbbrT.DREB] + _curtsopp.Totals[TAbbrT.OREB]).ToString(); dr2["OREB"] = _curtsopp.Totals[TAbbrT.OREB].ToString(); dr2["DREB"] = _curtsopp.Totals[TAbbrT.DREB].ToString(); dr2["AST"] = _curtsopp.Totals[TAbbrT.AST].ToString(); dr2["TO"] = _curtsopp.Totals[TAbbrT.TOS].ToString(); dr2["STL"] = _curtsopp.Totals[TAbbrT.STL].ToString(); dr2["BLK"] = _curtsopp.Totals[TAbbrT.BLK].ToString(); dr2["FOUL"] = _curtsopp.Totals[TAbbrT.FOUL].ToString(); dr2["MINS"] = _curtsopp.Totals[TAbbrT.MINS].ToString(); _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Avg"; dr2["Wins (W%)"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbrPG.Wp]); dr2["Losses (Weff)"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbrPG.Weff]); dr2["PF"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.PPG]); dr2["PA"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.PAPG]); dr2["PD"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.PD]); dr2["FG"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbrPG.FGp]); dr2["FGeff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbrPG.FGeff]); dr2["3PT"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbrPG.TPp]); dr2["3Peff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbrPG.TPeff]); dr2["FT"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbrPG.FTp]); dr2["FTeff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbrPG.FTeff]); dr2["REB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.RPG]); dr2["OREB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.ORPG]); dr2["DREB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.DRPG]); dr2["AST"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.APG]); dr2["TO"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.TPG]); dr2["STL"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.SPG]); dr2["BLK"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.BPG]); dr2["FOUL"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.FPG]); _dtOv.Rows.Add(dr2); #endregion #region Playoffs _dtOv.Rows.Add(_dtOv.NewRow()); dr = _dtOv.NewRow(); dr["Type"] = "Playoffs"; dr["Games"] = _curts.GetPlayoffGames(); dr["Wins (W%)"] = _curts.PlRecord[0].ToString(); dr["Losses (Weff)"] = _curts.PlRecord[1].ToString(); dr["PF"] = _curts.PlTotals[TAbbrT.PF].ToString(); dr["PA"] = _curts.PlTotals[TAbbrT.PA].ToString(); dr["PD"] = " "; dr["FG"] = _curts.PlTotals[TAbbrT.FGM].ToString() + "-" + _curts.PlTotals[TAbbrT.FGA].ToString(); dr["3PT"] = _curts.PlTotals[TAbbrT.TPM].ToString() + "-" + _curts.PlTotals[TAbbrT.TPA].ToString(); dr["FT"] = _curts.PlTotals[TAbbrT.FTM].ToString() + "-" + _curts.PlTotals[TAbbrT.FTA].ToString(); dr["REB"] = (_curts.PlTotals[TAbbrT.DREB] + _curts.PlTotals[TAbbrT.OREB]).ToString(); dr["OREB"] = _curts.PlTotals[TAbbrT.OREB].ToString(); dr["DREB"] = _curts.PlTotals[TAbbrT.DREB].ToString(); dr["AST"] = _curts.PlTotals[TAbbrT.AST].ToString(); dr["TO"] = _curts.PlTotals[TAbbrT.TOS].ToString(); dr["STL"] = _curts.PlTotals[TAbbrT.STL].ToString(); dr["BLK"] = _curts.PlTotals[TAbbrT.BLK].ToString(); dr["FOUL"] = _curts.PlTotals[TAbbrT.FOUL].ToString(); dr["MINS"] = _curts.PlTotals[TAbbrT.MINS].ToString(); _dtOv.Rows.Add(dr); dr = _dtOv.NewRow(); dr["Type"] = "Pl Avg"; dr["Wins (W%)"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbrPG.Wp]); dr["Losses (Weff)"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbrPG.Weff]); dr["PF"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.PPG]); dr["PA"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.PAPG]); dr["PD"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.PD]); dr["FG"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbrPG.FGp]); dr["FGeff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbrPG.FGeff]); dr["3PT"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbrPG.TPp]); dr["3Peff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbrPG.TPeff]); dr["FT"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbrPG.FTp]); dr["FTeff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbrPG.FTeff]); dr["REB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.RPG]); dr["OREB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.ORPG]); dr["DREB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.DRPG]); dr["AST"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.APG]); dr["TO"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.TPG]); dr["STL"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.SPG]); dr["BLK"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.BPG]); dr["FOUL"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.FPG]); _dtOv.Rows.Add(dr); dr2 = _dtOv.NewRow(); var count = _tst.Count(z => z.Value.GetPlayoffGames() > 0); dr2["Type"] = "Pl Rank"; dr2["Wins (W%)"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.Wp]; dr2["Losses (Weff)"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.Weff]; dr2["PF"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.PPG]; dr2["PA"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.PAPG]; dr2["PD"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.PD]; dr2["FG"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.FGp]; dr2["FGeff"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.FGeff]; dr2["3PT"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.TPp]; dr2["3Peff"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.TPeff]; dr2["FT"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.FTp]; dr2["FTeff"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.FTeff]; dr2["REB"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.RPG]; dr2["OREB"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.ORPG]; dr2["DREB"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.DRPG]; dr2["AST"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.APG]; dr2["TO"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.TPG]; dr2["STL"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.SPG]; dr2["BLK"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.BPG]; dr2["FOUL"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.FPG]; _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Pl Stats"; dr2["Games"] = _curtsopp.GetPlayoffGames(); dr2["Wins (W%)"] = _curtsopp.PlRecord[0].ToString(); dr2["Losses (Weff)"] = _curtsopp.PlRecord[1].ToString(); dr2["PF"] = _curtsopp.PlTotals[TAbbrT.PF].ToString(); dr2["PA"] = _curtsopp.PlTotals[TAbbrT.PA].ToString(); dr2["PD"] = " "; dr2["FG"] = _curtsopp.PlTotals[TAbbrT.FGM].ToString() + "-" + _curtsopp.PlTotals[TAbbrT.FGA].ToString(); dr2["3PT"] = _curtsopp.PlTotals[TAbbrT.TPM].ToString() + "-" + _curtsopp.PlTotals[TAbbrT.TPA].ToString(); dr2["FT"] = _curtsopp.PlTotals[TAbbrT.FTM].ToString() + "-" + _curtsopp.PlTotals[TAbbrT.FTA].ToString(); dr2["REB"] = (_curtsopp.PlTotals[TAbbrT.DREB] + _curtsopp.PlTotals[TAbbrT.OREB]).ToString(); dr2["OREB"] = _curtsopp.PlTotals[TAbbrT.OREB].ToString(); dr2["DREB"] = _curtsopp.PlTotals[TAbbrT.DREB].ToString(); dr2["AST"] = _curtsopp.PlTotals[TAbbrT.AST].ToString(); dr2["TO"] = _curtsopp.PlTotals[TAbbrT.TOS].ToString(); dr2["STL"] = _curtsopp.PlTotals[TAbbrT.STL].ToString(); dr2["BLK"] = _curtsopp.PlTotals[TAbbrT.BLK].ToString(); dr2["FOUL"] = _curtsopp.PlTotals[TAbbrT.FOUL].ToString(); dr2["MINS"] = _curtsopp.PlTotals[TAbbrT.MINS].ToString(); _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Pl Avg"; dr2["Wins (W%)"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbrPG.Wp]); dr2["Losses (Weff)"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbrPG.Weff]); dr2["PF"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.PPG]); dr2["PA"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.PAPG]); dr2["PD"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.PD]); dr2["FG"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbrPG.FGp]); dr2["FGeff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbrPG.FGeff]); dr2["3PT"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbrPG.TPp]); dr2["3Peff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbrPG.TPeff]); dr2["FT"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbrPG.FTp]); dr2["FTeff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbrPG.FTeff]); dr2["REB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.RPG]); dr2["OREB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.ORPG]); dr2["DREB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.DRPG]); dr2["AST"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.APG]); dr2["TO"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.TPG]); dr2["STL"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.SPG]); dr2["BLK"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.BPG]); dr2["FOUL"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.FPG]); _dtOv.Rows.Add(dr2); #endregion createViewAndUpdateOverview(); dgvBoxScores.ItemsSource = _tbsList; #endregion _curTSR = new TeamStatsRow(_curts); dgMetrics.ItemsSource = new List<TeamStatsRow> { _curTSR }; updatePBPStats(); }
private void updateGraph() { if (cmbGraphStat.SelectedIndex == -1 || cmbTeam.SelectedIndex == -1 || cmbGraphInterval.SelectedIndex == -1) { clearGraph(); return; } var intervalItem = cmbGraphInterval.SelectedItem.ToString(); var yearlyRows = _dtYea.Rows.Cast<DataRow>().Where(dr => dr[0].ToString().StartsWith("Season")).ToList(); var monthlyStats = MainWindow.SplitTeamStats[_curts.ID].Where(pair => pair.Key.StartsWith("M ")).ToList(); var orderedBSEList = _bseList.OrderBy(bse => bse.BS.GameDate).ToList(); Intervals interval; int count; switch (intervalItem) { case "Every Game": interval = Intervals.EveryGame; count = orderedBSEList.Count; break; case "Monthly": interval = Intervals.Monthly; count = monthlyStats.Count; break; case "Yearly": interval = Intervals.Yearly; count = yearlyRows.Count; break; default: throw new ArgumentOutOfRangeException(); } if (count < 2) { clearGraph(); return; } var propToGet = cmbGraphStat.SelectedItem.ToString(); propToGet = propToGet.Replace('3', 'T'); propToGet = propToGet.Replace('%', 'p'); propToGet = propToGet.Replace("TO", "TOS"); double sum = 0; double games = 0; chart.Primitives.Clear(); var cp = new ChartPrimitive { Label = cmbGraphStat.SelectedItem.ToString(), ShowInLegend = false }; switch (interval) { case Intervals.EveryGame: for (var i = 0; i < count; i++) { var bse = orderedBSEList[i]; bse.BS.PrepareForDisplay(_tst, _curts.ID); var isTeamAway = bse.BS.Team1ID == _curts.ID; var propToGetFinal = propToGet; if (propToGet == "PF") { propToGetFinal = isTeamAway ? "PTS1" : "PTS2"; } else if (propToGet == "PA") { propToGetFinal = isTeamAway ? "PTS2" : "PTS1"; } else { propToGetFinal += (isTeamAway ? 1 : 2).ToString(); } var value = bse.BS.GetValue<TeamBoxScore, double>(propToGetFinal); if (double.IsNaN(value)) { continue; } if (propToGet.Contains("p")) { value = Convert.ToDouble(Convert.ToInt32(value * 1000)) / 1000; } cp.AddPoint(i + 1, value); games++; sum += value; } break; case Intervals.Monthly: monthlyStats = monthlyStats.OrderBy(ms => ms.Key).ToList(); if (TeamStatsHelper.TotalsToPerGame.ContainsKey(propToGet)) { propToGet = TeamStatsHelper.TotalsToPerGame[propToGet]; } for (var i = 0; i < count; i++) { var ts = monthlyStats[i].Value; ts.CalcMetrics(new TeamStats()); var tsr = new TeamStatsRow(ts); var value = tsr.GetValue<double>(propToGet); if (double.IsNaN(value)) { continue; } if (propToGet.Contains("p")) { value = Convert.ToDouble(Convert.ToInt32(value * 1000)) / 1000; } cp.AddPoint(i + 1, value); games++; sum += value; } break; case Intervals.Yearly: if (TeamStatsHelper.TotalsToPerGame.ContainsKey(propToGet)) { propToGet = TeamStatsHelper.TotalsToPerGame[propToGet]; } for (var i = 0; i < count; i++) { var ts = new TeamStats(); createTeamStatsFromDataRow(ref ts, _dtYea.Rows.Cast<DataRow>().ToList()[i]); ts.CalcMetrics(new TeamStats()); var tsr = new TeamStatsRow(ts); var value = tsr.GetValue<TeamStatsRow, double>(propToGet); if (double.IsNaN(value)) { continue; } if (propToGet.Contains("p")) { value = Convert.ToDouble(Convert.ToInt32(value * 1000)) / 1000; } cp.AddPoint(i + 1, value); games++; sum += value; } break; default: throw new ArgumentOutOfRangeException(); } if (cp.Points.Count > 0) { chart.Primitives.Add(cp); } if (chart.Primitives.Count > 0 && chart.Primitives.Sum(p => p.Points.Count) > 1) { //var average = sum / games; if (TeamStatsHelper.TotalsToPerGame.ContainsKey(propToGet)) { propToGet = TeamStatsHelper.TotalsToPerGame[propToGet]; } double average; switch (interval) { case Intervals.EveryGame: case Intervals.Monthly: average = _curTSR.GetValue<double>(propToGet); break; case Intervals.Yearly: var ts = new TeamStats(); createTeamStatsFromDataRow(ref ts, _dtYea.Rows.Cast<DataRow>().ToList().Last()); ts.CalcMetrics(new TeamStats()); var tsr = new TeamStatsRow(ts); average = tsr.GetValue<double>(propToGet); break; default: throw new ArgumentOutOfRangeException(); } var cpavg = new ChartPrimitive(); for (var i = 0; i < count; i++) { cpavg.AddPoint(i + 1, average); } cpavg.Color = Color.FromRgb(0, 0, 100); cpavg.Dashed = true; cpavg.ShowInLegend = false; var cp2 = new ChartPrimitive(); cp2.AddPoint(chart.Primitives.First().Points.First().X, 0); cp2.AddPoint(chart.Primitives.Last().Points.Last().X, 1); chart.Primitives.Add(cpavg); chart.RedrawPlotLines(); chart.Primitives.Add(cp2); } else { chart.RedrawPlotLines(); var cp2 = new ChartPrimitive(); cp2.AddPoint(1, 0); cp2.AddPoint(2, 1); chart.Primitives.Add(cp2); } chart.ResetPanAndZoom(); }
/// <summary> /// Updates the Overview tab and loads the appropriate box scores depending on the timeframe. /// </summary> private void updateOverviewAndBoxScores() { int id = _curTeam; _curts = _tst[id]; _curtsopp = _tstOpp[id]; _bsrList = new List<TeamBoxScore>(); #region Prepare Team Overview IEnumerable<BoxScoreEntry> boxScoreEntries = MainWindow.BSHist.Where(bse => bse.BS.Team1ID == _curTeam || bse.BS.Team2ID == _curTeam); foreach (BoxScoreEntry r in boxScoreEntries) { TeamBoxScore bsr = r.BS.DeepClone(); bsr.PrepareForDisplay(_tst, _curTeam); _bsrList.Add(bsr); } #region Regular Season DataRow dr = _dtOv.NewRow(); dr["Type"] = "Stats"; dr["Games"] = _curts.GetGames(); dr["Wins (W%)"] = _curts.Record[0].ToString(); dr["Losses (Weff)"] = _curts.Record[1].ToString(); dr["PF"] = _curts.Totals[TAbbr.PF].ToString(); dr["PA"] = _curts.Totals[TAbbr.PA].ToString(); dr["PD"] = " "; dr["FG"] = _curts.Totals[TAbbr.FGM].ToString() + "-" + _curts.Totals[TAbbr.FGA].ToString(); dr["3PT"] = _curts.Totals[TAbbr.TPM].ToString() + "-" + _curts.Totals[TAbbr.TPA].ToString(); dr["FT"] = _curts.Totals[TAbbr.FTM].ToString() + "-" + _curts.Totals[TAbbr.FTA].ToString(); dr["REB"] = (_curts.Totals[TAbbr.DREB] + _curts.Totals[TAbbr.OREB]).ToString(); dr["OREB"] = _curts.Totals[TAbbr.OREB].ToString(); dr["DREB"] = _curts.Totals[TAbbr.DREB].ToString(); dr["AST"] = _curts.Totals[TAbbr.AST].ToString(); dr["TO"] = _curts.Totals[TAbbr.TOS].ToString(); dr["STL"] = _curts.Totals[TAbbr.STL].ToString(); dr["BLK"] = _curts.Totals[TAbbr.BLK].ToString(); dr["FOUL"] = _curts.Totals[TAbbr.FOUL].ToString(); dr["MINS"] = _curts.Totals[TAbbr.MINS].ToString(); _dtOv.Rows.Add(dr); dr = _dtOv.NewRow(); _curts.CalcAvg(); // Just to be sure... dr["Type"] = "Averages"; //dr["Games"] = curts.getGames(); dr["Wins (W%)"] = String.Format("{0:F3}", _curts.PerGame[TAbbr.Wp]); dr["Losses (Weff)"] = String.Format("{0:F2}", _curts.PerGame[TAbbr.Weff]); dr["PF"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.PPG]); dr["PA"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.PAPG]); dr["PD"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.PD]); dr["FG"] = String.Format("{0:F3}", _curts.PerGame[TAbbr.FGp]); dr["FGeff"] = String.Format("{0:F2}", _curts.PerGame[TAbbr.FGeff]); dr["3PT"] = String.Format("{0:F3}", _curts.PerGame[TAbbr.TPp]); dr["3Peff"] = String.Format("{0:F2}", _curts.PerGame[TAbbr.TPeff]); dr["FT"] = String.Format("{0:F3}", _curts.PerGame[TAbbr.FTp]); dr["FTeff"] = String.Format("{0:F2}", _curts.PerGame[TAbbr.FTeff]); dr["REB"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.RPG]); dr["OREB"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.ORPG]); dr["DREB"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.DRPG]); dr["AST"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.APG]); dr["TO"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.TPG]); dr["STL"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.SPG]); dr["BLK"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.BPG]); dr["FOUL"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.FPG]); _dtOv.Rows.Add(dr); // Rankings can only be shown based on total stats // ...for now DataRow dr2; dr2 = _dtOv.NewRow(); dr2["Type"] = "Rankings"; dr2["Wins (W%)"] = _seasonRankings.RankingsPerGame[id][TAbbr.Wp]; dr2["Losses (Weff)"] = _seasonRankings.RankingsPerGame[id][TAbbr.Weff]; dr2["PF"] = _seasonRankings.RankingsPerGame[id][TAbbr.PPG]; dr2["PA"] = cmbTeam.Items.Count + 1 - _seasonRankings.RankingsPerGame[id][TAbbr.PAPG]; dr2["PD"] = _seasonRankings.RankingsPerGame[id][TAbbr.PD]; dr2["FG"] = _seasonRankings.RankingsPerGame[id][TAbbr.FGp]; dr2["FGeff"] = _seasonRankings.RankingsPerGame[id][TAbbr.FGeff]; dr2["3PT"] = _seasonRankings.RankingsPerGame[id][TAbbr.TPp]; dr2["3Peff"] = _seasonRankings.RankingsPerGame[id][TAbbr.TPeff]; dr2["FT"] = _seasonRankings.RankingsPerGame[id][TAbbr.FTp]; dr2["FTeff"] = _seasonRankings.RankingsPerGame[id][TAbbr.FTeff]; dr2["REB"] = _seasonRankings.RankingsPerGame[id][TAbbr.RPG]; dr2["OREB"] = _seasonRankings.RankingsPerGame[id][TAbbr.ORPG]; dr2["DREB"] = _seasonRankings.RankingsPerGame[id][TAbbr.DRPG]; dr2["AST"] = _seasonRankings.RankingsPerGame[id][TAbbr.APG]; dr2["TO"] = cmbTeam.Items.Count + 1 - _seasonRankings.RankingsPerGame[id][TAbbr.TPG]; dr2["STL"] = _seasonRankings.RankingsPerGame[id][TAbbr.SPG]; dr2["BLK"] = _seasonRankings.RankingsPerGame[id][TAbbr.BPG]; dr2["FOUL"] = cmbTeam.Items.Count + 1 - _seasonRankings.RankingsPerGame[id][TAbbr.FPG]; _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Stats"; dr2["Games"] = _curtsopp.GetGames(); dr2["Wins (W%)"] = _curtsopp.Record[0].ToString(); dr2["Losses (Weff)"] = _curtsopp.Record[1].ToString(); dr2["PF"] = _curtsopp.Totals[TAbbr.PF].ToString(); dr2["PA"] = _curtsopp.Totals[TAbbr.PA].ToString(); dr2["PD"] = " "; dr2["FG"] = _curtsopp.Totals[TAbbr.FGM].ToString() + "-" + _curtsopp.Totals[TAbbr.FGA].ToString(); dr2["3PT"] = _curtsopp.Totals[TAbbr.TPM].ToString() + "-" + _curtsopp.Totals[TAbbr.TPA].ToString(); dr2["FT"] = _curtsopp.Totals[TAbbr.FTM].ToString() + "-" + _curtsopp.Totals[TAbbr.FTA].ToString(); dr2["REB"] = (_curtsopp.Totals[TAbbr.DREB] + _curtsopp.Totals[TAbbr.OREB]).ToString(); dr2["OREB"] = _curtsopp.Totals[TAbbr.OREB].ToString(); dr2["DREB"] = _curtsopp.Totals[TAbbr.DREB].ToString(); dr2["AST"] = _curtsopp.Totals[TAbbr.AST].ToString(); dr2["TO"] = _curtsopp.Totals[TAbbr.TOS].ToString(); dr2["STL"] = _curtsopp.Totals[TAbbr.STL].ToString(); dr2["BLK"] = _curtsopp.Totals[TAbbr.BLK].ToString(); dr2["FOUL"] = _curtsopp.Totals[TAbbr.FOUL].ToString(); dr2["MINS"] = _curtsopp.Totals[TAbbr.MINS].ToString(); _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Avg"; dr2["Wins (W%)"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbr.Wp]); dr2["Losses (Weff)"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbr.Weff]); dr2["PF"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.PPG]); dr2["PA"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.PAPG]); dr2["PD"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.PD]); dr2["FG"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbr.FGp]); dr2["FGeff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbr.FGeff]); dr2["3PT"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbr.TPp]); dr2["3Peff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbr.TPeff]); dr2["FT"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbr.FTp]); dr2["FTeff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbr.FTeff]); dr2["REB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.RPG]); dr2["OREB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.ORPG]); dr2["DREB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.DRPG]); dr2["AST"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.APG]); dr2["TO"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.TPG]); dr2["STL"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.SPG]); dr2["BLK"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.BPG]); dr2["FOUL"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.FPG]); _dtOv.Rows.Add(dr2); #endregion #region Playoffs _dtOv.Rows.Add(_dtOv.NewRow()); dr = _dtOv.NewRow(); dr["Type"] = "Playoffs"; dr["Games"] = _curts.GetPlayoffGames(); dr["Wins (W%)"] = _curts.PlRecord[0].ToString(); dr["Losses (Weff)"] = _curts.PlRecord[1].ToString(); dr["PF"] = _curts.PlTotals[TAbbr.PF].ToString(); dr["PA"] = _curts.PlTotals[TAbbr.PA].ToString(); dr["PD"] = " "; dr["FG"] = _curts.PlTotals[TAbbr.FGM].ToString() + "-" + _curts.PlTotals[TAbbr.FGA].ToString(); dr["3PT"] = _curts.PlTotals[TAbbr.TPM].ToString() + "-" + _curts.PlTotals[TAbbr.TPA].ToString(); dr["FT"] = _curts.PlTotals[TAbbr.FTM].ToString() + "-" + _curts.PlTotals[TAbbr.FTA].ToString(); dr["REB"] = (_curts.PlTotals[TAbbr.DREB] + _curts.PlTotals[TAbbr.OREB]).ToString(); dr["OREB"] = _curts.PlTotals[TAbbr.OREB].ToString(); dr["DREB"] = _curts.PlTotals[TAbbr.DREB].ToString(); dr["AST"] = _curts.PlTotals[TAbbr.AST].ToString(); dr["TO"] = _curts.PlTotals[TAbbr.TOS].ToString(); dr["STL"] = _curts.PlTotals[TAbbr.STL].ToString(); dr["BLK"] = _curts.PlTotals[TAbbr.BLK].ToString(); dr["FOUL"] = _curts.PlTotals[TAbbr.FOUL].ToString(); dr["MINS"] = _curts.PlTotals[TAbbr.MINS].ToString(); _dtOv.Rows.Add(dr); dr = _dtOv.NewRow(); dr["Type"] = "Pl Avg"; dr["Wins (W%)"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbr.Wp]); dr["Losses (Weff)"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbr.Weff]); dr["PF"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.PPG]); dr["PA"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.PAPG]); dr["PD"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.PD]); dr["FG"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbr.FGp]); dr["FGeff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbr.FGeff]); dr["3PT"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbr.TPp]); dr["3Peff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbr.TPeff]); dr["FT"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbr.FTp]); dr["FTeff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbr.FTeff]); dr["REB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.RPG]); dr["OREB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.ORPG]); dr["DREB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.DRPG]); dr["AST"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.APG]); dr["TO"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.TPG]); dr["STL"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.SPG]); dr["BLK"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.BPG]); dr["FOUL"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.FPG]); _dtOv.Rows.Add(dr); dr2 = _dtOv.NewRow(); int count = _tst.Count(z => z.Value.GetPlayoffGames() > 0); dr2["Type"] = "Pl Rank"; dr2["Wins (W%)"] = _playoffRankings.RankingsPerGame[id][TAbbr.Wp]; dr2["Losses (Weff)"] = _playoffRankings.RankingsPerGame[id][TAbbr.Weff]; dr2["PF"] = _playoffRankings.RankingsPerGame[id][TAbbr.PPG]; dr2["PA"] = count + 1 - _playoffRankings.RankingsPerGame[id][TAbbr.PAPG]; dr2["PD"] = _playoffRankings.RankingsPerGame[id][TAbbr.PD]; dr2["FG"] = _playoffRankings.RankingsPerGame[id][TAbbr.FGp]; dr2["FGeff"] = _playoffRankings.RankingsPerGame[id][TAbbr.FGeff]; dr2["3PT"] = _playoffRankings.RankingsPerGame[id][TAbbr.TPp]; dr2["3Peff"] = _playoffRankings.RankingsPerGame[id][TAbbr.TPeff]; dr2["FT"] = _playoffRankings.RankingsPerGame[id][TAbbr.FTp]; dr2["FTeff"] = _playoffRankings.RankingsPerGame[id][TAbbr.FTeff]; dr2["REB"] = _playoffRankings.RankingsPerGame[id][TAbbr.RPG]; dr2["OREB"] = _playoffRankings.RankingsPerGame[id][TAbbr.ORPG]; dr2["DREB"] = _playoffRankings.RankingsPerGame[id][TAbbr.DRPG]; dr2["AST"] = _playoffRankings.RankingsPerGame[id][TAbbr.APG]; dr2["TO"] = count + 1 - _playoffRankings.RankingsPerGame[id][TAbbr.TPG]; dr2["STL"] = _playoffRankings.RankingsPerGame[id][TAbbr.SPG]; dr2["BLK"] = _playoffRankings.RankingsPerGame[id][TAbbr.BPG]; dr2["FOUL"] = count + 1 - _playoffRankings.RankingsPerGame[id][TAbbr.FPG]; _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Pl Stats"; dr2["Games"] = _curtsopp.GetPlayoffGames(); dr2["Wins (W%)"] = _curtsopp.PlRecord[0].ToString(); dr2["Losses (Weff)"] = _curtsopp.PlRecord[1].ToString(); dr2["PF"] = _curtsopp.PlTotals[TAbbr.PF].ToString(); dr2["PA"] = _curtsopp.PlTotals[TAbbr.PA].ToString(); dr2["PD"] = " "; dr2["FG"] = _curtsopp.PlTotals[TAbbr.FGM].ToString() + "-" + _curtsopp.PlTotals[TAbbr.FGA].ToString(); dr2["3PT"] = _curtsopp.PlTotals[TAbbr.TPM].ToString() + "-" + _curtsopp.PlTotals[TAbbr.TPA].ToString(); dr2["FT"] = _curtsopp.PlTotals[TAbbr.FTM].ToString() + "-" + _curtsopp.PlTotals[TAbbr.FTA].ToString(); dr2["REB"] = (_curtsopp.PlTotals[TAbbr.DREB] + _curtsopp.PlTotals[TAbbr.OREB]).ToString(); dr2["OREB"] = _curtsopp.PlTotals[TAbbr.OREB].ToString(); dr2["DREB"] = _curtsopp.PlTotals[TAbbr.DREB].ToString(); dr2["AST"] = _curtsopp.PlTotals[TAbbr.AST].ToString(); dr2["TO"] = _curtsopp.PlTotals[TAbbr.TOS].ToString(); dr2["STL"] = _curtsopp.PlTotals[TAbbr.STL].ToString(); dr2["BLK"] = _curtsopp.PlTotals[TAbbr.BLK].ToString(); dr2["FOUL"] = _curtsopp.PlTotals[TAbbr.FOUL].ToString(); dr2["MINS"] = _curtsopp.PlTotals[TAbbr.MINS].ToString(); _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Pl Avg"; dr2["Wins (W%)"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbr.Wp]); dr2["Losses (Weff)"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbr.Weff]); dr2["PF"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.PPG]); dr2["PA"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.PAPG]); dr2["PD"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.PD]); dr2["FG"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbr.FGp]); dr2["FGeff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbr.FGeff]); dr2["3PT"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbr.TPp]); dr2["3Peff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbr.TPeff]); dr2["FT"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbr.FTp]); dr2["FTeff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbr.FTeff]); dr2["REB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.RPG]); dr2["OREB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.ORPG]); dr2["DREB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.DRPG]); dr2["AST"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.APG]); dr2["TO"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.TPG]); dr2["STL"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.SPG]); dr2["BLK"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.BPG]); dr2["FOUL"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.FPG]); _dtOv.Rows.Add(dr2); #endregion createViewAndUpdateOverview(); dgvBoxScores.ItemsSource = _bsrList; #endregion }
/// <summary>Calculates the metrics of a player's performance.</summary> /// <param name="r"> /// The SQLite DataRow containing the player's box score. Should be the result of an INNER JOIN'ed query between /// PlayerResults and GameResults. /// </param> public void CalcMetrics(DataRow r) { var bs = new TeamBoxScore(r, null); var ts = new TeamStats(TeamID); var tsopp = new TeamStats(OppTeamID); var team1ID = ParseCell.GetInt32(r, "Team1ID"); var team2ID = ParseCell.GetInt32(r, "Team2ID"); if (TeamID == team1ID) { TeamStats.AddTeamStatsFromBoxScore(bs, ref ts, ref tsopp); } else { TeamStats.AddTeamStatsFromBoxScore(bs, ref tsopp, ref ts); } var ps = new PlayerStats { ID = PlayerID }; ps.AddBoxScore(this, bs.IsPlayoff); ps.CalcMetrics(ts, tsopp, new TeamStats(-1), GmScOnly: true); GmSc = ps.Metrics["GmSc"]; GmScE = ps.Metrics["GmScE"]; }
/// <summary>Calculates the metrics of a player's performance.</summary> /// <param name="bs">The game's box score from which to calculate the metrics.</param> public void CalcMetrics(TeamBoxScore bs) { var ts = new TeamStats(TeamID); var tsopp = new TeamStats(OppTeamID); var team1ID = bs.Team1ID; if (TeamID == team1ID) { TeamStats.AddTeamStatsFromBoxScore(bs, ref ts, ref tsopp); } else { TeamStats.AddTeamStatsFromBoxScore(bs, ref tsopp, ref ts); } var ps = new PlayerStats { ID = PlayerID }; ps.AddBoxScore(this, bs.IsPlayoff); ps.CalcMetrics(ts, tsopp, new TeamStats(-1), GmScOnly: true); GmSc = ps.Metrics["GmSc"]; GmScE = ps.Metrics["GmScE"]; }
/// <summary>Prepares and presents the team stats.</summary> private void prepareTeamStats() { _tsrListSea = new List<TeamStatsRow>(); _lssrSea = new List<TeamStatsRow>(); _oppTSRListSea = new List<TeamStatsRow>(); var ls = new TeamStats(-1, "League"); foreach (var key in _tst.Keys) { if (_tst[key].IsHidden) { continue; } if (!inCurrentFilter(_tst[key])) { continue; } _tsrListSea.Add(new TeamStatsRow(_tst[key], _pst, _splitTeamStats)); _oppTSRListSea.Add(new TeamStatsRow(_tstOpp[key])); } ls = TeamStats.CalculateLeagueAverages(_tst, Span.Season); _lssrSea.Add(new TeamStatsRow(ls)); _tsrListSea.Sort((tmsr1, tmsr2) => tmsr1.EFFd.CompareTo(tmsr2.EFFd)); _tsrListSea.Reverse(); _oppTSRListSea.Sort((tmsr1, tmsr2) => tmsr1.EFFd.CompareTo(tmsr2.EFFd)); //oppTsrList.Reverse(); _tsrListPl = new List<TeamStatsRow>(); _lssrPl = new List<TeamStatsRow>(); _oppTSRListPl = new List<TeamStatsRow>(); var ls1 = new TeamStats(-1, "League"); foreach (var key1 in _tst.Keys) { if (_tst[key1].IsHidden) { continue; } if (_tst[key1].GetPlayoffGames() == 0) { continue; } if (!inCurrentFilter(_tst[key1])) { continue; } _tsrListPl.Add(new TeamStatsRow(_tst[key1], true)); _oppTSRListPl.Add(new TeamStatsRow(_tstOpp[key1], true)); } ls1 = TeamStats.CalculateLeagueAverages(_tst, Span.Playoffs); _lssrPl.Add(new TeamStatsRow(ls1, true)); _tsrListPl.Sort((tmsr1, tmsr2) => tmsr1.EFFd.CompareTo(tmsr2.EFFd)); _tsrListPl.Reverse(); _oppTSRListPl.Sort((tmsr1, tmsr2) => tmsr1.EFFd.CompareTo(tmsr2.EFFd)); //pl_oppTsrList.Reverse(); var isSeason = rbSeason.IsChecked.GetValueOrDefault(); dgvTeamStats.ItemsSource = isSeason ? _tsrListSea : _tsrListPl; dgvLeagueTeamStats.ItemsSource = isSeason ? _lssrSea : _lssrPl; dgvTeamMetricStats.ItemsSource = isSeason ? _tsrListSea : _tsrListPl; dgvLeagueTeamMetricStats.ItemsSource = isSeason ? _lssrSea : _lssrPl; dgvOpponentStats.ItemsSource = isSeason ? _oppTSRListSea : _oppTSRListPl; dgvLeagueOpponentStats.ItemsSource = isSeason ? _lssrSea : _lssrPl; dgvOpponentMetricStats.ItemsSource = isSeason ? _oppTSRListSea : _oppTSRListPl; dgvLeagueOpponentMetricStats.ItemsSource = isSeason ? _lssrSea : _lssrPl; dgvTeamInfo.ItemsSource = _tsrListSea; }
/// <summary>Calculates the yearly stats and updates the yearly stats tab.</summary> private void updateYearlyStats() { _dtYea.Clear(); var currentDB = MainWindow.CurrentDB; _curSeason = MainWindow.CurSeason; _maxSeason = SQLiteIO.GetMaxSeason(currentDB); var ts = _tst[_curTeam]; var tsAllSeasons = new TeamStats(-1, "All Seasons"); var tsAllPlayoffs = new TeamStats(-1, "All Playoffs"); var tsAll = new TeamStats(-1, "All Games"); tsAllSeasons.AddTeamStats(ts, Span.Season); tsAllPlayoffs.AddTeamStats(ts, Span.Playoffs); tsAll.AddTeamStats(ts, Span.SeasonAndPlayoffsToSeason); var drcur = _dtYea.NewRow(); var drcurPl = _dtYea.NewRow(); createDataRowFromTeamStats(ts, ref drcur, "Season " + MainWindow.GetSeasonName(_curSeason)); var playedInPlayoffs = false; if (ts.PlRecord[0] + ts.PlRecord[1] > 0) { createDataRowFromTeamStats(ts, ref drcurPl, "Playoffs " + MainWindow.GetSeasonName(_curSeason), true); playedInPlayoffs = true; } // var qr = string.Format(@"SELECT * FROM PastTeamStats WHERE TeamID = {0} ORDER BY ""SOrder""", ts.ID); var dt = _db.GetDataTable(qr); foreach (DataRow dr in dt.Rows) { var dr4 = _dtYea.NewRow(); ts = new TeamStats(); if (ParseCell.GetBoolean(dr, "isPlayoff")) { SQLiteIO.GetTeamStatsFromDataRow(ref ts, dr, true); createDataRowFromTeamStats(ts, ref dr4, "Playoffs " + ParseCell.GetString(dr, "SeasonName"), true); tsAllPlayoffs.AddTeamStats(ts, Span.Playoffs); tsAll.AddTeamStats(ts, Span.Playoffs); } else { SQLiteIO.GetTeamStatsFromDataRow(ref ts, dr, false); createDataRowFromTeamStats(ts, ref dr4, "Season " + ParseCell.GetString(dr, "SeasonName"), false); tsAllSeasons.AddTeamStats(ts, Span.Season); tsAll.AddTeamStats(ts, Span.Season); } _dtYea.Rows.Add(dr4); } // for (var j = 1; j <= _maxSeason; j++) { if (j != _curSeason) { TeamStats tsopp; SQLiteIO.GetTeamStatsFromDatabase(MainWindow.CurrentDB, _curTeam, j, out ts, out tsopp); var dr3 = _dtYea.NewRow(); var dr3Pl = _dtYea.NewRow(); createDataRowFromTeamStats(ts, ref dr3, "Season " + MainWindow.GetSeasonName(j)); _dtYea.Rows.Add(dr3); if (ts.PlRecord[0] + ts.PlRecord[1] > 0) { createDataRowFromTeamStats(ts, ref dr3Pl, "Playoffs " + MainWindow.GetSeasonName(j), true); _dtYea.Rows.Add(dr3Pl); } tsAllSeasons.AddTeamStats(ts, Span.Season); tsAllPlayoffs.AddTeamStats(ts, Span.Playoffs); tsAll.AddTeamStats(ts, Span.SeasonAndPlayoffsToSeason); } else { _dtYea.Rows.Add(drcur); if (playedInPlayoffs) { _dtYea.Rows.Add(drcurPl); } } } _dtYea.Rows.Add(_dtYea.NewRow()); drcur = _dtYea.NewRow(); createDataRowFromTeamStats(tsAllSeasons, ref drcur, "All Seasons"); _dtYea.Rows.Add(drcur); drcur = _dtYea.NewRow(); createDataRowFromTeamStats(tsAllPlayoffs, ref drcur, "All Playoffs"); _dtYea.Rows.Add(drcur); _dtYea.Rows.Add(_dtYea.NewRow()); drcur = _dtYea.NewRow(); createDataRowFromTeamStats(tsAll, ref drcur, "All Games"); _dtYea.Rows.Add(drcur); var dvYea = new DataView(_dtYea) { AllowNew = false, AllowEdit = false }; dgvYearly.DataContext = dvYea; }
private void calculate2KRatings(bool playoffs = false) { string gpPctSetting = MainWindow.RatingsGPPctSetting; double gpPCTreq = MainWindow.RatingsGPPctRequired; string mpgSetting = MainWindow.RatingsMPGSetting; float MPGreq = MainWindow.RatingsMPGRequired; uint pGP = GP; var team = new TeamStats(); uint tGP = 0; try { team = MainWindow.TST.Single(ts => ts.Value.ID == TeamF).Value; tGP = playoffs ? team.GetPlayoffGames() : team.GetGames(); } catch (InvalidOperationException) { gpPctSetting = "-1"; } if ((gpPctSetting != "-1" && (double) (pGP*100)/tGP < gpPCTreq) || (mpgSetting != "-1" && MPG < MPGreq)) { reRFT = -1; reRPass = -1; reRBlock = -1; reRSteal = -1; reROffRbd = -1; reRDefRbd = -1; reTShotTnd = -1; reTDrawFoul = -1; reTTouch = -1; reTCommitFl = -1; return; } try { reRFT = Convert.ToInt32(100*FTp); if (reRFT > 99) { reRFT = 99; } } catch { reRFT = -1; } try { double ASTp100 = ASTp*100; reRPass = Convert.ToInt32(31.1901795687457 + 1.36501096444891*ASTp100 + 4.34894327991171/(-0.702541953738967 - ASTp100)); if (reRPass > 99) { reRPass = 99; } } catch { reRPass = -1; } try { double BLKp100 = BLKp*100; reRBlock = Convert.ToInt32(25.76 + 17.03*BLKp100 + 0.8376*Math.Pow(BLKp100, 3) - 3.195*Math.Pow(BLKp100, 2) - 0.07319*Math.Pow(BLKp100, 4)); if (reRBlock > 99) { reRBlock = 99; } } catch { reRBlock = -1; } try { double STLp100 = STLp*100; reRSteal = Convert.ToInt32(29.92 + 14.57*STLp100 - 0.1509*Math.Pow(STLp100, 2)); if (reRSteal > 99) { reRSteal = 99; } } catch { reRSteal = -1; } try { double OREBp100 = OREBp*100; reROffRbd = Convert.ToInt32(24.67 + 3.864*OREBp100 + 0.3523*Math.Pow(OREBp100, 2) + 0.0007358*Math.Pow(OREBp100, 4) - 0.02796*Math.Pow(OREBp100, 3)); if (reROffRbd > 99) { reROffRbd = 99; } } catch { reROffRbd = -1; } try { double DREBp100 = DREBp*100; reRDefRbd = Convert.ToInt32(25 + 2.5*DREBp100); if (reRDefRbd > 99) { reRDefRbd = 99; } } catch { reRDefRbd = -1; } try { reTShotTnd = Convert.ToInt32(2 + 4*FGAPG); if (reTShotTnd > 90) { reTShotTnd = 90; } } catch { reTShotTnd = -1; } try { reTDrawFoul = Convert.ToInt32(FTAR*10); if (reTDrawFoul > 99) { reTDrawFoul = 99; } } catch { reTDrawFoul = -1; } try { double FGAR = (double) FGA/MINS*36; int touchTotal = Convert.ToInt32(FGAR + FTAR + TOR + ASTR); reTTouch = Convert.ToInt32(3.141*Math.Pow(touchTotal, 2)/(1.178 + touchTotal)); if (reTTouch > 99) { reTTouch = 99; } } catch { reTTouch = -1; } try { reTCommitFl = Convert.ToInt32((double) FOUL/MINS*36*10); if (reTCommitFl > 99) { reTCommitFl = 99; } } catch { reTCommitFl = -1; } }
private void prepareHeadToHeadTab(out List<PlayerStatsRow> teamPMSRList, out List<PlayerStatsRow> oppPMSRList) { var iown = _curTeam; var iopp = _curOpp; var dtHTHBS = new DataTable(); dtHTHBS.Columns.Add("Date"); dtHTHBS.Columns.Add("Home-Away"); dtHTHBS.Columns.Add("Result"); dtHTHBS.Columns.Add("Score"); dtHTHBS.Columns.Add("GameID"); var ts = new TeamStats(_curTeam); var tsopp = new TeamStats(_curOpp); _db = new SQLiteDatabase(MainWindow.CurrentDB); if (_dtHTH.Rows.Count > 1) { _dtHTH.Rows.RemoveAt(_dtHTH.Rows.Count - 1); } var bsHist = MainWindow.BSHist; var bseList = bsHist.Where( bse => (bse.BS.Team1ID == _curTeam && bse.BS.Team2ID == _curOpp) || (bse.BS.Team1ID == _curOpp && bse.BS.Team2ID == _curTeam)).ToList(); if (rbHTHStatsAnyone.IsChecked.GetValueOrDefault()) { ts = _tst[iown]; ts.CalcAvg(); tsopp = _tst[iopp]; tsopp.CalcAvg(); } else { foreach (var bse in bseList) { TeamStats.AddTeamStatsFromBoxScore(bse.BS, ref ts, ref tsopp, true); } } //ts.CalcMetrics(tsopp); //tsopp.CalcMetrics(ts); var ls = new TeamStats(); ls.AddTeamStats(ts, Span.SeasonAndPlayoffsToSeason); ls.AddTeamStats(tsopp, Span.SeasonAndPlayoffsToSeason); var keys = _pst.Keys.ToList(); teamPMSRList = new List<PlayerStatsRow>(); oppPMSRList = new List<PlayerStatsRow>(); foreach (var key in keys) { if (_pst[key].TeamF == ts.ID) { teamPMSRList.Add(new PlayerStatsRow(_pst[key])); } else if (_pst[key].TeamF == tsopp.ID) { oppPMSRList.Add(new PlayerStatsRow(_pst[key])); } } foreach (var bse in bseList) { int t1PTS = bse.BS.PTS1; int t2PTS = bse.BS.PTS2; var bsr = dtHTHBS.NewRow(); bsr["Date"] = bse.BS.GameDate.ToString().Split(' ')[0]; if (bse.BS.Team1ID.Equals(_curTeam)) { bsr["Home-Away"] = "Away"; if (t1PTS > t2PTS) { bsr["Result"] = "W"; } else { bsr["Result"] = "L"; } } else { bsr["Home-Away"] = "Home"; if (t2PTS > t1PTS) { bsr["Result"] = "W"; } else { bsr["Result"] = "L"; } } bsr["Score"] = bse.BS.PTS1 + "-" + bse.BS.PTS2; bsr["GameID"] = bse.BS.ID.ToString(); dtHTHBS.Rows.Add(bsr); } _dtHTH.Clear(); var dr = _dtHTH.NewRow(); createDataRowFromTeamStats(ts, ref dr, "Averages"); _dtHTH.Rows.Add(dr); dr = _dtHTH.NewRow(); createDataRowFromTeamStats(tsopp, ref dr, "Opp Avg"); _dtHTH.Rows.Add(dr); dr = _dtHTH.NewRow(); createDataRowFromTeamStats(ts, ref dr, "Playoffs", true); _dtHTH.Rows.Add(dr); dr = _dtHTH.NewRow(); createDataRowFromTeamStats(tsopp, ref dr, "Opp Pl Avg", true); _dtHTH.Rows.Add(dr); _dvHTH = new DataView(_dtHTH) { AllowNew = false, AllowEdit = false }; dgvHTHStats.DataContext = _dvHTH; var dvHTHBS = new DataView(dtHTHBS) { AllowNew = false, AllowEdit = false }; dgvHTHBoxScores.DataContext = dvHTHBS; }
/// <summary>Adds one or more box scores resulting from an SQLite query to a TeamStats instance.</summary> /// <param name="res">The result of the query containing the box score records.</param> /// <param name="ts">The TeamStats instance to be modified.</param> /// <param name="tsopp">The opposing TeamStats instance to be modified..</param> private static void addToTeamStatsFromSQLBoxScores(DataTable res, ref TeamStats ts, ref TeamStats tsopp) { foreach (DataRow r in res.Rows) { addToTeamStatsFromSQLBoxScore(r, ref ts, ref tsopp); } }
/// <summary>Creates a data row from a TeamStats instance.</summary> /// <param name="ts">The TeamStats instance.</param> /// <param name="dr">The data row to be edited.</param> /// <param name="title">The title for the row's Type or Name column.</param> /// <param name="playoffs"> /// if set to <c>true</c>, the row will present the team's playoff stats; otherwise, the regular season's. /// </param> private static void createDataRowFromTeamStats(TeamStats ts, ref DataRow dr, string title, bool playoffs = false) { try { dr["Type"] = title; } catch { dr["Name"] = title; } float[] PerGame; if (!playoffs) { PerGame = ts.PerGame; dr["Games"] = ts.GetGames(); dr["Wins"] = ts.Record[0].ToString(); dr["Losses"] = ts.Record[1].ToString(); } else { PerGame = ts.PlPerGame; dr["Games"] = ts.GetPlayoffGames(); dr["Wins"] = ts.PlRecord[0].ToString(); dr["Losses"] = ts.PlRecord[1].ToString(); } dr["W%"] = String.Format("{0:F3}", PerGame[TAbbrPG.Wp]); dr["Weff"] = String.Format("{0:F2}", PerGame[TAbbrPG.Weff]); dr["PF"] = String.Format("{0:F1}", PerGame[TAbbrPG.PPG]); dr["PA"] = String.Format("{0:F1}", PerGame[TAbbrPG.PAPG]); dr["PD"] = String.Format("{0:F1}", PerGame[TAbbrPG.PD]); dr["FG"] = String.Format("{0:F3}", PerGame[TAbbrPG.FGp]); dr["FGeff"] = String.Format("{0:F2}", PerGame[TAbbrPG.FGeff]); dr["3PT"] = String.Format("{0:F3}", PerGame[TAbbrPG.TPp]); dr["3Peff"] = String.Format("{0:F2}", PerGame[TAbbrPG.TPeff]); dr["FT"] = String.Format("{0:F3}", PerGame[TAbbrPG.FTp]); dr["FTeff"] = String.Format("{0:F2}", PerGame[TAbbrPG.FTeff]); dr["REB"] = String.Format("{0:F1}", PerGame[TAbbrPG.RPG]); dr["OREB"] = String.Format("{0:F1}", PerGame[TAbbrPG.ORPG]); dr["DREB"] = String.Format("{0:F1}", PerGame[TAbbrPG.DRPG]); dr["AST"] = String.Format("{0:F1}", PerGame[TAbbrPG.APG]); dr["TO"] = String.Format("{0:F1}", PerGame[TAbbrPG.TPG]); dr["STL"] = String.Format("{0:F1}", PerGame[TAbbrPG.SPG]); dr["BLK"] = String.Format("{0:F1}", PerGame[TAbbrPG.BPG]); dr["FOUL"] = String.Format("{0:F1}", PerGame[TAbbrPG.FPG]); dr["MINS"] = String.Format("{0:F1}", PerGame[TAbbrPG.MPG]); }
/// <summary>Calculates the league PerGame.</summary> /// <param name="tst">The team stats dictionary.</param> /// <param name="statRange">The stat range.</param> /// <returns></returns> public static TeamStats CalculateLeagueAverages(Dictionary<int, TeamStats> tst, Span statRange) { var ls = new TeamStats(-1, "League"); var teamCount = countTeams(tst, statRange); for (var i = 0; i < tst.Count; i++) { ls.AddTeamStats(tst[i], statRange); } ls.CalcMetrics(ls, (statRange == Span.Playoffs)); ls.Record[0] /= teamCount; ls.Record[1] /= teamCount; ls.PlRecord[0] /= teamCount; ls.PlRecord[1] /= teamCount; ls.PerGame[TAbbrPG.Weff] /= teamCount; ls.PlPerGame[TAbbrPG.Weff] /= teamCount; return ls; }
private static void createTeamStatsFromDataRow(ref TeamStats ts, DataRow dr, bool playoffs = false) { var Totals = !playoffs ? ts.Totals : ts.PlTotals; var PerGame = !playoffs ? ts.PerGame : ts.PlPerGame; var Record = !playoffs ? ts.Record : ts.PlRecord; Record[0] = ParseCell.GetUInt16(dr, "Wins"); Record[1] = ParseCell.GetUInt16(dr, "Losses"); PerGame[TAbbrPG.Wp] = ParseCell.GetFloat(dr, "W%"); PerGame[TAbbrPG.Weff] = ParseCell.GetFloat(dr, "Weff"); PerGame[TAbbrPG.PPG] = ParseCell.GetFloat(dr, "PF"); PerGame[TAbbrPG.PAPG] = ParseCell.GetFloat(dr, "PA"); PerGame[TAbbrPG.PD] = ParseCell.GetFloat(dr, "PD"); PerGame[TAbbrPG.FGp] = ParseCell.GetFloat(dr, "FG"); PerGame[TAbbrPG.FGeff] = ParseCell.GetFloat(dr, "FGeff"); PerGame[TAbbrPG.TPp] = ParseCell.GetFloat(dr, "3PT"); PerGame[TAbbrPG.TPeff] = ParseCell.GetFloat(dr, "3Peff"); PerGame[TAbbrPG.FTp] = ParseCell.GetFloat(dr, "FT"); PerGame[TAbbrPG.FTeff] = ParseCell.GetFloat(dr, "FTeff"); PerGame[TAbbrPG.RPG] = ParseCell.GetFloat(dr, "REB"); PerGame[TAbbrPG.ORPG] = ParseCell.GetFloat(dr, "OREB"); PerGame[TAbbrPG.DRPG] = ParseCell.GetFloat(dr, "DREB"); PerGame[TAbbrPG.APG] = ParseCell.GetFloat(dr, "AST"); PerGame[TAbbrPG.TPG] = ParseCell.GetFloat(dr, "TO"); PerGame[TAbbrPG.SPG] = ParseCell.GetFloat(dr, "STL"); PerGame[TAbbrPG.BPG] = ParseCell.GetFloat(dr, "BLK"); PerGame[TAbbrPG.FPG] = ParseCell.GetFloat(dr, "FOUL"); PerGame[TAbbrPG.MPG] = ParseCell.GetFloat(dr, "MINS"); var games = Record[0] + Record[1]; Totals[TAbbrT.PF] = Convert.ToUInt32(PerGame[TAbbrPG.PPG] * games); Totals[TAbbrT.PA] = Convert.ToUInt32(PerGame[TAbbrPG.PAPG] * games); Totals[TAbbrT.FGM] = Convert.ToUInt32((PerGame[TAbbrPG.FGeff] / PerGame[TAbbrPG.FGp]) * games); Totals[TAbbrT.FGA] = Convert.ToUInt32(Totals[TAbbrT.FGM] / PerGame[TAbbrPG.FGp]); Totals[TAbbrT.TPM] = Convert.ToUInt32((PerGame[TAbbrPG.TPeff] / PerGame[TAbbrPG.TPp]) * games); Totals[TAbbrT.TPA] = Convert.ToUInt32(Totals[TAbbrT.TPM] / PerGame[TAbbrPG.TPp]); Totals[TAbbrT.FTM] = Convert.ToUInt32((PerGame[TAbbrPG.FTeff] / PerGame[TAbbrPG.FTp]) * games); Totals[TAbbrT.FTA] = Convert.ToUInt32(Totals[TAbbrT.FTM] / PerGame[TAbbrPG.FTp]); Totals[TAbbrT.DREB] = Convert.ToUInt32(PerGame[TAbbrPG.DRPG] * games); Totals[TAbbrT.OREB] = Convert.ToUInt32(PerGame[TAbbrPG.ORPG] * games); Totals[TAbbrT.AST] = Convert.ToUInt32(PerGame[TAbbrPG.APG] * games); Totals[TAbbrT.TOS] = Convert.ToUInt32(PerGame[TAbbrPG.TPG] * games); Totals[TAbbrT.STL] = Convert.ToUInt32(PerGame[TAbbrPG.SPG] * games); Totals[TAbbrT.BLK] = Convert.ToUInt32(PerGame[TAbbrPG.BPG] * games); Totals[TAbbrT.FOUL] = Convert.ToUInt32(PerGame[TAbbrPG.FPG] * games); Totals[TAbbrT.MINS] = Convert.ToUInt32(PerGame[TAbbrPG.MPG] * games); }
/// <summary>Calculates the metric stats for this team.</summary> /// <param name="tsopp">The opposing team stats.</param> /// <param name="playoffs"> /// if set to <c>true</c>, the metrics will be calculated based on the team's playoff performances. /// </param> public void CalcMetrics(TeamStats tsopp, bool playoffs = false) { var tempMetricsOwn = new Dictionary<string, double>(); var tempTotalsOwn = new double[Totals.Length]; for (var i = 0; i < Totals.Length; i++) { if (!playoffs) { tempTotalsOwn[i] = Totals[i]; } else { tempTotalsOwn[i] = PlTotals[i]; } } var tempTotalsOpp = new double[tsopp.Totals.Length]; if ((!playoffs && (GetGames() != tsopp.GetGames())) || (playoffs && (GetPlayoffGames() != tsopp.GetPlayoffGames()))) { for (var i = 0; i < tsopp.Totals.Length; i++) { tempTotalsOpp[i] = double.NaN; } } else { for (var i = 0; i < tsopp.Totals.Length; i++) { if (!playoffs) { tempTotalsOpp[i] = tsopp.Totals[i]; } else { tempTotalsOpp[i] = tsopp.PlTotals[i]; } } } var games = (!playoffs) ? GetGames() : GetPlayoffGames(); var poss = calcPossMetric(tempTotalsOwn, tempTotalsOpp); tempMetricsOwn.Add("Poss", poss); tempMetricsOwn.Add("PossPG", poss / games); var tempMetricsOpp = (!playoffs) ? tsopp.Metrics : tsopp.PlMetrics; try { tempMetricsOpp.Add("Poss", poss); } catch (ArgumentException) { tempMetricsOpp["Poss"] = poss; } catch { Console.WriteLine("Possessions metric couldn't be calculated for team " + ID); } var pace = MainWindow.GameLength * ((tempMetricsOwn["Poss"] + tempMetricsOpp["Poss"]) / (2 * (tempTotalsOwn[TAbbrT.MINS]))); tempMetricsOwn.Add("Pace", pace); var ortg = (tempTotalsOwn[TAbbrT.PF] / tempMetricsOwn["Poss"]) * 100; tempMetricsOwn.Add("ORTG", ortg); var drtg = (tempTotalsOwn[TAbbrT.PA] / tempMetricsOwn["Poss"]) * 100; tempMetricsOwn.Add("DRTG", drtg); var astP = (tempTotalsOwn[TAbbrT.AST]) / (tempTotalsOwn[TAbbrT.FGA] + tempTotalsOwn[TAbbrT.FTA] * 0.44 + tempTotalsOwn[TAbbrT.AST] + tempTotalsOwn[TAbbrT.TOS]); tempMetricsOwn.Add("AST%", astP); var drebP = tempTotalsOwn[TAbbrT.DREB] / (tempTotalsOwn[TAbbrT.DREB] + tempTotalsOpp[TAbbrT.OREB]); tempMetricsOwn.Add("DREB%", drebP); var efgP = (tempTotalsOwn[TAbbrT.FGM] + tempTotalsOwn[TAbbrT.TPM] * 0.5) / tempTotalsOwn[TAbbrT.FGA]; tempMetricsOwn.Add("EFG%", efgP); var effD = ortg - drtg; tempMetricsOwn.Add("EFFd", effD); var tor = tempTotalsOwn[TAbbrT.TOS] / (tempTotalsOwn[TAbbrT.FGA] + 0.44 * tempTotalsOwn[TAbbrT.FTA] + tempTotalsOwn[TAbbrT.TOS]); tempMetricsOwn.Add("TOR", tor); var orebP = tempTotalsOwn[TAbbrT.OREB] / (tempTotalsOwn[TAbbrT.OREB] + tempTotalsOpp[TAbbrT.DREB]); tempMetricsOwn.Add("OREB%", orebP); var ftr = tempTotalsOwn[TAbbrT.FTM] / tempTotalsOwn[TAbbrT.FGA]; tempMetricsOwn.Add("FTR", ftr); var tempPerGame = (!playoffs) ? PerGame : PlPerGame; var pwP = (((tempPerGame[TAbbrPG.PPG] - tempPerGame[TAbbrPG.PAPG]) * 2.7) + ((double) MainWindow.SeasonLength / 2)) / MainWindow.SeasonLength; tempMetricsOwn.Add("PW%", pwP); var tsP = tempTotalsOwn[TAbbrT.PF] / (2 * (tempTotalsOwn[TAbbrT.FGA] + 0.44 * tempTotalsOwn[TAbbrT.FTA])); tempMetricsOwn.Add("TS%", tsP); var tpr = tempTotalsOwn[TAbbrT.TPA] / tempTotalsOwn[TAbbrT.FGA]; tempMetricsOwn.Add("3PR", tpr); var pythW = MainWindow.SeasonLength * (Math.Pow(tempTotalsOwn[TAbbrT.PF], 16.5)) / (Math.Pow(tempTotalsOwn[TAbbrT.PF], 16.5) + Math.Pow(tempTotalsOwn[TAbbrT.PA], 16.5)); tempMetricsOwn.Add("PythW", pythW); var pythL = MainWindow.SeasonLength - pythW; tempMetricsOwn.Add("PythL", pythL); var gmsc = tempTotalsOwn[TAbbrT.PF] + 0.4 * tempTotalsOwn[TAbbrT.FGM] - 0.7 * tempTotalsOwn[TAbbrT.FGA] - 0.4 * (tempTotalsOwn[TAbbrT.FTA] - tempTotalsOwn[TAbbrT.FTM]) + 0.7 * tempTotalsOwn[TAbbrT.OREB] + 0.3 * tempTotalsOwn[TAbbrT.DREB] + tempTotalsOwn[TAbbrT.STL] + 0.7 * tempTotalsOwn[TAbbrT.AST] + 0.7 * tempTotalsOwn[TAbbrT.BLK] - 0.4 * tempTotalsOwn[TAbbrT.FOUL] - tempTotalsOwn[TAbbrT.TOS]; tempMetricsOwn.Add("GmSc", gmsc / games); if (!playoffs) { Metrics = new Dictionary<string, double>(tempMetricsOwn); } else { PlMetrics = new Dictionary<string, double>(tempMetricsOwn); } }
/// <summary>Handles the Click event of the btnAdd control. Allows the user to add teams or players the database.</summary> /// <param name="sender">The source of the event.</param> /// <param name="e"> /// The <see cref="RoutedEventArgs" /> instance containing the event data. /// </param> private async void btnAdd_Click(object sender, RoutedEventArgs e) { if (String.IsNullOrEmpty(CurrentDB)) { return; } if (Tf.IsBetween) { IsEnabled = false; Tf = new Timeframe(CurSeason); await UpdateAllData(); IsEnabled = true; } AddInfo = ""; var aw = new AddWindow(ref PST); aw.ShowDialog(); if (!String.IsNullOrEmpty(AddInfo)) { if (AddInfo != "$$NST Players Added") { var parts = Tools.SplitLinesToArray(AddInfo); var newTeams = parts.Where(s => !String.IsNullOrWhiteSpace(s)).ToList(); var oldlen = TST.Count; if (SQLiteIO.IsTSTEmpty()) { oldlen = 0; } for (var i = 0; i < newTeams.Count; i++) { if (TST.Count(pair => pair.Value.Name == newTeams[i]) == 1) { MessageBox.Show( "There's a team with the name " + newTeams[i] + " already in the database so it won't be added again."); continue; } var newid = oldlen + i; TST[newid] = new TeamStats(newid, newTeams[i]); TSTOpp[newid] = new TeamStats(newid, newTeams[i]); } await saveAndReloadSeason(); UpdateStatus("Teams were added, database saved."); } else { await saveAndReloadSeason(); UpdateStatus("Players were added, database saved."); } } }