Bonjour,
Je souhaite prévoir la production laitière du troupeau de mon oncle et je dispose pour cela de la table suivante :
1 2 3 4 5 6 7 8 9 10 | CREATE TABLE IF NOT EXISTS CrudeData( id INTEGER PRIMARY KEY AUTOINCREMENT, cow INTEGER NOT NULL, date DATE NOT NULL, prod REAL NOT NULL, -- L cons REAL NOT NULL, -- kg lact INTEGER NOT NULL, day INTEGER NOT NULL, UNIQUE (cow, date) ); |
Une lactation est un cycle de production (du vêlage au tarissement) et le champ day
contient le numéro du jour dans la lactation correspondante.
Il me faut alors effectuer (avec Python) certains calculs sur ces données : moyenne mobile, différenciation…
Comme j'ai besoin des résultats de ces calculs pour 1. les réutiliser dans d'autres calculs (différencier les données après passage d'une moyenne mobile par exemple) 2. générer des vues (ici, des PDF) 3. éviter de refaire les calculs plus tard (pas primordial, les calculs n'étant pas lourds), je stocke ça en base :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | CREATE TABLE IF NOT EXISTS SmoothedData( id INTEGER PRIMARY KEY AUTOINCREMENT, source INTEGER NOT NULL, -- The corresponding line in the CrudeData table prod REAL NOT NULL, step INTEGER, FOREIGN KEY(source) REFERENCES CrudeData(id), UNIQUE (source, step) ); CREATE TABLE IF NOT EXISTS DifferencedData( id INTEGER PRIMARY KEY AUTOINCREMENT, source INTEGER NOT NULL, -- The corresponding line in the CrudeData table prod REAL NOT NULL, degree INTEGER, -- How many times data have been differenced FOREIGN KEY(source) REFERENCES CrudeData(id), UNIQUE (source, degree) ); |
Seulement, il y a maintenant un problème. Je voudrais stocker la fonction d'autocorrélation (ACF), qui consiste, pour un ensemble de valeurs, en un tableau de flottants, de taille variant avec celle des données d'entrée. Du coup, j'ai fait cela :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | CREATE TABLE IF NOT EXISTS Tables( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR NOT NULL, UNIQUE (name) ); CREATE TABLE IF NOT EXISTS ACF( id INTEGER PRIMARY KEY AUTOINCREMENT, source INTEGER NOT NULL, cow INTEGER NOT NULL, acf BLOB, FOREIGN KEY(source) REFERENCES Tables(id), UNIQUE (cow, source) ); INSERT OR IGNORE INTO Tables (name) VALUES ('CrudeData'); INSERT OR IGNORE INTO Tables (name) VALUES ('SmoothedData'); INSERT OR IGNORE INTO Tables (name) VALUES ('DifferencedData'); INSERT OR IGNORE INTO Tables (name) VALUES ('ACF'); |
En effet, je me suis dit que je ne souhaiterais calculer l'ACF que pour un certain type de données (brutes, lissées, différenciées…) et pour des données d'entrée ne provenant que d'une seule table. C'était sans compter les paramètres du genre step
et degree
(en effet, une table contient plus types de données : par exemple, différenciées une fois, deux fois…).
Du coup, comment puis-je m'organiser pour pouvoir identifier facilement, par exemple, l'ACF des productions différenciées une fois, deux fois, lissées deux fois, trois fois… ? Sachant que je veux pouvoir ajouter d'autres opérations en plus du lissage et de la différenciation.
J'utilise actuellement une base SQL parce que les requêtes SQL me permettent de sélectionner mes données très facilement, mais ce n'est pas obligatoire. pandas (que je ne connais que de nom) pourrait-il m'être utile ?
Merci !