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
rowIssuesetskippedRowsCountaprè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.