Question

I ai un ensemble de données qui contient des données de séries chronologiques du débit d'eau au fil du temps. J'ai un débitmètre relié à un robinet de cuisine, et je suis en train de cluster ou classer les événements d'utilisation de l'eau spécifiques.

Les données sont recueillies à chaque seconde, et dans chaque rangée je donne une valeur pour la quantité de gallons qui coule à travers mon débitmètre.

Par exemple, je suis en train de classer quelqu'un se laver les mains, remplir une théière, la vaisselle, etc ...

Est-ce quelque chose que je peux utiliser un k-NN Classification Approche de regrouper ces événements? Si une approche basée sur le regroupement n'est pas bon, quelle autre méthode de classification serait bon pour ce type de données?

Si je lance quelques expériences, je peux classer chaque événement et la transformer en un problème d'apprentissage supervisé. Mais à l'heure actuelle, aucun des événements d'eau sont classés.

Une version très abrégée de mon apparence ensemble de données comme suit:

EDIT

water = pd.DataFrame(shower1)
rng = pd.date_range('2016-09-01 00:00:00', '2016-09-30 23:59:58', freq='S')
water = water.reindex(rng,fill_value=0.0)
water = water['shower1']
df = pd.DataFrame({'time_stamp':rng,'water_amount':water})

starts = (df['water_amount']>0)&(df['water_amount'].shift(1)==0) #find all starts of events
n_events = sum(starts) #total number of events
df.loc[starts,'event_number'] = range(1,n_events+1) #numerate starts from 1 to n
df['event_number'] = df['event_number'].fillna(method='pad').fillna(-1) #forward fill all the values
df.loc[df['water_amount']==0,'event_number']=-1 #set all event numbers to -1 where the water amount is 0

df.groupby('event_number').agg({'time_stamp':'first',
                                    'water_amount':'sum'}) #feature matrix

Était-ce utile?

La solution

Il semble assez clair de regarder les données lorsque un événement commence et se termine (essentiellement chaque fois qu'il ya une séquence de valeurs positives). Ainsi, au lieu de commencer par quelques modèles compliqués, je vous suggère de calculer quelques caractéristiques simples (comme la longueur de l'événement, la quantité totale d'eau, quantité / secondes, le temps de l'événement précédent, le temps de la journée en quelques secondes du début de l'enregistrement) pour chaque événement, puis essayer un algorithme de regroupement sur de nouvelles données. k-NN pourrait même produire quelque chose de significatif. Mais un résumé statistique des caractéristiques peut vous donner probablement déjà une meilleure idée de la façon d'aborder plus cela.

EDIT1

import pandas as pd
import numpy as np

rng = pd.date_range('2017-01-01 14:00:00', '2017-01-01 14:01:00', freq='S')
water = [0,0,0.2,0.3,0.4,0,0,0.3,0.2,0.5]*6+[0]
df = pd.DataFrame({'time_stamp':rng,'water_amount':water,'event_number':np.zeros(len(water))})

j = 1
for k in range(len(df)):
    if df.ix[k,'water_amount']== 0:
        df.ix[k,'event_number'] = -1
    else:
        if df.ix[k-1,'water_amount'] > 0:
            df.ix[k,'event_number'] = df.loc[k-1,'event_number']
        else:
            df.ix[k,'event_number'] = j
            j = j+1


df.groupby('event_number').agg({'time_stamp':'first',
                                'water_amount':'sum'}) #feature matrix

EDIT2

rng = pd.date_range('2017-01-01 14:00:00', '2017-01-01 14:01:00', freq='S')
water = [0,0,0.2,0.3,0.4,0,0,0.3,0.2,0.5]*6+[0]
df = pd.DataFrame({'time_stamp':rng,'water_amount':water})

starts = (df['water_amount']>0)&(df['water_amount'].shift(1)==0) #find all starts of events
n_events = sum(starts) #total number of events
df.loc[starts,'event_number'] = range(1,n_events+1) #numerate starts from 1 to n
df['event_number'] = df['event_number'].fillna(method='pad').fillna(-1) #forward fill all the values
df.loc[df['water_amount']==0,'event_number']=-1 #set all event numbers to -1 where the water amount is 0

df.groupby('event_number').agg({'time_stamp':'first',
                                    'water_amount':'sum'}) #feature matrix

Autres conseils

Ne pas oublier prétraiter vos données.

Par exemple, faire caractéristique extraction n

  • quantité totale d'eau
  • Durée
  • variance
Licencié sous: CC-BY-SA avec attribution
scroll top