7.4. AATC Sensors

  • Working with Excel (file, spreadsheet)

  • Selecting data

  • Binary classification

7.4.1. Todo

  1. zaczytać dane z Excel (plik, arkusz)

  2. Wybrać odpowiednie dane (Luminance dla 24 września)

  3. Wykres aktywności ludzi tego dnia

Zwróć uwagę, że niektóre urządzenia elektroniczne emitują światło (zegarki, monitory, sprzęt laboratoryjny) jednak nie jest oznaka tego, że zespół jest aktywny. Aktywność jest wtedy, gdy oświetlenie jest powyżej jakiegoś poziomu (threshold). Poziom ten musimy określić na podstawie obserwacji danych.

Ten poziom oświetlenia poniżej wartości progowej w inżynierii nazywany jest szumem tła (background noise), są to zakłócenia w danych. Dane najczęściej nazywamy sygnałem.

7.4.2. Code

import pandas as pd
from matplotlib import pyplot as plt


DATA = 'https://python.astrotech.io/_static/sensors-optima.xlsx'
LUX = 1

df = pd.read_excel(
    io=DATA,
    sheet_name='Luminance',
    header=1,
    parse_dates=['datetime', 'date', 'time'],
    index_col='datetime')

df['time'] = df['time'].dt.time

# Zobaczmy jak wyglądają dane
df.info(memory_usage='deep')

# Statystyki opisowe
df['value'].describe()

# Zobaczmy jak dane się rozkładają
df['value'].plot(kind='density')
plt.show()  # doctest: +SKIP

# Jakie wartości padają w naszych danych
df['value'].hist(bins=3)
plt.show()  # doctest: +SKIP

df['value'].hist(bins=10)
plt.show()  # doctest: +SKIP

df.loc['2019-09-24', 'value'].hist(bins=10)
plt.show()  # doctest: +SKIP

# próg szumu (poniżej to szum, powyżej sygnał)
THRESHOLD = 20*LUX

noise = df['value'] <= THRESHOLD
activity = ~noise
df['active'] = activity
df['active'].replace({
    True: 1,
    False: 0,
}, inplace=True)

# np.sign()
# - jeżeli jest mniejsza niż 0, to daje -1
# - jeżeli wartość jest 0 to daje 0
# - jeżeli wartość jest większa niż 0 to daje 1

ROOM = df['location'] == 'Kitchen Lab Table'


active = (
    df[ROOM]
    .loc['2019-09-24', 'active']
    .loc[:, ]
    .resample('H')
    .median()
    .interpolate()
    .map(np.sign)
)


plot = (active
     .plot(color='red', figsize=(10,10), yticks=[0,1])
     .set_yticklabels(['seep', 'awake'])
)

plt.show()  # doctest: +SKIP

# THRESHOLD = 20*LUX
# data = pd.cut(
#     x=df['value'],
#     bins=[0, THRESHOLD, np.inf],
#     labels=['active', 'sleep'])