Mises à jour des jeux de données

Mettre à jour des jeux de données existants

Mettez à jour des jeux de données existants avec de nouvelles données provenant de fichiers CSV, de packages ZIP ou de fichiers binaires. Les mises à jour conservent l’ID du jeu de données et les configurations associées.

Mettre à jour un jeu de données depuis un fichier CSV

PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/csv

Remplace les données d’un jeu de données existant par de nouvelles données issues d’un fichier CSV. Le système détecte automatiquement les correspondances de colonnes à partir de la configuration du jeu de données.

Paramètres du chemin

Paramètre Type Obligatoire Description
tenantId GUID Oui Identifiant du locataire
projectId GUID Oui Identifiant du projet
datasetId GUID Oui Identifiant du jeu de données à mettre à jour

Requête (multipart/form-data)

Champ Type Obligatoire Description
file fichier Oui Fichier CSV contenant les nouvelles données (max 1GB)
cultureInfo string Non Culture pour l’analyse (par défaut : "en-US")

Réponse (200 OK)

{
  "datasetId": "550e8400-e29b-41d4-a716-446655440000",
  "caseCount": 5500,
  "eventCount": 165000,
  "invalidValueCount": 0,
  "skippedRowsCount": 0,
  "errors": [],
  "rowIssues": [],
  "statusCode": 200
}

Réponses d’erreur

Mauvaise requête (400) :

dataset with id '{datasetId}' not found
can't update '{datasetName}' because it's not an original dataset

Mettre à jour un jeu de données depuis un package ZIP

PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/package

Remplace les données d’un jeu de données existant par de nouvelles données issues d’un package ZIP.

Requête (multipart/form-data)

Champ Type Obligatoire Description
file fichier Oui Fichier package ZIP contenant les nouvelles données (max 1GB)
cultureInfo string Non Culture pour l’analyse (par défaut : "en-US")

Réponse (200 OK)

Même structure que la réponse de mise à jour CSV.

Réponse d’erreur (422 Entité non traitable)

{
  "errors": ["Invalid package structure"],
  "rowIssues": [
    {
      "rowIndex": 15,
      "columnName": "Timestamp",
      "errorType": "ParseError",
      "outcome": "Skipped",
      "message": "Unable to parse date value"
    }
  ],
  "statusCode": 422
}

Mettre à jour un jeu de données depuis un fichier binaire

PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/binary

Remplace les données d’un jeu de données existant par de nouvelles données au format binaire.

Requête (multipart/form-data)

Champ Type Obligatoire Description
file fichier Oui Fichier binaire contenant les nouvelles données (max 1GB)

Réponse (200 OK)

Même structure que la réponse de mise à jour CSV.

Restrictions de mise à jour

  • Jeux de données originaux uniquement : Seuls les jeux de données originaux peuvent être mis à jour. Les jeux de données dérivés à partir de filtres ou d’autres transformations ne peuvent pas être mis à jour directement.
  • Conservation de la configuration : Les mises à jour conservent l’ID du jeu de données ainsi que toutes les configurations associées (carnets de notes, blocs, etc.).
  • Cohérence des colonnes : Les nouvelles données doivent avoir la même structure de colonnes que le jeu de données original.

Exemples d’implémentation

cURL - Mise à jour depuis CSV

curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dataset/550e8400-e29b-41d4-a716-446655440000/csv" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -F "file=@updated_event_log.csv" \
  -F "cultureInfo=en-US"

cURL - Mise à jour depuis un package ZIP

curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dataset/550e8400-e29b-41d4-a716-446655440000/package" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -F "file=@updated_data_package.zip" \
  -F "cultureInfo=en-US"

Python

import requests

TENANT_ID = '12345678-1234-1234-1234-123456789012'
PROJECT_ID = '87654321-4321-4321-4321-210987654321'
BASE_URL = 'https://your-mindzie-instance.com'

class DatasetUpdater:
    def __init__(self, token):
        self.headers = {'Authorization': f'Bearer {token}'}

    def update_from_csv(self, dataset_id, file_path, culture='en-US'):
        """Met à jour le jeu de données depuis un fichier CSV."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/csv'

        with open(file_path, 'rb') as f:
            files = {'file': (file_path, f, 'text/csv')}
            data = {'cultureInfo': culture}

            response = requests.put(url, headers=self.headers, files=files, data=data)

        if response.ok:
            return response.json()
        else:
            raise Exception(f'Mise à jour échouée : {response.text}')

    def update_from_package(self, dataset_id, file_path, culture='en-US'):
        """Met à jour le jeu de données depuis un package ZIP."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/package'

        with open(file_path, 'rb') as f:
            files = {'file': (file_path, f, 'application/zip')}
            data = {'cultureInfo': culture}

            response = requests.put(url, headers=self.headers, files=files, data=data)

        if response.ok:
            return response.json()
        elif response.status_code == 422:
            result = response.json()
            print(f"Erreurs de validation : {result['errors']}")
            for issue in result.get('rowIssues', []):
                print(f"  Ligne {issue['rowIndex']}: {issue['message']}")
            raise Exception('Validation des données échouée')
        else:
            raise Exception(f'Mise à jour échouée : {response.text}')

    def update_from_binary(self, dataset_id, file_path):
        """Met à jour le jeu de données depuis un fichier binaire."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/binary'

        with open(file_path, 'rb') as f:
            files = {'file': (file_path, f, 'application/octet-stream')}

            response = requests.put(url, headers=self.headers, files=files)

        if response.ok:
            return response.json()
        else:
            raise Exception(f'Mise à jour échouée : {response.text}')

# Utilisation
updater = DatasetUpdater('your-auth-token')

# Mise à jour depuis CSV
result = updater.update_from_csv(
    '550e8400-e29b-41d4-a716-446655440000',
    'updated_event_log.csv'
)
print(f"Jeu de données mis à jour : {result['datasetId']}")
print(f"Nombre de cas : {result['caseCount']}")
print(f"Nombre d'événements : {result['eventCount']}")

# Vérification des problèmes
if result['skippedRowsCount'] > 0:
    print(f"Avertissement : {result['skippedRowsCount']} lignes ont été ignorées")
if result['invalidValueCount'] > 0:
    print(f"Avertissement : {result['invalidValueCount']} valeurs invalides détectées")

JavaScript/Node.js

const TENANT_ID = '12345678-1234-1234-1234-123456789012';
const PROJECT_ID = '87654321-4321-4321-4321-210987654321';
const BASE_URL = 'https://your-mindzie-instance.com';

class DatasetUpdater {
  constructor(token) {
    this.token = token;
  }

  async updateFromCsv(datasetId, file, culture = 'en-US') {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dataset/${datasetId}/csv`;

    const formData = new FormData();
    formData.append('file', file);
    formData.append('cultureInfo', culture);

    const response = await fetch(url, {
      method: 'PUT',
      headers: { 'Authorization': `Bearer ${this.token}` },
      body: formData
    });

    if (response.ok) {
      return await response.json();
    } else if (response.status === 422) {
      const result = await response.json();
      throw new Error(`Validation échouée : ${result.errors.join(', ')}`);
    } else {
      throw new Error(`Mise à jour échouée : ${await response.text()}`);
    }
  }

  async updateFromPackage(datasetId, file, culture = 'en-US') {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dataset/${datasetId}/package`;

    const formData = new FormData();
    formData.append('file', file);
    formData.append('cultureInfo', culture);

    const response = await fetch(url, {
      method: 'PUT',
      headers: { 'Authorization': `Bearer ${this.token}` },
      body: formData
    });

    if (response.ok) {
      return await response.json();
    } else {
      const error = await response.json();
      throw new Error(`Mise à jour échouée : ${error.errors?.join(', ') || response.statusText}`);
    }
  }
}

// Utilisation (navigateur)
const updater = new DatasetUpdater('your-auth-token');
const fileInput = document.getElementById('updateFile');

fileInput.addEventListener('change', async (e) => {
  const file = e.target.files[0];
  const datasetId = '550e8400-e29b-41d4-a716-446655440000';

  try {
    const result = await updater.updateFromCsv(datasetId, file);

    console.log(`Mis à jour : ${result.datasetId}`);
    console.log(`Nouveaux cas : ${result.caseCount}`);
    console.log(`Nouveaux événements : ${result.eventCount}`);

    if (result.skippedRowsCount > 0) {
      console.warn(`Ignoré ${result.skippedRowsCount} lignes`);
    }
  } catch (error) {
    console.error('Mise à jour échouée :', error.message);
  }
});

Champs de la réponse

Champ Type Description
datasetId GUID ID du jeu de données mis à jour
caseCount entier Nombre de cas uniques dans les données mises à jour
eventCount entier Nombre total d’événements dans les données mises à jour
invalidValueCount entier Nombre de valeurs invalides rencontrées
skippedRowsCount entier Nombre de lignes ignorées à cause d’erreurs
errors tableau Liste des messages d’erreur
rowIssues tableau Informations détaillées sur les problèmes par ligne
statusCode entier Code HTTP

Structure des problèmes dans les lignes

{
  "rowIndex": 15,
  "columnName": "Timestamp",
  "errorType": "ParseError",
  "outcome": "Skipped",
  "message": "Unable to parse date value '2024-13-45'"
}
Champ Description
rowIndex Numéro de la ligne posant problème
columnName Colonne contenant la valeur problématique
errorType Type d’erreur (ParseError, ValidationError, etc.)
outcome Conséquence (Skipped, DefaultValue, etc.)
message Description de l’erreur en langage clair

Bonnes pratiques

  • Sauvegarder avant tout : Pensez à exporter les données actuelles avant de faire une mise à jour.
  • Vérifier la structure : Assurez-vous que les nouvelles données ont la même structure de colonnes.
  • Contrôler les résultats : Examinez les rowIssues et skippedRowsCount après mise à jour.
  • Tester avant : Effectuez la mise à jour sur un jeu de données non productif en premier.
  • Paramètres culturels : Utilisez la culture correcte pour les formats de dates et de nombres.