Le plus rare des livres à disparu ! Saison 1 - Episode 1
Tags: datascience, kusto, kql
Published: 2023-12-16 09:47:26




Dans la quiétude apparente de Digitown, une ombre planait sur la Bibliothèque Nationale, prête à dévoiler ses trésors culturels. La numérisation de 325 000 ouvrages rares était sur le point de rendre hommage aux explorateurs de cette cité paisible. Cependant, alors que l'excitation montait pour la réouverture de l'exposition, mais caprice du destin s'apprêtait à jeter une ombre sinistre sur les étagères prestigieuses de Digitown. Le live "De Revolutionibus Magnis Data" de Gustav Kustov, un des plus rare du monde, avait mystérieusement disparu.

Face à cette situation urgente, la mairesse, Mme Gaia Budskott, fit appel à l'agence de détectives Kusto, réputée pour résoudre les mystères les plus ardus. Un jeune détective, prêt à faire ses preuves, se voyait confier sa première mission : retrouver l’ouvrage disparu.

Les données numériques de la Bibliothèque Nationale de Digitown constituaient un labyrinthe complexe pour notre jeune détective. Alors que chaque livre était étiqueté d'un identifiant RFID unique, le livre de Kustov avait disparu en laissant derrière lui son identifiant sur le sol froid de la bibliothèque.

S'immergeant dans les méandres du système d'information, le détective commença son enquête. 

---

```KQL
.execute database script <|
// Create table for the books
.create-merge table Books(rf_id:string, book_title:string, publish_date:long, author:string, language:string, number_of_pages:long, weight_gram:long)
//clear any previously ingested data if such exists
.clear table Books data
// Import data for books
// (Used data is utilizing catalogue from https://github.com/internetarchive/openlibrary )
.ingest into table Books ('https://kustodetectiveagency.blob.core.windows.net/digitown-books/books.csv.gz') with (ignoreFirstRecord=true)
// Create table for the shelves
.create-merge table Shelves (shelf:long, rf_ids:dynamic, total_weight:long) 
.clear table Shelves data
// Import data for shelves
.ingest into table Shelves ('https://kustodetectiveagency.blob.core.windows.net/digitown-books/shelves.csv.gz') with (ignoreFirstRecord=true)
```

---

Les étagères numériques envoyaient des données constantes, sur les livres présents. Un défi monumental s'offrait à lui : retrouver une aiguille dans une bibliothèque de données numériques.

Il commenca une analyse minutieuse d’une seul et unique étagère.

---

```KQL
Shelves
| where shelf == "1395"
```


![Result of kusto data](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/le4r39k5mag12jb5ver5.png)


---

Mais brut, les données ne pouvaient pas être exploite, il ce mit d'abord a isoler chaque identifiant RFID 

---

```KQL
Shelves
| where shelf == "1395"
| mv-expand rf_ids to typeof(string)
```

![Result of kusto data](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/37abyfk31gb43rst5x4q.png)


---

Il etait maintenant possible de relier cela aux informations spécifiques de chaque livre. Le poids des livres, comparés aux poids enregistrés par les étagères, semblaient cohérents malgré de légères variations. Un détail minime dans l'équation, ou bien une pièce manquante au puzzle ?

---

```KQL
Shelves
| mv-expand rf_ids to typeof(string)
| join kind=inner (Books) on $left.rf_ids == $right.rf_id
| summarize TotalWeightBook = sum(weight_gram) by shelf
| join kind=inner (Shelves) on shelf
| project shelf, TotalWeightBook, total_weight
```


![Result of kusto data](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jp0gqj2mb84b8e1ymbyf.png)


---


L'idée jaillit soudainement dans l'esprit du jeune détective. Et si il calculait avec précision la différence en pourcentage entre le poids total des livres par étagère et le poids enregistré par l'étagère elle même. 

---

```KQL
Shelves
| mv-expand rf_ids to typeof(string)
| join kind=inner (Books) on $left.rf_ids == $right.rf_id
| summarize TotalWeightBook = sum(weight_gram) by shelf
| join kind=inner (Shelves) on shelf
| project shelf, TotalWeightBook, total_weight
| extend WeightVariation = round((todouble(total_weight) - TotalWeightBook) / TotalWeightBook * 100,3)
| top 10 by WeightVariation
```

![Result of kusto data](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u7oe1sy97hh2p576z477.png)

---


Une étagère se détacha nettement du lot : l'étagère numéro 4 242. Un frisson d'excitation illumina le visage du détective, laissant présager une découverte imminente, persuadé d'avoir déniché l'endroit où se cachait le précieux "De Revolutionibus Magnis Data".

La tension monta alors qu'il se dirigea vers l'étagère cible. Et là, entre des volumes ordinaires, reposait le livre tant recherché. Le mystère était résolu, le détective avait triomphé. 

La directrice de la bibliothèque exprima un soulagement sincère, remerciant le jeune détective pour son efficacité.

La ville de Digitown célébra cette journée mémorable, et le détective novice, qui avait commencé cette enquête avec une pointe d'appréhension, s'imposa comme un véritable détective, prouvant que persévérance, intelligence et analyse de données étaient les clés de la résolution des énigmes.

Ainsi se conclut notre histoire, révélant que même les mystères les plus insaisissables peuvent être résolus avec ténacité. L'avenir réserve-t-il d'autres défis à notre détective ? Seul le temps le nous le dira. 

---


![Reward to have solved the case](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/omenskfgcktikqp2ubkp.png)

---