Topic: Cosa utilizzare per una raccolta dati?  (Letto 849 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline magidel

  • python habilis
  • **
  • Post: 55
  • Punti reputazione: 0
    • Mostra profilo
Cosa utilizzare per una raccolta dati?
« il: Giugno 09, 2016, 15:06 »
Salve a tutti.
Eccomi di nuovo qui a chiedere i vostri importanti ed utili consigli!  :embarrassed:

Sto scrivendo in python uno script che raccolga dati da alcuni sensori nel laboratorio dove opero.
Per fortuna tutti questi sensori hanno delle loro librerie, così importandole, con il semplice comando "getSensor1", recupero il dato della grandezza fisica che in quel momento il sensore1 rileva.
Fin qui tutto bene.

Il dubbio mi è venuto per la raccolta dati di questi sensori.
Dato che per una raccolta dati è importante la media dei valori presi in un certo intervallo (5 minuti), la deviazione standard e la varianza, pensavo di procedere in questo modo per ogni sensore:
- ogni secondo raccolgo il valore istantaneo del sonsore x (getSensorX)
- una volta raccolti 10 campioni faccio la media aritmetica, la deviazione standard e la varianza (mettendo da parte questi risultati)
- una volta arrivatti a 30 medie, deviazioni standard e varianze (5 minuti = 300 secondi) faccio la media di questi 30 valori, deviazioni standard e varianza, per avere una buona misura di quel sensore nel periodo di 5 minuti.

Il dubbio e quindi il consiglio che vi chiedo è il seguente.
Cosa utilizzo?

Una lista per ogni sensore? per poi calcolarmi la media, la deviazione e la varianza (con tanto di "formula", per esempio "mean=(value1+value2+value3..)/N" ?
Un dizionario? per esempio "{'sensore1': value1, 'sensore2': value2}" per poi trasformare questo sensore in un np.array per utilizzare np.array.mean, np.array.std, np.array.var (quindi senza utilizzare le "formule", ma la funziona che mi fornisce numpy)?
Un np.array direttamente senza passare per il dizionario?
Un dataframe con in colonna i valori dei sensori? così da utilizzare le funzione pd.dataframe.mean, .std, .var (come per np.array)?

Forse il dubbio è banale, ma vorrei un vostro consiglio per capire quale sia la strada migliore e più semplice.

La mia scelta (da semplice utilizzatore di python) è ricaduta su np.array attraverso una lista, per sfruttare mean, std e var:
Citazione
list = [getSensor1(), getSensor2, getSensor3, ... getSensorN]
Sensor1 = Sensor2 = Sensor3 = ... = SensorN = np.array([])

Sensor1 = np.append(Senosr1, list[0])
Sensor2 = np.append(Senosr2, list[1])
Sensor2 = np.append(Senosr2, list[2])
...
SensorN = np.append(SenosrN, list[N-1])

e quindi ogni 10 secondi faccio la media, std, var:
Citazione
meanSensor1 = Sensor1.mean()
stdSensor1 = Senosr1.std()
varSensor1 = Sensor.var()
e così via...

Che ne pensate?
C'è un modo "migliore"?

Attendo i vostri preziosi consigli  ;)

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.862
  • Punti reputazione: 9
    • Mostra profilo
Re: Cosa utilizzare per una raccolta dati?
« Risposta #1 il: Giugno 10, 2016, 09:20 »
La verità è che stai confondendo due problemi che invece dovresti tenere assolutamente separati.
Primo problema, dove conservo i dati. In un database? In un csv? In un json? Ci sono modelli di storage più adatti per certi tipi di dati, altri per altri. Chiaramente nel tuo caso è probabile che ti orienterai su un csv, o un database. Ci sono vantaggi e svantaggi. Devi decidere con cura quali attributi di ciascuna rilevazione vuoi conservare (data e ora? nome del sensore? altro?) e cosa fare di eventuali anomalie (un sensore che non risponde occasionalmente? un nouvo sensore che si aggiunge?). Dovresti affrontare il problema in modo "neutrale", senza chiederti quali calcoli vorrai fare dopo su questi dati. Semplicemente, registri ciò che accade, punto.
Una volta capito in teoria che cosa vuoi fare, devi implementarlo in pratica. Studia bene che tipo di informazione ti restituiscono le librerie, scrivi le funzioni che ti servono per interrogare i sensori, formattare correttamente i dati per le tue esigenze, aggiungere eventuali integrazioni, e persistere i dati nello storage che hai scelto (per questo ci saranno altre librerie che vorrai studiare, etc.). Fai unit-test con precisione maniacale per tutto questo: è un sistema che andrà avanti in automatico magari per mesi, se si spacca qualcosa senza che tu lo sappia, ti rovini mesi di lavoro.

Secondo problema, i calcoli che vuoi fare su questi dati a posteriori. Vedi, adesso tu immagini di dover fare la media etc. Magari però tra sei mesi ti viene in mente che vuoi fare anche altre cose. Se hai conservato i dati in modo corretto, puoi farci quello che vuoi, dopo. Devi chiederti come si fa a interrogare lo storage che hai scelto, se è una cosa pratica, quali librerie ci sono. Per esempio, se hai scelto un database non sarà difficile fare delle query sql per selezionare, per dire, le rilevazioni da ora a ora, e poi calcolare medie e tutto il resto. Anche in questo caso, ti scriverai delle routine (e gli unit-test!) che fanno certe operazioni sui dati (che so, li estraggono a gruppi di dieci e calcolano la media, boh), e presentano i risultati... anche qui, "presentare i risultati" è un problema separato: potresti scrivere delle nuove funzioni che prendono questi calcoli e li mettono in un grafico... o potresti aver voglia di crearti un nuovo storage con i dati calcolati (una raccolta delle medie, per dire) se è più pratico per te... l'importante è che sia uno storage separato (un'altra tabella del db, un altro file csv) e che tu non butti via i dati originali, naturalmente.

Offline magidel

  • python habilis
  • **
  • Post: 55
  • Punti reputazione: 0
    • Mostra profilo
Re: Cosa utilizzare per una raccolta dati?
« Risposta #2 il: Giugno 10, 2016, 09:54 »
Grazie RicPol per la tua risposta completa.  :)

L'esempio che ho portato per spiegare il mio dubbio è volutamente limitato.
E' vero, c'è un discorso di storage dei dati (e avevo scelto sql lite), un discorso di rilevazione di data e ora delle letture, ma pensavo erano informazioni che andavano oltre l'esempio, o meglio andavano oltre la richiesta di consiglio.

Il mio dubbio è incentrato su che tipo di variabile utilizzare per immagazzinare i dati appena letti dai sensori, tra cui anche data e ora, ovviamente!  ;)
Il tipo di variabile più semplice per immagazzinare i dati, elaborarli (leggi media, std, var) e poi farci quel che voglio (leggi scriverli su DB, per esempio)
Per futuri calcoli ed elaborazioni utilizzerò i dati salvati sul DB.
Ma il mio dubbio cronologicamente era fermo sulla prima parte, la raccolta dati.

Io conosco l'array e le sue funzioni per elaborare i dati appena presi.
Ma il dubbio mi è venuto poichè forse esistono altri tipi di variabili molto più semplici (per esempio un dizionario), che però oltre a permettermi di contenere in memoria i dati appena letti, mi deve consentire di elaborarli nel modo in cui mi serve (mean, std, var).

Era semplicemente una richiesta di consiglio di "conoscenza", se mi permettete il termine.   :D
Grazie cmq RicPol per il tuo prezioso contributo!  :)

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.862
  • Punti reputazione: 9
    • Mostra profilo
Re: Cosa utilizzare per una raccolta dati?
« Risposta #3 il: Giugno 10, 2016, 10:37 »
Ok, non posso riscrivere tutta la mia risposta daccapo, però ripeto: devi tener separati i due problemi.

> Il mio dubbio è incentrato su che tipo di variabile utilizzare per immagazzinare i dati

molto bene

> Ma il mio dubbio cronologicamente era fermo sulla prima parte, la raccolta dati.

Perfetto.

> Io conosco l'array (...)  forse esistono altri tipi di variabili molto più semplici (per esempio un dizionario)

Ops! Questo però riguarda la fase successiva, no? e quindi, di nuovo: tieni separati i due problemi. Tieni separati i due problemi. Separati.


Se (per esempio) per il primo problema (storage) scegli un DB, allora per il secondo problema (estrazione e calcoli vari) comincerai facendo una query sul db, ovviamente. E allora saprai già che la DB-api in python prevede che il risultato della query ti venga restituito sotto forma di una lista di tuple. Dentro ogni tupla, ciascun elemento avrà il tipo python corrispondente al tipo della colonna del DB (per esempio, se la colonna è VARCHAR, avrai indietro una stringa python) secondo una tabella di corrispondenza che dipende dal driver del database ma che in genere è molto ovvia.
Quindi quando fai una query sul DB ottieni una lista di tuple, punto. Che cosa poi tu fai con questa lista di tuple, dipende dalle successive elaborazioni che vuoi fare. Puoi trasformarla in un'altra struttura-dati, ovviamente. Ma dipende da quello che vuoi fare. Cioè, se tutto quello che devi fare è la media di dieci valori alla volta, non starei troppo a pensarci. Qualsiasi cosa va bene.