Files
linqpad/Nursing Census Data Analysis.linq

161 lines
6.2 KiB
C#

<Query Kind="Program">
<Connection>
<ID>463c2997-8a6a-4688-9575-6549e5215f7b</ID>
<Persist>true</Persist>
<Server>D0011-SQL-01.sdt.local</Server>
<Database>jazz tst CNE 20191210.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var configurationGuid = Guid.Parse("880C4912-5A58-40B7-ADB1-1F9BD365E6AF");
(from sd in StaffingToDemandPatientVolumes
where new[] {21398, 21915}.Contains(sd.DepartmentID)
select sd).ToList()
.OrderBy(g => g.DepartmentID)
.ThenBy(g => g.IsBaseline)
.ThenBy(g => g.DayOfWeek)
.ThenBy(g => g.Seasonality)
.ThenBy(g => g.Hour)
.Dump(nameof(StaffingToDemandPatientVolumes));
var CensusData =
from obj in Nursings
join f in DimFunctionalAreas on obj.DimDepartment.FunctionalAreaID equals f.FunctionalAreaID
join fj in NursingFlexJobCodeGroups on obj.NursingGUID equals fj.NursingGUID
join j in DimFlexJobCodeGroups on fj.FlexJobCodeGroupID equals j.FlexJobCodeGroupID
where obj.ConfigurationGUID == configurationGuid
select new
{
obj.DepartmentID,
obj.NumOfBeds,
obj.IsComplete,
obj.IsNewborn,
InPatientDays = new FlattenDays("InPatientDays", obj).Values,
ObservationDays = new FlattenDays("ObservationDays", obj).Values,
NewbornInPatientDays = new FlattenDays("NewbornInPatientDays", obj).Values,
NewbornObservationDays = new FlattenDays("NewbornObservationDays", obj).Values,
Seasonality = new FlattenSeasonality("Seasonality", obj).Values,
obj.DimDepartment.Name,
FunctionalAreaName = f.Name,
fj.WHPPDBaseline,
fj.MedianAnnualWageBaseline,
fj.DirectCarePercentageBaseline,
fj.UnproductivePercentBaseline,
fj.WHPPD,
fj.MedianAnnualWage,
fj.DirectCarePercentage,
fj.UnproductivePercent,
fj.PatientCare,
fj.AcutyAdjustment,
fj.RoundingRule,
fj.FlexJobCodeGroupID,
fj.StaffingModelType,
StaffingModelConfig = Newtonsoft.Json.JsonConvert.DeserializeObject<ModelValue>(fj.StaffingModelConfig),//.PatientRatios,
JobName = j.Name,
j.Code,
j.SortOrder
};
CensusData.Where(cd => new [] {"2310 - 11150 - DELIVERY","2110 - 11071 - RIVERVIEW 3"}.Contains(cd.Name) && cd.JobName == "RN").Dump();
}
// Define other methods and classes here
public class ModelValue
{
public IList<StaffingModel> ModelValues { get; set; }
internal Dictionary<int, Dictionary<int, double>> PatientRatios => ModelValues
.GroupBy(mv => mv.DayOfWeek, (dayOfWeek, d) => new
{
dayOfWeek,
HourlyRatios = d.Select(x => new { x.HourOfDay, x.PatientRatio })
.ToDictionary(key => key.HourOfDay, value => value.PatientRatio)
}).ToDictionary(key => key.dayOfWeek, value => value.HourlyRatios);
}
public class StaffingModel
{
public int DayOfWeek { get; set; }
public int HourOfDay { get; set; }
public double PatientRatio { get; set; }
}
public class FlattenDays
{
public IEnumerable<double> Values { get; set; }
public FlattenDays(string name, Nursing obj)
{
var regex = new Regex($"Month[\\d]{{2}}{name}", RegexOptions.IgnoreCase);
Type t = typeof(Nursing);
var fields = t.GetFields(BindingFlags.Public | BindingFlags.Instance)
.Where(f => regex.IsMatch(f.Name))
.OrderBy(f => f.Name);
Values = fields.Select(field => (double)field.GetValue(obj));
}
}
public class FlattenSeasonality
{
public IEnumerable<byte> Values { get; set; }
public FlattenSeasonality(string name, Nursing obj)
{
var regex = new Regex($"Month[\\d]{{2}}{name}", RegexOptions.IgnoreCase);
Type t = typeof(Nursing);
var fields = t.GetFields(BindingFlags.Public | BindingFlags.Instance)
.Where(f => regex.IsMatch(f.Name))
.OrderBy(f => f.Name);
Values = fields.Select(field => (byte)field.GetValue(obj));
}
}