Python-ervaring gebruiken in notebooks

Het Python-notebook is een nieuwe ervaring die bovenop notebooks in Fabric is gebouwd. Het is een veelzijdig en interactief hulpmiddel ontworpen voor data-analyse, visualisatie en machine learning. Het biedt een naadloze ontwikkelervaring voor het schrijven en uitvoeren van Python-code. Deze mogelijkheid maakt het een essentieel hulpprogramma voor gegevenswetenschappers, analisten en BI-ontwikkelaars, met name voor verkenningstaken waarvoor geen big data en gedistribueerde computing nodig zijn.

Door een Python-notebook te gebruiken, krijg je:

  • Meerdere ingebouwde Python-kernels: Python-notebooks bieden een pure Python-codeeromgeving zonder Spark, met drie ingebouwde Python-kernelversies: Python 3.10, Python 3.11 en Python 3.12. De omgeving ondersteunt native IPython-functies zoals iPyWidget en magic-commando's.

  • Rendabel: het nieuwe Python-notebook biedt kostenbesparende voordelen door standaard op één knooppuntcluster met 2vCores/16 GB geheugen uit te voeren. Deze installatie zorgt voor efficiënt resourcegebruik voor projecten voor gegevensverkenning met een kleinere gegevensgrootte.

  • Lakehouse en bronnen zijn native beschikbaar: The Fabric Lakehouse samen met de ingebouwde notebook-bronnen is volledig beschikbaar in Python notebook. Deze functie stelt gebruikers in staat om de data eenvoudig naar het Python Notebook te brengen, probeer gewoon drag and drop om het codefragment te krijgen.

  • Combineer programmeren met T-SQL: Python notebook biedt een gemakkelijke manier om te communiceren met Data Warehouse- en SQL-analyse-endpoints in Explorer. Door notebookutils data connector te gebruiken, kun je de T-SQL-scripts eenvoudig uitvoeren in de context van Python.

  • Ondersteuning voor populaire data-analytische bibliotheken: Python-notebooks worden geleverd met vooraf geïnstalleerde bibliotheken zoals DuckDB, Polars en Scikit-learn, wat een uitgebreide toolkit biedt voor datamanipulatie, analyse en machine learning.

  • Advanced IntelliSense: Python notebook neemt Pylance toe als IntelliSense-engine, samen met andere aangepaste Fabric-taaldiensten, met als doel geavanceerde codeerervaring te bieden aan notebookontwikkelaars.

  • NotebookUtils en Semantic Link: Krachtige API-toolkits stellen je in staat om eenvoudig Fabric- en Power BI-mogelijkheden te gebruiken met code-first ervaring.

  • Rijke visualisatiemogelijkheden: Behalve de populaire rich dataframe preview-functie 'Table' en 'Chart'-functie, ondersteunt het ook populaire visualisatiebibliotheken zoals Matplotlib, Seaborn en Plotly. De PowerBIClient ondersteunt deze bibliotheken ook om gebruikers te helpen beter inzicht te krijgen in gegevenspatronen en inzichten.

  • Veelvoorkomende mogelijkheden voor Fabric Notebook: Alle functies op Notebook-niveau zijn van nature toepasbaar voor Python notebooks, zoals bewerkingsfuncties, AutoSave, samenwerking, delen en permissiebeheer, Git-integratie, import/export en meer.

  • Full stack Data Science Capabilities: de geavanceerde low-code toolkit Data Wrangler, het machine learning-framework MLFlow en de krachtige Copilot zijn allemaal beschikbaar binnen Python-notebooks.

Hoe toegang te krijgen tot een Python-notebook

Nadat je een notebook in Fabric hebt geopend, kun je in het taalmenu op het Home-tabblad overschakelen naar Python en de hele notebook-setup omzetten naar Python.

Schermopname van het overschakelen naar Python vanuit het taalmenu van het notitieblok.

De meeste veelvoorkomende functies worden op notebookniveau ondersteund. Voor meer informatie, zie Hoe je Fabric-notebooks gebruikt en Fabric-notebooks ontwikkelt, uitvoert en beheert. Dit artikel vermeldt enkele belangrijke mogelijkheden die specifiek zijn voor Python-scenario's.

Python-notebooks starten

Python-notebooks ondersteunen meerdere taken uitvoeringsmethoden:

  • Interactieve uitvoering: U kunt een Python-notebook interactief uitvoeren als een systeemeigen Jupyter-notebook.
  • Schedule run: Je kunt de lightweight scheduler-ervaring op de notebookinstellingenpagina gebruiken om een Python-notebook als batchjob uit te voeren.
  • Pijplijnuitvoering: U kunt Python-notebooks organiseren als notebookactiviteiten in Pipeline. Het proces genereert een snapshot na de uitvoering van de taak.
  • Referentie-uitvoering: U kunt notebookutils.notebook.run() of notebookutils.notebook.runMultiple() gebruiken om Python-notebooks in een ander Python-notebook uit te voeren als batchjob. Het proces genereert een snapshot nadat de referentierun is voltooid.
  • %run: Je kunt %run andere notebooks binnen dezelfde uitvoeringscontext refereren en uitvoeren, zodat je direct functies kunt aanroepen en variabelen die in die notebooks zijn gedefinieerd kunt hergebruiken. Zie de documentatie over hoe je een notebook kunt refereren en uitvoeren voor meer informatie.
  • Openbare API-uitvoering: u kunt plannen dat uw Python-notebook wordt uitgevoerd met de notebook-run openbare API. De Job Scheduler-API ondersteunt geparameteriseerde uitvoeringen en retourneert afsluitwaarden van notebookuitvoeringen. Afsluitwaarden kunnen worden gebruikt voor voorwaardelijke orkestratie en het signaleren van uitkomsten bij de orkestratie van Python-notebooks in automatiserings- en CI/CD-scenario's. Zorg ervoor dat de taal- en kerneleigenschappen in notebookmetagegevens van de openbare API-nettolading correct zijn ingesteld. Parameterwaarden die via de openbare API worden doorgegeven, zijn tijdens runtime beschikbaar voor het Python-notebook met behulp van het standaardpatroon voor parametertoegang dat wordt gebruikt in Fabric-notebooks. Zie Notebooks beheren en uitvoeren in Fabric met API's voor meer informatie over de structuur van verzoeken voor parameters en het ophalen van uitvoerwaarden. U kunt de uitvoeringsstatus controleren en taakexemplaren annuleren via de Job Scheduler-API, wat een aanvulling vormt op de in-UI Weergave van alle uitvoeringen .

Note

Verificatie van de service-principal wordt ondersteund voor de REST API voor items (CRUD voor notebooks) en de Job Scheduler-API (uitvoering), waardoor beveiligde automatisering zonder toezicht en CI/CD voor Python-notebooks mogelijk wordt. Voeg de service principal toe aan de werkruimte met een passende rol om deze API's te gebruiken.

U kunt de details van de uitvoering van de Python-notebooktaak controleren op het linttabblad Uitvoeren ->Alle uitvoeringen weergeven.

Note

Momenteel ondersteunt het %run alleen het refereren naar notitieboekitems op Python notitieboeken, niet codemodules (zoals .py bestanden) vanuit de map notitieboekbronnen.

Gegevensinteractie

Je kunt interactie hebben met lakehouses, warehouses, SQL-analytics-endpoints en ingebouwde resources-mappen op Python-notebooks.

Note

De runtime van het Python-notebook wordt vooraf geleverd met delta-rs en duckdb-bibliotheken om zowel het lezen als schrijven van Delta Lake-data te ondersteunen. Sommige functies van Delta Lake zijn echter mogelijk niet volledig ondersteund. Voor meer details en de laatste updates, zie de delta-rs en de DuckDB-documentatie .

Lakehouse-interactie

Je kunt een lakehouse als standaard instellen, of je kunt ook meerdere lakehouses toevoegen om te verkennen en te gebruiken in notitieboeken.

Als je niet bekend bent met het lezen van dataobjecten zoals de Delta-tabel, probeer dan het bestand en de Delta-tabel naar het notitieboekdoek te slepen en neerzetten, of gebruik de optie Data laden in het dropdownmenu van het object. Het notebook voegt automatisch een codefragment in in een codecel en genereert code om het doelobject te lezen.

Note

Als je OOM tegenkomt bij het laden van een grote hoeveelheid data, probeer dan DuckDB, Polars of PyArrow dataframe te gebruiken in plaats van pandas.

Je kunt de write lakehouse-operatie vinden in Browse code snippet ->Write data to Delta table.

Schermopname van de Write Lakehouse-bewerking.

Interactie met magazijn en mixprogrammering met T-SQL

Je kunt warehouses of SQL-analytics-endpoints toevoegen vanuit de Warehouse Explorer van het notebook. Op dezelfde manier kunt u de tabellen naar het notitieblokcanvas slepen en neerzetten, of de sneltoetsbewerkingen gebruiken in het dropdownmenu van de tabel. Het notitieboek genereert automatisch een codefragment voor je. U kunt de notebookutils.data hulpprogramma's gebruiken om verbinding te maken met Warehouses en de gegevens op te vragen met behulp van T-SQL-instructies in de context van Python.

schermopname met snelkoppelingen naar magazijntabellen.

Note

SQL-analytics-eindpunten zijn alleen-leesbaar.

map met notebook-bronnen

De ingebouwde resource map Notebook resources is native beschikbaar op Python notebooks. Je kunt eenvoudig met de bestanden in de ingebouwde resources map interageren door Python-code te gebruiken alsof je met je lokale bestandssysteem werkt. Momenteel wordt de map Environment resource niet ondersteund.

Kernelbewerkingen

Python-notebooks ondersteunen drie ingebouwde kernels: Python 3.10, Python 3.11 en Python 3.12. De standaard geselecteerde kernel is Python 3.12. Je kunt er makkelijk tussen wisselen.

Je kunt de kernel onderbreken, herstarten of wisselen op het Home-tabblad van het lint. Het onderbreken van de kernel in Python-notebooks is hetzelfde als het annuleren van een cel in een Spark-notebook.

schermopname van kernelbewerkingen.

Een abnormale kernel-exit zorgt ervoor dat de code-uitvoering wordt onderbroken en variabelen verloren gaan, maar het stopt de notebook-sessie niet.

Sommige commando's kunnen ertoe leiden dat de kernel sterft. Bijvoorbeeld, quit() en exit().

Voor de ondersteuningslevenscyclus van elke Python-kernelversie, inclusief einddata en migratiestappen, zie Python notebook runtime en kernel lifecycle in Fabric.

Bibliotheekbeheer

Gebruik de %pip- en %conda-opdrachten voor inline-installaties. Deze commando's ondersteunen zowel openbare bibliotheken als aangepaste bibliotheken.

Voor aangepaste bibliotheken upload je de bibliotheekbestanden naar de map Built-in resources . Het platform ondersteunt meerdere soorten bibliotheken, waaronder formaten zoals Wheel (.whl), JAR (.jar), DLL (.dll) en Python (.py). Sleep het bestand gewoon en zet het neer, en het codefragment wordt automatisch gegenereerd.

Je moet misschien de kernel opnieuw starten om de bijgewerkte pakketten te gebruiken.

Om vergelijkbare commando's beter te begrijpen en te gebruiken, zie de volgende tabel.

Command/Syntax Hoofddoel Hoe het werkt in Jupyter Notebook Typisch gebruiksscenario Notes
%pip install package Python-pakketten installeren Voert pip uit in de Python kernel van het notebook Aanbevolen manier om pakketten te installeren In Python-notebooks wordt dezelfde als !pip; de kernel niet automatisch opnieuw opstart
!pip install package Python-pakketten installeren via shell Pip uitvoeren als een shell-opdracht Alternatieve manier om pakketten te installeren In Python-notebooks wordt dezelfde als %pip; de kernel niet automatisch opnieuw opstart
import sys; sys.exit(0) Start de notebook-kernel opnieuw op De kernel onmiddellijk opnieuw opstarten De kernel programmatisch opnieuw opstarten Wist alle variabelen en statussen; wordt niet aanbevolen om rechtstreeks te gebruiken
notebookutils.session.restartPython() Start de notebook-kernel opnieuw op Oproepen sys.exit(0) intern Aanbevolen manier om de kernel opnieuw op te starten Officiële API, veiliger en compatibeler dan rechtstreeks gebruiken sys.exit(0)

Note

  • In Python-notebooks vertonen !pipze hetzelfde gedrag: %pip beide installeren pakketten in de omgeving van de huidige kernel, en geen van beide start de kernel automatisch opnieuw op na de installatie.
  • Als je de kernel opnieuw moet opstarten (bijvoorbeeld na het installeren van bepaalde pakketten), gebruik notebookutils.session.restartPython() dan in plaats van import sys; sys.exit(0).
    • notebookutils.session.restartPython() is een officiële API die sys.exit(0) omhult, en die veiliger is en beter compatibel is in notebookomgevingen.
  • Gebruik sys.exit(0) niet direct, tenzij dat nodig is.

Bewaking van realtime resourcegebruik in Python-notebook

Belangrijk

Deze functie is beschikbaar als preview-versie.

Door gebruik te maken van het resource monitor-paneel kun je kritieke runtime-informatie zoals sessieduur, rekentype en realtime resource-metrics, inclusief CPU- en geheugenverbruik, direct binnen je notebook bijhouden. Deze functie biedt een direct overzicht van uw actieve sessie en de resources die worden gebruikt.

De resourcemonitor verbetert de zichtbaarheid van de wijze waarop Python-workloads systeemresources gebruiken. Het helpt u prestaties te optimaliseren, kosten te beheren en het risico op out-of-memory fouten (OOM) te verminderen. Door metrische gegevens in realtime te bewaken, kunt u resource-intensieve bewerkingen identificeren, gebruikspatronen analyseren en weloverwogen beslissingen nemen over het schalen of wijzigen van code.

Als u deze wilt gaan gebruiken, stelt u de notebooktaal in op Python en start u een sessie. U kunt de monitor vervolgens openen door te klikken op de rekenresources in de statusbalk van het notitieblok of door resourcegebruik weergeven te selecteren op de werkbalk. Het resource monitor-paneel verschijnt automatisch, wat een geïntegreerde monitoringservaring biedt voor Python-code in Fabric-notebooks.

Schermopname van bewaking van realtime resourcegebruik in Python-notebook.

Sessieconfiguratie magic-opdracht

Net als het personaliseren van een Spark-sessieconfiguratie in een notebook, kun je %%configure ook gebruiken in een Python notebook. Python-notebooks ondersteunen het aanpassen van de grootte van de rekenknoop, mountpunten en de standaard lakehouse van de notebooksessie. Je kunt deze instellingen gebruiken in zowel interactieve notitieboeken als pipeline-notitieboekactiviteiten. Gebruik het %%configure commando aan het begin van je notitieboek, anders moet je de notitieboeksessie opnieuw starten om de instellingen te laten werken.

Dit zijn de ondersteunde eigenschappen in Python Notebook %%configure:

%%configure -f
{
    "vCores": 4, // Recommended values: [4, 8, 16, 32, 64], Fabric will allocate matched memory according to the specified vCores.
    "defaultLakehouse": {  
        // Will overwrites the default lakehouse for current session
        "name": "<lakehouse-name>",
        "id": "<(optional) lakehouse-id>",
        "workspaceId": "<(optional) workspace-id-that-contains-the-lakehouse>" // Add workspace ID if it's from another workspace
    },
    "mountPoints": [
        {
            "mountPoint": "/myMountPoint",
            "source": "abfs[s]://<file_system>@<account_name>.dfs.core.windows.net/<path>"
        },
        {
            "mountPoint": "/myMountPoint1",
            "source": "abfs[s]://<file_system>@<account_name>.dfs.core.windows.net/<path1>"
        },
    ],
}

Je kunt de update van rekenbronnen bekijken op de statusbalk van het notebook en het CPU- en geheugengebruik van de rekenknoop in realtime monitoren.

Schermopname van het bijwerken van rekenresources.

Note

API-geactiveerde uitvoeringen honoreren de sessieconfiguratie, zoals compute vCores, en defaultLakehouse opgegeven via notebookmetagegevens of %%configure. De Job Scheduler API ondersteunt ook het selecteren van het doel-lakehouse en de omgeving tijdens runtime. Zie Notebooks beheren en uitvoeren in Fabric met API's voor meer informatie over de payloadvelden.

NotebookUtils

Notebook Utilities (NotebookUtils) is een ingebouwd pakket dat je helpt om eenvoudige taken in Fabric Notebook uit te voeren. Het is vooraf geïnstalleerd in de Python-runtime. Gebruik NotebookUtils om met bestandssystemen te werken, omgevingsvariabelen op te halen, notebooks aan elkaar te koppelen, externe opslag te benaderen en met secrets te werken.

Gebruik notebookutils.help() het om beschikbare API's te vermelden en hulp te krijgen met methoden. Voor meer informatie, zie de NotebookUtils-documentatie.

Hulpprogramma's voor gegevens

Note

Momenteel is de functie beschikbaar als preview-versie.

Gebruik de hulpprogramma's notebookutils.data om verbinding te maken met een databron. Vervolgens kun je data lezen en opvragen met een T-SQL-instructie.

Voer de volgende opdracht uit om een overzicht te krijgen van de beschikbare methoden:

notebookutils.data.help()

Output:

Help on module notebookutils.data in notebookutils:

NAME
    notebookutils.data - Utility for read/query data from connected data sources in Fabric

FUNCTIONS
    connect_to_artifact(artifact: str, workspace: str = '', artifact_type: str = '', **kwargs)
        Establishes and returns an ODBC connection to a specified artifact within a workspace 
        for subsequent data queries using T-SQL.
        
        :param artifact: The name or ID of the artifact to connect to.
        :param workspace:  Optional; The workspace in which the provided artifact is located, if not provided,
                             use the workspace where the current notebook is located.
        :param artifactType: Optional; The type of the artifact, Currently supported type are Lakehouse, Warehouse and MirroredDatabase. 
                                If not provided, the method will try to determine the type automatically.
        :param **kwargs Optional: Additional optional configuration. Supported keys include:
            - tds_endpoint : Allow user to specify a custom TDS endpoint to use for connection.
        :return: A connection object to the specified artifact.
        
        :raises UnsupportedArtifactException: If the specified artifact type is not supported to connect.
        :raises ArtifactNotFoundException: If the specified artifact is not found within the workspace.
        
        Examples:
            sql_query = "SELECT DB_NAME()"
            with notebookutils.data.connect_to_artifact("ARTIFACT_NAME_OR_ID", "WORKSPACE_ID", "ARTIFACT_TYPE") as conn:
                df = conn.query(sql_query)
                display(df)
    
    help(method_name: str = '') -> None
        Provides help for the notebookutils.data module or the specified method.
        
        Examples:
        notebookutils.data.help()
        notebookutils.data.help("connect_to_artifact")
        :param method_name: The name of the method to get help with.

DATA
    __all__ = ['help', 'connect_to_artifact']

FILE
    /home/trusted-service-user/jupyter-env/python3.10/lib/python3.10/site-packages/notebookutils/data.py

Query's uitvoeren op gegevens uit Lakehouse

conn = notebookutils.data.connect_to_artifact("lakehouse_name_or_id", "optional_workspace_id", "optional_lakehouse_type")
df = conn.query("SELECT * FROM sys.schemas;")

Query's uitvoeren op gegevens uit warehouse

conn = notebookutils.data.connect_to_artifact("warehouse_name_or_id", "optional_workspace_id", "optional_warehouse_type")
df = conn.query("SELECT * FROM sys.schemas;")

Query's uitvoeren op gegevens uit SQL-database

conn = notebookutils.data.connect_to_artifact("sqldb_name_or_id", "optional_workspace_id", "optional_sqldatabase_type") 
df = conn.query("SELECT * FROM sys.schemas;")

Note

De Data-hulpprogramma's in NotebookUtils zijn voorlopig alleen beschikbaar op Python-notebooks.

Codefragmenten bekijken

Je kunt nuttige Python-codefragmenten vinden op het tabblad Bewerken door te kiezen op Browse code snippet. Nieuwe Python-voorbeelden zijn nu beschikbaar. Begin met het verkennen van het notebook en leer aan de hand van de Python-codefragmenten.

Schermopname die laat zien waar u door python-codefragmenten kunt bladeren.

Semantische link is een functie die je kunt gebruiken om semantische modellen en Synapse Data Science te verbinden. Python-notebooks ondersteunen deze functie nativ. BI-ingenieurs en Power BI-ontwikkelaars kunnen semantische koppelingen gebruiken om semantische modellen eenvoudig te verbinden en beheren. Voor meer informatie, zie het openbare document.

Visualization

Naast het tekenen van grafieken met bibliotheken kunt u met de ingebouwde visualisatiefunctie DataFrames omzetten in gegevensvisualisaties met uitgebreide indeling. Gebruik de display() -functie op dataframes om de rijke dataframe-tabelweergave en grafiekweergave te genereren.

Screenshot die visualisatie-ervaring toont in Python-notebooks.

Note

Het Python-notebook bewaart de grafiekconfiguraties. Na het opnieuw uitvoeren van de codecel, als het doeldataframe-schema niet verandert, blijven de opgeslagen grafieken behouden.

Code IntelliSense

Python-notebooks gebruiken ook Pylance als taalserver. Voor meer informatie, zie Enhance Python development with Pylance.

Mogelijkheden voor gegevenswetenschap

Voor meer informatie over data science en AI-ervaringen in Fabric, zie Data Science-documentatie in Fabric. Dit artikel somt enkele belangrijke functies voor data science op die standaard worden ondersteund door Python-notebooks.

  • Data Wrangler: Data Wrangler is een op notitieboeken gebaseerde tool die een meeslepende interface biedt voor verkennende data-analyse. Deze functie combineert een rasterachtige gegevensweergave met dynamische samenvattingsstatistieken, ingebouwde visualisaties en een bibliotheek met algemene bewerkingen voor het opschonen van gegevens. Het biedt data-opschoning, datatransformatie en integratie, wat de datavoorbereiding versnelt door gebruik te maken van Data Wrangler.

  • MLflow: Een machine learning-experiment is de primaire eenheid van de organisatie en controle voor alle gerelateerde machine learning-uitvoeringen. Een uitvoering komt overeen met één uitvoering van modelcode.

  • Fabric Auto Logging: Synapse Data Science omvat autologging, wat de hoeveelheid code die nodig is om automatisch de parameters, metrics en items van een machine learning-model tijdens training automatisch te loggen, aanzienlijk vermindert.

    Autologging breidt de mogelijkheden voor MLflow-tracering uit. Autoregistratie kan verschillende metrieken vastleggen, waaronder nauwkeurigheid, verlies, F1-score en aangepaste metrieken die u definieert. Door autologging te gebruiken, kunnen ontwikkelaars en gegevenswetenschappers eenvoudig de prestaties van verschillende modellen en experimenten bijhouden en vergelijken zonder handmatig bij te houden.

  • Copilot: Copilot voor Data Engineering- en Data Science-notebooks is een AI-assistent waarmee u gegevens kunt analyseren en visualiseren. Copilot is onmiddellijk contextbewust zonder dat u een sessie hoeft te starten. Het begrijpt de werkruimte, gekoppelde Lakehouse-schema's, tabellen en bestanden, notebookstructuur en runtimestatus, en kan worden uitgevoerd in de hele notebookwerkstroom.

    Copilot ondersteunt notebook-wijde, meerstapsmogelijkheden: het kan code genereren, refactoren, samenvatten en valideren over meerdere cellen en stappen in Python-notebooks. U kunt het Copilot-chatvenster en de chatopdrachten, zoals /fix in het notitieblok, gebruiken.

    Wanneer een cel mislukt, wordt met Copilot een foutoverzicht, hoofdoorzaakanalyse en aanbevolen oplossingen weergegeven, met een optie voor het automatisch toepassen van codewijzigingen na het weergeven van een goedkeuringsverschil. U kunt de /fix opdracht in Copilot-chat ook gebruiken voor gerichte diagnostische gegevens op een specifieke cel of het hele notitieblok.

Bekende beperkingen

  • De live pool-ervaring is niet gegarandeerd voor elke Python-notebookuitvoering. De starttijd van de sessie kan oplopen tot drie minuten als de notebookuitvoering geen gebruikmaakt van de livepool. Naarmate het gebruik van Python-notebooks toeneemt, verhogen intelligente poolingmethoden geleidelijk de live pool-toewijzing om aan de vraag te voldoen.

  • Omgevingsintegratie is niet beschikbaar op Python-notebooks.

  • Time-out voor sessie instellen is niet beschikbaar.

  • Copilot heeft de contextbewustheid en hulp voor Python-notebooks verbeterd, maar het kan af en toe Spark-code voorstellen die niet rechtstreeks uitvoerbaar is in een Python-notebook. De Copilot-oplossing is van toepassing op mislukte Python-cellen; Diagnostiek van Spark-taken valt buiten de scope voor uitvoeringen van pure Python.

  • Momenteel wordt Copilot op Python-notebooks in verschillende regio's niet volledig ondersteund. Het uitrolproces is nog gaande. Blijf op de hoogte terwijl de steun in meer regio's wordt uitgerold.