Veri Seti Güncellemeleri

Mevcut Veri Setlerini Güncelleme

Mevcut veri setleri CSV dosyalarından, ZIP paketlerinden veya ikili dosyalardan yeni verilerle güncellenir. Güncellemeler veri seti kimliğini ve ilişkili yapılandırmaları korur.

CSV'den Veri Setini Güncelleme

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

Var olan bir veri setindeki verileri, CSV dosyasından gelen yeni verilerle değiştirir. Sistem, sütun eşlemelerini veri seti yapılandırmasından otomatik olarak algılar.

Yol Parametreleri

Parametre Tür Gerekli Açıklama
tenantId GUID Evet Kiracı tanımlayıcısı
projectId GUID Evet Proje tanımlayıcısı
datasetId GUID Evet Güncellenecek veri seti tanımlayıcısı

İstek (multipart/form-data)

Alan Tür Gerekli Açıklama
file dosya Evet Yeni verileri içeren CSV dosyası (maksimum 1GB)
cultureInfo string Hayır Ayrıştırma için kültür (varsayılan: "en-US")

Yanıt (200 OK)

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

Hata Yanıtları

Bad Request (400):

id'si '{datasetId}' olan veri seti bulunamadı
'{datasetName}' güncellenemiyor çünkü orijinal veri seti değil

ZIP Paketinden Veri Setini Güncelleme

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

Var olan bir veri setindeki verileri ZIP paketinden gelen yeni verilerle değiştirir.

İstek (multipart/form-data)

Alan Tür Gerekli Açıklama
file dosya Evet Yeni verileri içeren ZIP paket dosyası (maksimum 1GB)
cultureInfo string Hayır Ayrıştırma için kültür (varsayılan: "en-US")

Yanıt (200 OK)

CSV güncelleme yanıtıyla aynı yapıya sahiptir.

Hata Yanıtı (422 Unprocessable Entity)

{
  "errors": ["Geçersiz paket yapısı"],
  "rowIssues": [
    {
      "rowIndex": 15,
      "columnName": "Timestamp",
      "errorType": "ParseError",
      "outcome": "Skipped",
      "message": "Tarih değeri çözümlenemedi"
    }
  ],
  "statusCode": 422
}

İkili Dosyadan Veri Setini Güncelleme

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

Var olan bir veri setindeki verileri ikili formatlı dosyadan gelen yeni verilerle değiştirir.

İstek (multipart/form-data)

Alan Tür Gerekli Açıklama
file dosya Evet Yeni verileri içeren ikili dosya (maksimum 1GB)

Yanıt (200 OK)

CSV güncelleme yanıtıyla aynı yapıya sahiptir.

Güncelleme Kısıtlamaları

  • Sadece Orijinal Veri Setleri: Yalnızca orijinal veri setleri güncellenebilir. Filtrelerden veya diğer dönüşümlerden türetilmiş veri setleri doğrudan güncellenemez.
  • Yapılandırmanın Korunması: Güncellemeler veri seti kimliğini ve tüm ilişkili yapılandırmaları (notebooklar, bloklar vb.) korur.
  • Sütun Tutarlılığı: Yeni veriler orijinal veri seti ile aynı sütun yapısına sahip olmalıdır.

Uygulama Örnekleri

cURL - CSV'den Güncelleme

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 - ZIP Paketinden Güncelleme

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'):
        """CSV dosyasından veri setini güncelle."""
        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'Güncelleme başarısız: {response.text}')

    def update_from_package(self, dataset_id, file_path, culture='en-US'):
        """ZIP paketinden veri setini güncelle."""
        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"Doğrulama hataları: {result['errors']}")
            for issue in result.get('rowIssues', []):
                print(f"  Satır {issue['rowIndex']}: {issue['message']}")
            raise Exception('Veri doğrulaması başarısız oldu')
        else:
            raise Exception(f'Güncelleme başarısız: {response.text}')

    def update_from_binary(self, dataset_id, file_path):
        """İkili dosyadan veri setini güncelle."""
        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'Güncelleme başarısız: {response.text}')

# Kullanım
updater = DatasetUpdater('your-auth-token')

# CSV'den güncelleme
result = updater.update_from_csv(
    '550e8400-e29b-41d4-a716-446655440000',
    'updated_event_log.csv'
)
print(f"Güncellenen veri seti: {result['datasetId']}")
print(f"Yeni vaka sayısı: {result['caseCount']}")
print(f"Yeni olay sayısı: {result['eventCount']}")

# Sorunları kontrol et
if result['skippedRowsCount'] > 0:
    print(f"Uyarı: {result['skippedRowsCount']} satır atlandı")
if result['invalidValueCount'] > 0:
    print(f"Uyarı: {result['invalidValueCount']} geçersiz değer bulundu")

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(`Doğrulama hatası: ${result.errors.join(', ')}`);
    } else {
      throw new Error(`Güncelleme başarısız: ${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(`Güncelleme başarısız: ${error.errors?.join(', ') || response.statusText}`);
    }
  }
}

// Kullanım (tarayıcı)
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(`Güncellendi: ${result.datasetId}`);
    console.log(`Yeni vakalar: ${result.caseCount}`);
    console.log(`Yeni olaylar: ${result.eventCount}`);

    if (result.skippedRowsCount > 0) {
      console.warn(`${result.skippedRowsCount} satır atlandı`);
    }
  } catch (error) {
    console.error('Güncelleme başarısız:', error.message);
  }
});

Yanıt Alanları

Alan Tür Açıklama
datasetId GUID Güncellenen veri setinin kimliği
caseCount integer Güncellenen verideki benzersiz vaka sayısı
eventCount integer Güncellenen verideki toplam olay sayısı
invalidValueCount integer Karşılaşılan geçersiz değer sayısı
skippedRowsCount integer Hatalar nedeniyle atlanan satır sayısı
errors dizi Hata mesajları listesi
rowIssues dizi Satır düzeyindeki sorunlara ait detaylı bilgiler
statusCode integer HTTP durum kodu

Satır Sorunu Yapısı

{
  "rowIndex": 15,
  "columnName": "Timestamp",
  "errorType": "ParseError",
  "outcome": "Skipped",
  "message": "2024-13-45 tarih değeri çözümlenemedi"
}
Alan Açıklama
rowIndex Sorunlu satır numarası
columnName Problemli değerin bulunduğu sütun
errorType Hata türü (ParseError, ValidationError, vb.)
outcome Durum (Atlandı, VarsayılanDeğer, vb.)
message İnsan tarafından okunabilir hata açıklaması

En İyi Uygulamalar

  • Önce Yedek Alın: Güncellemelerden önce mevcut verileri dışa aktarmayı düşünün
  • Yapıyı Doğrulayın: Yeni verilerin aynı sütun yapısına sahip olduğundan emin olun
  • Sonuçları Kontrol Edin: Güncellemelerden sonra rowIssues ve skippedRowsCount değerlerini gözden geçirin
  • İlk Olarak Test Edin: Güncellemeleri önce üretim dışı bir veri setinde test edin
  • Kültür Ayarları: Tarih ve sayı formatları için doğru kültürü kullanın