internal DataTable GetImpressionStatsBetween(DateTime firstDate, DateTime secondDate)
		{
			firstDate = firstDate.Date;
			secondDate = secondDate.Date;

			// get traffic data
			Bobs.BannerServer.Traffic.DataDrivenTrafficShape ts = new Bobs.BannerServer.Traffic.DataDrivenTrafficShape();

			List<Log> actualHitLogCounts = GetActualLogCounts(firstDate, secondDate).ToList();
			BannerSet actualBannerImpressions = GetActualBannerImpressions(firstDate, secondDate);

			DataTable dt = CreateStatsDataTable();

			// foreach day between first and second date
			for (DateTime date = firstDate; date <= secondDate; date = date.AddDays(1))
			{
				// foreach banner position
				foreach (Banner.Positions position in Enum.GetValues(typeof(Banner.Positions)))
				{
					if (position == Banner.Positions.None) continue;

					Log.Items actualHitLogItem = Banner.GetLogItemTypeFromPositionType(position);

					DataRow dr = dt.NewRow();
					dr["Position"] = position.ToString();
					dr["Date"] = date;

					// get calculated page hit stats for this date
					using (new Common.General.Context<Clock>(() => Common.Time.Clock, (c) => Common.Time.Clock = c, new FixedClock(date)))
					{
						dr["ExpectedPageHits"] = ts.GetPredictedCountOfLogItemBetweenDates(actualHitLogItem, date, date.AddDays(1));
					}

					// get actual page hit stats for this date
					Log actualHitLog = actualHitLogCounts.Find(l => l.Date == date && l.ItemType == actualHitLogItem);
					if (actualHitLog != null)
					{
						dr["ActualPageHits"] = actualHitLog.Count;
					}

					// get total required impressions for all banners of this position for this day
					dr["RequiredImpressions"] = Banner.GetPredictedRequiredImpressions(date, position);

					// get actual impressions for all banners of this position for this day
					Banner banner = actualBannerImpressions.ToList().Find(b => b.Position == position && ((DateTime)b.ExtraSelectElements["BannerStatDate"]).CompareTo(date) == 0);
					if (banner != null)
					{
						dr["ActualImpressions"] = banner.ExtraSelectElements["SumHits"];
					}

					dt.Rows.Add(dr);
				}
			}

			return dt;
		}
		public void DateCal_DayRender(object o, DayRenderEventArgs e)
		{
			if (e.Day.IsOtherMonth)
			{
				e.Cell.Text = "";
				if (e.Day.Date.Day < 15)
				{
					e.Cell.Visible = false;
				}
				return;
			}

			DateTime date = e.Day.Date;

			int hits = 0;
			bool predictHits = date.CompareTo(Time.Today) >= 0;
			if (predictHits)
			{
				Bobs.BannerServer.Traffic.DataDrivenTrafficShape ts = new Bobs.BannerServer.Traffic.DataDrivenTrafficShape();
				hits = (int)Math.Floor(ts.GetPredictedCountOfLogItemBetweenDates(
					Banner.GetLogItemTypeFromPositionType(Position), date, date.AddDays(1)));
			}
			else
			{
				hits = Log.GetCount(Banner.GetLogItemTypeFromPositionType(Position), date);
			}

			// get total required impressions for all banners of this position for this day
			long requiredImpressions = Banner.GetPredictedRequiredImpressions(date, Position);

			e.Day.IsSelectable = false;


			if (hits > 0 && requiredImpressions > 0)
			{
				int perc = (int) Math.Round(100 * (((double) requiredImpressions) / ((double) hits)));
				e.Cell.Style["padding"] = "2px";
				e.Cell.Text = "<center><small>" + e.Day.DayNumberText + "</small>" +
				              "<br><font size=2><b><nobr>" + perc.ToString("n0") + "</nobr></b></font></center>";
				e.Cell.ToolTip = "Required impressions: " + requiredImpressions.ToString("N0") +
				                 (predictHits ? "\nPredicted" : "\nActual") + " hits: " + hits.ToString("N0");
				Color baseCol = Cambro.Misc.ColorHelp.HexStringToColor("FECA26");
				Color newCol = Cambro.Misc.RGBHSL.ModifyBrightness(baseCol, .2 + .8 * Math.Max(0, (100 - perc) / 100.0));
				e.Cell.Style["background-color"] = "#" + Cambro.Misc.ColorHelp.ColorToHexString(newCol);
			}

		}
Ejemplo n.º 3
0
		private static long getPredictedRequiredImpressions(DateTime date, Banner.Positions position)
		{
			BannerSet bs;
			Query q = new Query();
			q.Columns = new ColumnSet(Banner.Columns.K, Banner.Columns.FirstDay, Banner.Columns.LastDay, Banner.Columns.TotalRequiredImpressions);
			q.QueryCondition = new And(Banner.IsLiveOnDateQ(date), new Q(Banner.Columns.Position, position), new Q(Banner.Columns.TotalRequiredImpressions, QueryOperator.GreaterThan, 0));
			bs = new BannerSet(q);

			// if we're inspecting the past, predict as if today is the date in the past.
			// otherwise future predictions need to use current data.
			DateTime fixedDate;
			if (date < Time.Today)
			{
				fixedDate = date;
			}
			else
			{
				fixedDate = Time.Today;
			}

			Bobs.BannerServer.Traffic.DataDrivenTrafficShape ts = new Bobs.BannerServer.Traffic.DataDrivenTrafficShape();
			Log.Items logItem = Banner.GetLogItemTypeFromPositionType(position);

			long requiredImpressions = 0;

			foreach (Banner b in bs)
			{
				double thisDayCount = ts.GetPredictedCountOfLogItemBetweenDates(logItem, date, date.AddDays(1), fixedDate);
				double totalWeekCount = thisDayCount;

				for (DateTime d = date.AddDays(1); d <= date.AddDays(6); d = d.AddDays(1))
				{
					totalWeekCount += ts.GetPredictedCountOfLogItemBetweenDates(logItem, d, d.AddDays(1), fixedDate);
				}

				requiredImpressions += (int)Math.Round(b.TotalRequiredImpressions * (thisDayCount / totalWeekCount) * (7.0 / ((b.LastDay - b.FirstDay).TotalDays + 1)));
			}

			return requiredImpressions;
		}