Création de Jeu de Données

Créer de Nouveaux Jeux de Données

Créez des jeux de données à partir de fichiers CSV, de paquets ZIP ou de fichiers binaires. Chaque format nécessite des correspondances de colonnes spécifiques pour l'analyse de fouille de processus.

Test de Connectivité

Ping Non Autorisé

GET /api/{tenantId}/{projectId}/dataset/unauthorized-ping

Point de terminaison de test ne nécessitant pas d'authentification.

Réponse

Ping Successful

Ping Authentifié

GET /api/{tenantId}/{projectId}/dataset/ping

Point de terminaison de ping authentifié pour vérifier l'accès à l'API.

Réponse (200 OK)

Ping Successful (tenant id: {tenantId})

Lister Tous les Jeux de Données

GET /api/{tenantId}/{projectId}/dataset

Récupère tous les jeux de données dans le projet spécifié.

Réponse (200 OK)

{
  "datasets": [
    {
      "datasetId": "550e8400-e29b-41d4-a716-446655440000",
      "datasetName": "Purchase Order Process",
      "datasetDescription": "Event log from SAP",
      "projectId": "660e8400-e29b-41d4-a716-446655440000",
      "caseIdColumnName": "CaseID",
      "activityColumnName": "Activity",
      "timeColumnName": "Timestamp",
      "resourceColumnName": "Resource",
      "beginTimeColumnName": null,
      "expectedOrderColumnName": null,
      "useDateOnlySorting": false,
      "useOnlyEventColumns": false,
      "dateCreated": "2024-01-15T10:30:00Z",
      "dateModified": "2024-01-15T14:45:00Z",
      "createdBy": "user@example.com",
      "modifiedBy": "user@example.com"
    }
  ]
}

Créer un Jeu de Données à partir d’un CSV

POST /api/{tenantId}/{projectId}/dataset/csv

Crée un nouveau jeu de données à partir d’un fichier CSV téléchargé avec mappage des colonnes.

Requête (multipart/form-data)

Champ Type Obligatoire Description
file fichier Oui Fichier CSV à télécharger (max 1Go)
datasetName chaîne Oui Nom du nouveau jeu de données
caseIdColumn chaîne Oui Nom de la colonne contenant les IDs de cas
activityNameColumn chaîne Oui Nom de la colonne contenant les noms d’activité
activityTimeColumn chaîne Oui Nom de la colonne contenant les horodatages
resourceColumn chaîne Non Nom de la colonne contenant la ressource/acteur
startTimeColumn chaîne Non Nom de la colonne pour les heures de début d’activité
cultureInfo chaîne Non Culture pour le parsing (par défaut : "en-US")

Réponse (200 OK)

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

Réponse d’Erreur (422 Entité Non Traitée)

{
  "errors": ["Column 'CaseID' not found in CSV file"],
  "statusCode": 422
}

Créer un Jeu de Données à partir d’un Paquet ZIP

POST /api/{tenantId}/{projectId}/dataset/package

Crée un nouveau jeu de données à partir d’un paquet ZIP contenant des fichiers de données.

Requête (multipart/form-data)

Champ Type Obligatoire Description
file fichier Oui Fichier paquet ZIP (max 1Go)
datasetName chaîne Oui Nom du nouveau jeu de données
cultureInfo chaîne Non Culture pour le parsing (par défaut : "en-US")

Réponse (200 OK)

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

Créer un Jeu de Données à partir d’un Fichier Binaire

POST /api/{tenantId}/{projectId}/dataset/binary

Crée un nouveau jeu de données à partir d’un fichier au format binaire avec mappage de colonnes.

Requête (multipart/form-data)

Champ Type Obligatoire Description
file fichier Oui Fichier binaire à télécharger (max 1Go)
datasetName chaîne Oui Nom du nouveau jeu de données
caseIdColumn chaîne Oui Nom de la colonne contenant les IDs de cas
activityNameColumn chaîne Oui Nom de la colonne contenant les noms d’activité
activityTimeColumn chaîne Oui Nom de la colonne contenant les horodatages
resourceColumn chaîne Non Nom de la colonne contenant la ressource/acteur
startTimeColumn chaîne Non Nom de la colonne pour les heures de début d’activité

Réponse (200 OK)

Même structure que la réponse de création CSV.

Exemples d’Implémentation

cURL - Upload CSV

curl -X POST "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dataset/csv" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -F "file=@event_log.csv" \
  -F "datasetName=Purchase Orders" \
  -F "caseIdColumn=CaseID" \
  -F "activityNameColumn=Activity" \
  -F "activityTimeColumn=Timestamp" \
  -F "resourceColumn=User" \
  -F "cultureInfo=en-US"

cURL - Upload Paquet ZIP

curl -X POST "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dataset/package" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -F "file=@data_package.zip" \
  -F "datasetName=SAP Export" \
  -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 DatasetUploader:
    def __init__(self, token):
        self.headers = {'Authorization': f'Bearer {token}'}

    def create_from_csv(self, file_path, dataset_name, case_id_col, activity_col, time_col,
                        resource_col=None, start_time_col=None, culture='en-US'):
        """Créer un jeu de données à partir d'un fichier CSV."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/csv'

        with open(file_path, 'rb') as f:
            files = {'file': (file_path, f, 'text/csv')}
            data = {
                'datasetName': dataset_name,
                'caseIdColumn': case_id_col,
                'activityNameColumn': activity_col,
                'activityTimeColumn': time_col,
                'cultureInfo': culture
            }
            if resource_col:
                data['resourceColumn'] = resource_col
            if start_time_col:
                data['startTimeColumn'] = start_time_col

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

        if response.ok:
            return response.json()
        else:
            raise Exception(f'Échec du téléchargement : {response.text}')

    def create_from_package(self, file_path, dataset_name, culture='en-US'):
        """Créer un jeu de données à partir d'un paquet ZIP."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/package'

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

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

        if response.ok:
            return response.json()
        else:
            raise Exception(f'Échec du téléchargement : {response.text}')

    def list_datasets(self):
        """Lister tous les jeux de données dans le projet."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset'
        response = requests.get(url, headers=self.headers)
        return response.json()

# Utilisation
uploader = DatasetUploader('your-auth-token')

# Création à partir d'un CSV
result = uploader.create_from_csv(
    'event_log.csv',
    'Purchase Order Process',
    'CaseID',
    'Activity',
    'Timestamp',
    resource_col='User'
)
print(f"Jeu de données créé : {result['datasetId']}")
print(f"Cas : {result['caseCount']}, Événements : {result['eventCount']}")

# Lister tous les jeux de données
datasets = uploader.list_datasets()
for ds in datasets['datasets']:
    print(f"- {ds['datasetName']} ({ds['datasetId']})")

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 DatasetUploader {
  constructor(token) {
    this.token = token;
  }

  async createFromCsv(file, datasetName, caseIdCol, activityCol, timeCol, options = {}) {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dataset/csv`;

    const formData = new FormData();
    formData.append('file', file);
    formData.append('datasetName', datasetName);
    formData.append('caseIdColumn', caseIdCol);
    formData.append('activityNameColumn', activityCol);
    formData.append('activityTimeColumn', timeCol);
    formData.append('cultureInfo', options.culture || 'en-US');

    if (options.resourceColumn) {
      formData.append('resourceColumn', options.resourceColumn);
    }
    if (options.startTimeColumn) {
      formData.append('startTimeColumn', options.startTimeColumn);
    }

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

    if (response.ok) {
      return await response.json();
    } else {
      throw new Error(`Échec du téléchargement : ${await response.text()}`);
    }
  }

  async listDatasets() {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dataset`;
    const response = await fetch(url, {
      headers: { 'Authorization': `Bearer ${this.token}` }
    });
    return await response.json();
  }
}

// Utilisation (navigateur)
const uploader = new DatasetUploader('your-auth-token');
const fileInput = document.getElementById('csvFile');

fileInput.addEventListener('change', async (e) => {
  const file = e.target.files[0];

  const result = await uploader.createFromCsv(
    file,
    'Mon Jeu de Données',
    'CaseID',
    'Activity',
    'Timestamp',
    { resourceColumn: 'User' }
  );

  console.log(`Créé : ${result.datasetId}`);
  console.log(`Cas : ${result.caseCount}, Événements : ${result.eventCount}`);
});

Champs de la Réponse

Champ Type Description
datasetId GUID ID du jeu de données créé
caseCount entier Nombre de cas uniques importés
eventCount entier Nombre total d'événements importés
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 au niveau des lignes
statusCode entier Code d'état HTTP

Bonnes Pratiques

  • Valider les Noms de Colonnes : Assurez-vous que les noms de colonnes correspondent exactement (sensible à la casse)
  • Vérifier les Paramètres de Culture : Utilisez la culture appropriée pour les formats de date/nombre
  • Gérer les Fichiers Volumineux : Surveillez la progression de l’upload pour les fichiers proches de 1Go
  • Examiner les Problèmes de Lignes : Vérifiez le tableau rowIssues pour les problèmes de qualité de données
  • Noms Uniques de Jeux de Données : Les noms des jeux de données doivent être uniques au sein d’un projet