/// <summary> /// Get the demographics data for all zipcodes in the list /// </summary> /// <param name="zipCodes"></param> /// <param name="saveToDb">Save each demographic as it is retrieved</param> /// <param name="randomWaitSeconds">Sleep for between 0 and randomWaitSeconds between each request</param> public static List <DemographicsModel> GetDemographics(List <int> zipCodes, [Optional] bool saveToDb, [Optional] int randomWaitSeconds) { List <DemographicsModel> results = new List <DemographicsModel>(); DemographicsModel result = null; foreach (int zipCode in zipCodes) { // Sleep for a random number of seconds between 0 and randomWaitSeconds. Default is 0. Random random = new Random(); int seconds = random.Next(0, randomWaitSeconds); System.Threading.Thread.Sleep(seconds * 1000); result = DemographicsQuery.GetDemographic(zipCode); if (null != result) { results.Add(result); if (saveToDb == true) { DemographicsData.UpdateDatabase(new List <DemographicsModel> { result }); } } else { // We hit a ? and are blocked break; } } Console.WriteLine("Queried a total of {0} zip codes", results.Count); return(results); }
public static void UpdatePatientDemographics(int patientID, DemographicsModel demo) { if (Users == null) { Initialize(); } Patients.FirstOrDefault(x => x.PatientData.ID == patientID.ToString()).Demographics = demo; }
public async Task GetDemographicsModelShouldBeSuccessful() { ClarifaiResponse <IModel <Demographics> > response = await Client.GetModel <Demographics>( Client.PublicModels.DemographicsModel.ModelID) .ExecuteAsync(); Assert.True(response.IsSuccessful); Assert.AreEqual(10000, response.Status.StatusCode); Assert.AreEqual(HttpStatusCode.OK, response.HttpCode); Assert.NotNull(response.RawBody); DemographicsModel demographicsModel = (DemographicsModel)response.Get(); Assert.NotNull(demographicsModel.ModelID); }
public static DemographicsModel GetDemographic(int zipCode) { if (zipCode > 99999) { Console.WriteLine("Zip Code {0} cannot be more than 5 digits. Skipping it.", zipCode); return(null); } string page = DemographicsQuery.GetPage(zipCode); if (page.Equals("?")) { Console.WriteLine("Request for {0} contains '?' which means that this IP address is blocked by zipwho.com. Use www.whatismyip.com to see your IP address.", zipCode); return(null); } DemographicsModel result = DemographicsQuery.ParsePage(page, zipCode); return(result); }
public void DemographicsTest() { List <int> zipCodes = new List <int> { 98103, 98052, 98007 }; List <DemographicsModel> results = DemographicsQuery.GetDemographics(zipCodes); Assert.AreEqual(3, results.Count); DemographicsModel fremont = results.Single(x => x.Zip == 98103); Assert.AreEqual(49044, fremont.MedianIncome); Assert.AreEqual(73, fremont.MedianIncomeRank); Assert.AreEqual(43.9, fremont.OwnerOccupiedHomesPercent); Assert.AreEqual(5, fremont.OwnerOccupiedHomesRank); Assert.AreEqual(36.5, fremont.MarriedPercent); Assert.AreEqual(2, fremont.MarriedRank); Assert.AreEqual("Seattle", fremont.City); Assert.AreEqual("WA", fremont.State); }
private static DemographicsModel ParsePage(string page, int zipCode) { // Get the csv list of fields and values. This needs to be done in two steps until a better regex can be made. string pattern = @"getData\(\)(?<text>.*?)"";"; Regex regex = new Regex(pattern, RegexOptions.Singleline); Match match = regex.Match(page); string partialText = match.Groups["text"].Value; pattern = @"""(?<fields>.*?)\\n(?<values>.*?)$"; regex = new Regex(pattern, RegexOptions.Singleline); match = regex.Match(partialText); string fieldsCsv = match.Groups["fields"].Value; string valuesCsv = match.Groups["values"].Value; string[] fields = fieldsCsv.Split(','); string[] values = valuesCsv.Split(','); // Fields and values should align by their index. Put them into a dictionary. Dictionary <string, string> data = new Dictionary <string, string>(); for (int i = 0; i < fields.Length; i++) { data.Add(fields[i], values[i]); } // Now populate the object with data from the dictionary DemographicsModel result = new DemographicsModel(); result.Zip = zipCode; // Some of the data is empty so this condition will check if it is populated or not. if (!regex.IsMatch(partialText)) { Console.WriteLine("No data found for {0}", zipCode); } else { result.City = data["city"]; result.State = data["state"]; result.MedianIncome = Convert.ToInt32(data["MedianIncome"]); result.MedianIncomeRank = Convert.ToInt32(data["MedianIncomeRank"]); result.CostOfLivingIndex = Convert.ToDouble(data["CostOfLivingIndex"]); result.CostOfLivingRank = Convert.ToInt32(data["CostOfLivingRank"]); result.MedianMortgageToIncomeRatio = Convert.ToDouble(data["MedianMortgageToIncomeRatio"]); result.MedianMortgageToIncomeRank = Convert.ToInt32(data["MedianMortgageToIncomeRank"]); result.OwnerOccupiedHomesPercent = Convert.ToDouble(data["OwnerOccupiedHomesPercent"]); result.OwnerOccupiedHomesRank = Convert.ToInt32(data["OwnerOccupiedHomesRank"]); result.MedianRoomsInHome = Convert.ToDouble(data["MedianRoomsInHome"]); result.MedianRoomsInHomeRank = Convert.ToInt32(data["MedianRoomsInHomeRank"]); result.CollegeDegreePercent = Convert.ToDouble(data["CollegeDegreePercent"]); result.CollegeDegreeRank = Convert.ToInt32(data["CollegeDegreeRank"]); result.ProfessionalPercent = Convert.ToDouble(data["ProfessionalPercent"]); result.ProfessionalRank = Convert.ToInt32(data["ProfessionalRank"]); result.Population = Convert.ToInt32(data["Population"]); result.PopulationRank = Convert.ToInt32(data["PopulationRank"]); result.AverageHouseholdSize = Convert.ToDouble(data["AverageHouseholdSize"]); result.AverageHouseholdSizeRank = Convert.ToInt32(data["AverageHouseholdSizeRank"]); result.MedianAge = Convert.ToDouble(data["MedianAge"]); result.MedianAgeRank = Convert.ToInt32(data["MedianAgeRank"]); result.MaleToFemaleRatio = Convert.ToDouble(data["MaleToFemaleRatio"]); result.MaleToFemaleRank = Convert.ToInt32(data["MaleToFemaleRank"]); result.MarriedPercent = Convert.ToDouble(data["MarriedPercent"]); result.MarriedRank = Convert.ToInt32(data["MarriedRank"]); result.DivorcedPercent = Convert.ToDouble(data["DivorcedPercent"]); result.DivorcedRank = Convert.ToInt32(data["DivorcedRank"]); result.WhitePercent = Convert.ToDouble(data["WhitePercent"]); result.WhiteRank = Convert.ToInt32(data["WhiteRank"]); result.BlackPercent = Convert.ToDouble(data["BlackPercent"]); result.BlackRank = Convert.ToInt32(data["BlackRank"]); result.AsianPercent = Convert.ToDouble(data["AsianPercent"]); result.AsianRank = Convert.ToInt32(data["AsianRank"]); result.HispanicEthnicityPercent = Convert.ToDouble(data["HispanicEthnicityPercent"]); result.HispanicEthnicityRank = Convert.ToInt32(data["HispanicEthnicityRank"]); Console.WriteLine("Data found for {0}", zipCode); } result.LastUpdated = DateTime.UtcNow; return(result); }