Utiliser n'importe quelles données avec les bags Dask

Programmation parallèle avec Dask en Python

James Fulton

Climate Informatics Researcher

Formats mixtes complexes

Schéma d'un jeu de données incluant vidéo et audio.

Programmation parallèle avec Dask en Python

Créer un bag Dask

import glob

video_filenames = glob.glob("*.mp4")
print(video_filenames)
['me_at_the_zoo.mp4', 'life_goes_on.mp4', 'guitar.mp4', 'hurt.mp4', ...]
Programmation parallèle avec Dask en Python

Créer un bag Dask

import glob

video_filenames = glob.glob("*.mp4")
import dask.bag as db

filename_bag = db.from_sequence(video_filenames)
filename_bag.take(1)[0]
'me_at_the_zoo.mp4'
Programmation parallèle avec Dask en Python

Charger des données personnalisées

# Charge une seule vidéo
load_mp4("video.mp4")
{'video': array(
         [[[ 51,  57,  37, ..., 227, 238, 168],
         ...,
         [ 83, 125, 129, ..., 222, 148, 208]]]),
 'audio': array([   7. ,    9. ,    9.5, ..., -544.5, -551. , -558. ]),
 'filename': 'video.mp4'}
Programmation parallèle avec Dask en Python

Charger des données personnalisées

data_bag = filename_bag.map(load_mp4)
data_bag.take(1)[0]
{'video': array(
         [126, 162, 203, ...,  63,  58,   8],
         ...,
         [ 58, 222, 170, ..., 234,  63,  81]]]),
 'audio': array([-203.5, -209. , -207. , ..., -222.5, -233. , -248.5]),
 'filename': 'me_at_the_zoo.mp4'}
Programmation parallèle avec Dask en Python

Charger des données personnalisées

data_bag = filename_bag.map(load_mp4)
# Créer une liste vide
data_list = []

# Ajouter les chargements différés à la liste
for file in video_filenames:
    data_list.append(dask.delayed(load_mp4)(file))
Programmation parallèle avec Dask en Python

Liste d'objets différés vs bag Dask

# Convertir une liste d'objets différés en bag Dask
data_bag = db.from_delayed(data_list)
# Convertir un bag Dask en liste d'objets différés
data_list = data_bag.to_delayed()
Programmation parallèle avec Dask en Python

Analyses complémentaires

transcribed_bag = data_bag.map(transcribe_audio)
transcribed_bag.take(1)[0]
{'video': array(
         [126, 162, 203, ...,  63,  58,   8],
         ...,
         [ 58, 222, 170, ..., 234,  63,  81]]]),
 'audio': array([-203.5, -209. , -207. , ..., -222.5, -233. , -248.5]),
 'filename': 'me_at_the_zoo.mp4'
 'transcript': "Très bien, nous voici devant les, euh, éléphants ...",
}
Programmation parallèle avec Dask en Python

Analyses complémentaires

# Appliquer une fonction personnalisée pour retirer les vidéos sans paroles
clean_bag = transcribed_bag.filter(transcript_is_not_blank)

# Appliquer une analyse de sentiment aux transcriptions
sentiment_bag = clean_bag.map(analyze_transcript_sentiment)
# Retirer les éléments inutiles du bag
keys_to_drop = ['video', 'audio']
final_bag = sentiment_bag.map(filter_dictionary, keys_to_drop=keys_to_drop)

# Convertir en Dask DataFrame
df = final_bag.to_dataframe()
Programmation parallèle avec Dask en Python

Résultats

df.compute()
            filename              transcript        sentiment
0  me_at_the_zoo.mp4  Très bien, nous ...         positive
...              ...                     ...              ...
Programmation parallèle avec Dask en Python

Utiliser des fichiers .wav

# Importer le module scipy pour les fichiers .wav
from scipy.io import wavfile

# Charger la fréquence d'échantillonnage et le tableau audio
sample_freq, audio = wavfile.read(filename)
Programmation parallèle avec Dask en Python

Utiliser des fichiers .wav

# Échantillons par seconde
print(sample_freq)
44100
# Les données audio
print(audio)
array([ 148,  142,  150, ..., -542, -546, -559], dtype=int16)
Programmation parallèle avec Dask en Python

Passons à la pratique !

Programmation parallèle avec Dask en Python

Preparing Video For Download...