def get_daily_plot(day): """Return matplotlib plot representing a day's plot.""" start, end = get_open_close(day) desktops = list_desktops(public_only=True) profiles = UtilizationProfile.from_hostnames(desktops, start, end).values() desks_count = len(desktops) now = datetime.now() latest = min(end, now) minute = timedelta(minutes=1) times = [start + i * minute for i in range((latest - start) // minute + 1)] if now >= end or now <= start: now = None sums = [] for t in times: instant15 = t + timedelta(seconds=15) instant45 = t + timedelta(seconds=45) in_use = sum( 1 if profile.in_use(instant15) or profile.in_use(instant45) else 0 for profile in profiles) sums.append(in_use) # Do a weighted moving average to smooth out the data processed = [0] * len(sums) for i in range(len(sums)): for delta_i, weight in AVERAGE_WEIGHTS: m = i if (i + delta_i < 0 or i + delta_i >= len(sums)) else i + delta_i # Don't use data that hasn't occurred yet if now and times[i] <= now and times[m] >= now: processed[i] += weight * sums[i] elif now and times[i] > now: processed[i] = 0 else: processed[i] += weight * sums[m] fig = Figure(figsize=(10, 4)) ax = fig.add_subplot(1, 1, 1) ax.grid(True) ax.plot_date(times, processed, fmt='b-', color='k', linewidth=1.5) # Draw a vertical line, if applicable, showing current time if now: ax.axvline(now, linewidth=1.5) # Draw a horizontal line for total desktops ax.axhline(desks_count, ls='dashed') ax.annotate(' Total desktops', xy=(start, desks_count + 1)) ax.xaxis.set_major_formatter(DateFormatter('%-I%P')) ax.set_xlim(start, end) ax.set_ylim(0, desks_count + 5) ax.set_ylabel('Computers in Use') ax.set_title(f'Lab Utilization {day:%a %b %d}') return fig
def test_fast_slow_profiles_same(): start = datetime(2015, 11, 23) end = start + timedelta(days=1) slow_profiles = { host + '.ocf.berkeley.edu': UtilizationProfile.from_hostname(host, start, end) for host in list_desktops() } fast_profiles = UtilizationProfile.from_hostnames(list_desktops(), start, end) assert set(slow_profiles.keys()) == set(fast_profiles.keys()) for host in slow_profiles.keys(): slow = slow_profiles[host] fast = fast_profiles[host] assert slow.hostname == fast.hostname assert slow.start == fast.start assert slow.end == fast.end assert slow.sessions == fast.sessions
def get_daily_plot(day): """Return matplotlib plot representing a day's plot.""" start, end = get_open_close(day) profiles = UtilizationProfile.from_hostnames(list_desktops(public_only=True), start, end).values() now = datetime.now() latest = min(end, now) minute = timedelta(minutes=1) times = [start + i * minute for i in range((latest - start) // minute + 1)] if now >= end or now <= start: now = None sums = [] for t in times: instant15 = t + timedelta(seconds=15) instant45 = t + timedelta(seconds=45) in_use = sum(1 if profile.in_use(instant15) or profile.in_use(instant45) else 0 for profile in profiles) sums.append(in_use) # Do a weighted moving average to smooth out the data processed = [0] * len(sums) for i in range(len(sums)): for delta_i, weight in AVERAGE_WEIGHTS: m = i if (i + delta_i < 0 or i + delta_i >= len(sums)) else i + delta_i # Don't use data that hasn't occurred yet if now and times[i] <= now and times[m] >= now: processed[i] += weight * sums[i] elif now and times[i] > now: processed[i] = 0 else: processed[i] += weight * sums[m] fig = Figure(figsize=(10, 4)) ax = fig.add_subplot(1, 1, 1) ax.grid(True) ax.plot_date(times, processed, fmt='b-', color='k', linewidth=1.5) # Draw a vertical line, if applicable, showing current time if now: ax.axvline(now, linewidth=1.5) ax.xaxis.set_major_formatter(DateFormatter('%-I%P')) ax.set_xlim(start, end) ax.set_ylim(0, len(profiles)) ax.set_ylabel('Computers in Use') ax.set_title('Lab Utilization {:%a %b %d}'.format(day)) return fig
def desktop_profiles(): open_, close = get_open_close(date.today()) now = datetime.today() # If the lab has opened, but hasn't closed yet, only count # statistics until the current time. If the lab isn't open # yet, then don't count anything, and if it is closed, show # statistics from when it was open during the day. if now > open_ and now < close: end = now elif now <= open_: end = open_ else: end = close return sorted( UtilizationProfile.from_hostnames(list_desktops(), open_, end).values(), key=attrgetter('hostname'), )
def desktop_profiles() -> List[Any]: open_, close = get_open_close(date.today()) now = datetime.today() # If the lab has opened, but hasn't closed yet, only count # statistics until the current time. If the lab isn't open # yet, then don't count anything, and if it is closed, show # statistics from when it was open during the day. if now > open_ and now < close: end = now elif now <= open_: end = open_ else: end = close return sorted( UtilizationProfile.from_hostnames(list_desktops(), open_, end).values(), key=attrgetter('hostname'), )
from datetime import datetime from datetime import timedelta from ocflib.lab.stats import list_desktops from ocflib.lab.stats import UtilizationProfile @contextmanager def timeit(): start = time.time() yield print('Time taken: {}'.format(time.time() - start)) if __name__ == '__main__': start = datetime(2015, 11, 23) end = start + timedelta(days=1) print('Testing naive time to create profiles.') with timeit(): slow_profiles = { host + '.ocf.berkeley.edu': UtilizationProfile.from_hostname(host, start, end) for host in list_desktops() } print('Testing optimized time to create profiles.') with timeit(): fast_profiles = UtilizationProfile.from_hostnames( list_desktops(), start, end)
import time from contextlib import contextmanager from datetime import datetime from datetime import timedelta from ocflib.lab.stats import list_desktops from ocflib.lab.stats import UtilizationProfile @contextmanager def timeit(): start = time.time() yield print('Time taken: {}'.format(time.time() - start)) if __name__ == '__main__': start = datetime(2015, 11, 23) end = start + timedelta(days=1) print('Testing naive time to create profiles.') with timeit(): slow_profiles = { host + '.ocf.berkeley.edu': UtilizationProfile.from_hostname(host, start, end) for host in list_desktops() } print('Testing optimized time to create profiles.') with timeit(): fast_profiles = UtilizationProfile.from_hostnames(list_desktops(), start, end)