/// <summary> /// Gets the sum of the factors based on the criteria. /// </summary> /// <param name="tbl"></param> /// <param name="edu"></param> /// <param name="race"></param> /// <param name="region"></param> /// <param name="age"></param> /// <param name="gender"></param> /// <param name="maritialStatus"></param> /// <returns></returns> internal static double GetFactor(FactorTables tbl, OccidentalEdu edu, NorthAmericanRace race, AmericanRegion region, int age, Gender gender, MaritialStatus maritialStatus) { var xmlDoc = tbl == FactorTables.CreditCardDebt || tbl == FactorTables.HomeDebt || tbl == FactorTables.VehicleDebt ? TreeData.UsPersonalDebt : TreeData.UsPersonalWealth; var tblName = Enum.GetName(typeof(FactorTables), tbl); var eduName = GetXmlEduName(edu); var raceName = Enum.GetName(typeof(NorthAmericanRace), race); var regionName = Enum.GetName(typeof(AmericanRegion), region); var genderName = Enum.GetName(typeof(Gender), gender); var tblXPath = $"//table[@name='{tblName}']"; var sum = 0.0D; var hash = new Dictionary<string, string> { {"Edu", eduName}, {"Race", raceName}, {"Region", regionName}, }; foreach (var factor in hash.Keys) { var xmlElem = xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='{factor}']/add[@name='{hash[factor]}']") as XmlElement; var factorVal = xmlElem?.Attributes["value"]?.Value; if (string.IsNullOrWhiteSpace(factorVal)) continue; double dblOut; if (double.TryParse(factorVal, out dblOut)) sum += dblOut; } var ageNode = maritialStatus == MaritialStatus.Remarried || maritialStatus == MaritialStatus.Remarried ? xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='Age']/factor[@name='Married']") : xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='Age']/factor[@name='{genderName}']"); if (ageNode == null) return sum; foreach (var anode in ageNode.ChildNodes) { var ageElem = anode as XmlElement; if (ageElem == null) continue; var minAge = ageElem.Attributes["min"]?.Value; var maxAge = ageElem.Attributes["max"]?.Value; if (string.IsNullOrWhiteSpace(minAge) || string.IsNullOrWhiteSpace(maxAge)) continue; int min, max; if (!int.TryParse(minAge, out min) || !int.TryParse(maxAge, out max)) continue; var isInRange = age >= min && age <= max; if (!isInRange || string.IsNullOrWhiteSpace(ageElem.Attributes["value"]?.Value)) continue; var factorVal = ageElem.Attributes["value"].Value; double dblOut; if (double.TryParse(factorVal, out dblOut)) sum += dblOut; } return sum; }
/// <summary> /// Gets the mean of the factors based on the criteria. /// </summary> /// <param name="tbl"></param> /// <param name="edu"></param> /// <param name="race"></param> /// <param name="region"></param> /// <param name="age"></param> /// <param name="gender"></param> /// <param name="maritalStatus"></param> /// <returns> /// A scalar factor above or below the national average(s) based on the given criteria /// </returns> /// <remarks> /// src https://www2.census.gov/programs-surveys/demo/tables/wealth/2013/wealth-asset-ownership/wealth-tables-2013.xlsx /// https://www2.census.gov/programs-surveys/demo/tables/wealth/2011/wealth-asset-ownership/debt-tables-2011.xlsx /// </remarks> public static double GetFactor(AmericanFactorTables tbl, OccidentalEdu edu, NorthAmericanRace race, AmericanRegion region, int age, Gender gender, MaritalStatus maritalStatus) { DebtXml = DebtXml ?? XmlDocXrefIdentifier.GetEmbeddedXmlDoc(US_PERSONAL_DEBT, Assembly.GetExecutingAssembly()); WealthXml = WealthXml ?? XmlDocXrefIdentifier.GetEmbeddedXmlDoc(US_PERSONAL_WEALTH, Assembly.GetExecutingAssembly()); var xmlDoc = tbl == AmericanFactorTables.CreditCardDebt || tbl == AmericanFactorTables.HomeDebt || tbl == AmericanFactorTables.VehicleDebt ? DebtXml : WealthXml; var tblName = Enum.GetName(typeof(AmericanFactorTables), tbl); var eduName = GetXmlEduName(edu); var raceName = Enum.GetName(typeof(NorthAmericanRace), race); var regionName = Enum.GetName(typeof(AmericanRegion), region); var genderName = Enum.GetName(typeof(Gender), gender); var tblXPath = $"//table[@name='{tblName}']"; var factorCount = 0D; var sum = 0.0D; var hash = new Dictionary <string, string> { { "Edu", eduName }, { "Race", raceName }, { "Region", regionName }, }; foreach (var factor in hash.Keys) { var xmlElem = xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='{factor}']/add[@name='{hash[factor]}']") as XmlElement; var factorVal = xmlElem?.Attributes["value"]?.Value; if (string.IsNullOrWhiteSpace(factorVal)) { continue; } if (double.TryParse(factorVal, out var dblOut)) { sum += dblOut; factorCount += 1; } } var ageNode = maritalStatus == MaritalStatus.Married || maritalStatus == MaritalStatus.Remarried ? xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='Age']/factor[@name='Married']") : xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='Age']/factor[@name='{genderName}']"); factorCount = factorCount <= 0 ? 1 : factorCount; if (ageNode == null) { return(Math.Round(sum / factorCount, 5)); } foreach (var anode in ageNode.ChildNodes) { var ageElem = anode as XmlElement; if (ageElem == null) { continue; } var minAge = ageElem.Attributes["min"]?.Value; var maxAge = ageElem.Attributes["max"]?.Value; if (string.IsNullOrWhiteSpace(minAge) || string.IsNullOrWhiteSpace(maxAge)) { continue; } if (!int.TryParse(minAge, out var min) || !int.TryParse(maxAge, out var max)) { continue; } var isInRange = age >= min && age <= max; if (!isInRange || string.IsNullOrWhiteSpace(ageElem.Attributes["value"]?.Value)) { continue; } var factorVal = ageElem.Attributes["value"].Value; if (double.TryParse(factorVal, out var dblOut)) { sum += dblOut; factorCount += 1; } } return(Math.Round(sum / factorCount, 5)); }