Usare Copilot nei notebook di Microsoft Fabric
Copilot per l'ingegneria dei dati di Fabric assiste nella scrittura di codice nei notebook. Funziona con tabelle e file Lakehouse e può fare riferimento ai dataframe usati.
Esistono diversi modi per interagire con Copilot for Fabric Data Engineering, tra cui:
-
I comandi Magic sono comandi speciali che è possibile usare nelle celle del notebook per eseguire attività specifiche. Iniziano con un segno di doppio percentuale (
%%) o un singolo segno di percentuale (%). - Riquadro di chat di Copilot: è possibile chiedere aiuto a Copilot in inglese normale e genera il codice in base alla richiesta. Questo è il modo migliore per i flussi di lavoro in più passaggi, la creazione di logica tra le celle e la revisione del codice generato con visualizzazione diff.
- Copilot in-cell: è possibile interagire con Copilot direttamente sopra qualsiasi singola cella di codice usando una casella di testo e comandi barra. Questo è ideale per azioni incentrate su una singola cella, ad esempio la correzione degli errori o la spiegazione della logica.
Comandi Magici
I comandi di chat sono comandi speciali che è possibile usare nei notebook di Microsoft Fabric per interagire con Copilot. Ecco un elenco dei comandi usati più di frequente:
| Command | Description |
|---|---|
%%chat |
Fai domande sullo stato del notebook. |
%%code |
Generazione di codice per la manipolazione o la visualizzazione dei dati. |
%show_chat_history |
Mostra la cronologia delle chat. |
%clear_chat_history |
Cancellare la cronologia delle chat. |
%set_output |
Modificare il valore predefinito per il modo in cui i comandi magic forniscono l'output. Scegliere dove inserire il codice generato, da opzioni come - cella corrente - nuova cella - uscita della cella - in una variabile |
%describe |
Fornisce riepiloghi e descrizioni dei dataframe caricati. |
%%add_comments |
Aggiungere commenti al codice. |
Sono inoltre disponibili diversi comandi che consentono di correggere gli errori, configurare le impostazioni di privacy e gestire i dataframe. Per altre informazioni, vedere Usare il riquadro chat di Copilot nei notebook di Microsoft Fabric .
Copilot in-cell
Copilot in-cell consente di interagire con Copilot direttamente sopra qualsiasi cella di codice, senza uscire dal contesto di modifica dell'editor. Selezionare il pulsante Copilot visualizzato sopra una cella di codice per aprire una casella di testo in cui è possibile digitare una richiesta o usare un comando barra.
I comandi barra disponibili sono:
| Command | Description |
|---|---|
/explain |
Fornisce una spiegazione in linguaggio normale della logica del codice della cella. |
/fix |
Identifica gli errori nella cella e suggerisce correzioni. |
/comments |
Aggiunge automaticamente commenti di codice alla logica del documento e alle modifiche ai dati. |
/optimize |
Suggerisce miglioramenti per le prestazioni e l'efficienza. |
Usare Copilot all'interno della cella quando si vuole perfezionare una cella specifica, ad esempio capire cosa fa una trasformazione, correggere un errore di sintassi o documentare il codice prima di condividere il notebook. Per i flussi di lavoro in più passaggi o le attività tra celle, passare invece al riquadro chat di Copilot.
Example
In questo esempio si usa Copilot for Fabric Data Engineering per caricare, trasformare e salvare i dati in un Lakehouse. Si supponga che Contoso Health, una rete ospedaliera multi-specializzata, voglia espandere i servizi nell'UE e voglia analizzare i dati della popolazione proiettati. In questo esempio viene usato il set di dati di proiezione della popolazione di Dataset (ufficio statistico dell'Unione europea).
Fonte: EUROPOP2023 Popolazione il 1° gennaio per età, sesso e tipo di proiezione [proj_23np], ultimo aggiornamento 28 giugno 2023.
Carica dati
Inizia in un nuovo notebook collegato al Lakehouse. In una nuova cella è possibile provare il prompt seguente. L'uso di prefissi %%code indica a Copilot che si desidera generare codice. Eseguirlo ogni volta che sei pronto a vedere cosa propone Copilot.
%%code
Download the following file from this URL:
https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/proj_23np$defaultview/?format=TSV
Then write the file to the default lakehouse into a temporary folder. Create the temporary folder if it doesn't exist yet.
Copilot genera codice, che potrebbe variare leggermente a seconda dell'ambiente e degli aggiornamenti più recenti di Copilot.
#### ATTENTION: AI-generated code can include errors or operations you didn't intend. Review the code in this cell carefully before running it.
import urllib.request
import os
# Step 1: Download the file
url = "https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/proj_23np$defaultview/?format=TSV"
file_path = "/tmp/proj_23np_defaultview.tsv"
urllib.request.urlretrieve(url, file_path)
# Step 2: Create a temporary folder in the default lakehouse
lakehouse_temp_folder = "/lakehouse/default/Files/temp"
os.makedirs(lakehouse_temp_folder, exist_ok=True)
# Step 3: Write the file to the lakehouse temporary folder
import shutil
shutil.move(file_path, os.path.join(lakehouse_temp_folder, "proj_23np.tsv"))
print(f"File successfully written to {os.path.join(lakehouse_temp_folder, 'proj_23np.tsv')}")
Dopo aver eseguito la cella, dovresti trovare il file scaricato e salvato in una cartella temporanea del tuo Lakehouse.
In un'altra nuova cella è possibile chiedere a Copilot di caricare i dati come segue:
%%code
Load the file 'Files/temp/proj_23np.tsv' into a spark dataframe.
The fields are separated with a tab.
Show the contents of the DataFrame using display method.
Il dataframe risultante conterrà il contenuto del file TSV. Uno script generato può essere simile al seguente:
#### ATTENTION: AI-generated code can include errors or operations you didn't intend. Review the code in this cell carefully before running it.
# Load the file 'Files/temp/proj_23np.tsv' into a spark dataframe.
# The fields have been separated with a tab.
file_path = "Files/temp/proj_23np.tsv"
spark_df = spark.read.format("csv").option("delimiter", "\t").option("header", "true").load(file_path)
# Show the contents of the DataFrame using display method
display(spark_df)
Di seguito è riportato un esempio dell'aspetto dell'output:
| freq,proiezione,sesso,età,unità,geo\TIME_PERIOD | 2022 | 2023 | ... | 2100 |
|---|---|---|---|---|
| A,BSL,F,TOTAL,PER,AT | 4553444 | 4619179 | ... | 4807661 |
| A,BSL,F,TOTAL,PER,BE | 5883978 | 5947528 | ... | 6331785 |
| A,BSL,F,TOTAL,PER,BG | 3527626 | 3605059 | ... | 2543673 |
| ... | ... | ... | ... | 5081250 |
| A,BSL,F,TOTAL,PER,CY | 463622 | 476907 | ... | 504781 |
Trasformare i dati
Prendere quindi in considerazione la trasformazione dei dati: suddividere il primo campo combinato in colonne separate, pulire i campi inutilizzati, standardizzare i tipi di dati e applicare un po' di filtro. Un prompt simile al seguente in una nuova cella può guidare Copilot:
%%code
Now transform this dataframe spark_df and split the first field 'freq,projection,sex,age,unit,geo\TIME_PERIOD' using a comma into 6 separate fields.
Then, remove the fields 'freq', 'age', 'unit'.
The fields 'projection', 'sex', 'geo' should be positioned first.
The 'projection' field contains codes that should be replaced with the following values:
_'BSL' -> 'Baseline projections'.
_'LFRT' -> 'Sensitivity test: lower fertility'.
_'LMRT' -> 'Sensitivity test: lower mortality'.
_'HMIGR' -> 'Sensitivity test: higher migration'.
_'LMIGR' -> 'Sensitivity test: lower migration'.
_'NMIGR' -> 'Sensitivity test: no migration'.
Filter the 'geo' field and remove values 'EA20' and 'EU27_2020' (these are not countries).
Filter the 'sex' field and remove 'T' (these are totals).
Strip spaces from all field names in the dataframe.
Convert the data type of all the year fields to integer.
Display (Render) the DataFrame.
Copilot genera codice, che potrebbe variare leggermente a seconda dell'ambiente e degli aggiornamenti più recenti di Copilot.
from pyspark.sql.functions import split, col
# Load the file 'Files/temp/proj_23np.tsv' into a spark dataframe.
file_path = "Files/temp/proj_23np.tsv"
spark_df = spark.read.format("csv").option("delimiter", "\t").option("header", "true").load(file_path)
# Split the first field 'freq,projection,sex,age,unit,geo\TIME_PERIOD' into 6 separate fields.
split_col = split(spark_df['freq,projection,sex,age,unit,geo\TIME_PERIOD'], ',')
spark_df = spark_df.withColumn('freq', split_col.getItem(0)) \
.withColumn('projection', split_col.getItem(1)) \
.withColumn('sex', split_col.getItem(2)) \
.withColumn('age', split_col.getItem(3)) \
.withColumn('unit', split_col.getItem(4)) \
.withColumn('geo', split_col.getItem(5))
# Remove the fields 'freq', 'age', 'unit'
columns_to_drop = ['freq', 'age', 'unit', 'freq,projection,sex,age,unit,geo\TIME_PERIOD']
spark_df = spark_df.drop(*columns_to_drop)
# Reorder the columns, placing 'projection', 'sex', 'geo' first
columns_order = ['projection', 'sex', 'geo'] | [col for col in spark_df.columns if col not in ['projection', 'sex', 'geo']]
spark_df = spark_df.select(*columns_order)
# Replace projection field codes with values
replace_map = {
'BSL': 'Baseline projections',
'LFRT': 'Sensitivity test: lower fertility',
'LMRT': 'Sensitivity test: lower mortality',
'HMIGR': 'Sensitivity test: higher migration',
'LMIGR': 'Sensitivity test: lower migration',
'NMIGR': 'Sensitivity test: no migration'
}
spark_df = spark_df.replace(replace_map, subset=['projection'])
# Filter the 'geo' field to remove values 'EA20' and 'EU27_2020'
spark_df = spark_df.filter(~spark_df['geo'].isin(['EA20', 'EU27_2020']))
# Filter the 'sex' field to remove 'T'
spark_df = spark_df.filter(spark_df['sex'] != 'T')
# Strip spaces from all field names
spark_df = spark_df.toDF(*(c.replace(' ', '') for c in spark_df.columns))
# Convert the data type of all the year fields to integer
for column in spark_df.columns:
if column.isnumeric():
spark_df = spark_df.withColumn(column, col(column).cast('int'))
# Display the DataFrame
display(spark_df)
Di seguito è riportato un esempio dell'aspetto dell'output:
| projection | sesso | geo | 2022 | 2023 | ... | 2100 |
|---|---|---|---|---|---|---|
| Proiezioni di base | F | AT | 4553444 | 4619179 | ... | 4807661 |
| Proiezioni di base | F | BE | 5883978 | 5947528 | ... | 6331785 |
| Proiezioni di base | F | BG | 3527626 | 3605059 | ... | 2543673 |
| ... | ... | ... | ... | ... | ... | ... |
| Proiezioni di base | F | Lussemburgo | 320333 | 329401 | ... | 498954 |
Salvare i dati
Con le trasformazioni in atto, è possibile rendere persistente il risultato nel Lakehouse. Ad esempio, un prompt di cella come questo farà si che Copilot generi logica di salvataggio:
%%code
Save the dataframe as a new table named 'Population' in the default lakehouse.
Copilot genera codice, che potrebbe variare leggermente a seconda dell'ambiente e degli aggiornamenti più recenti di Copilot.
#### ATTENTION: AI-generated code can include errors or operations you didn't intend. Review the code in this cell carefully before running it.
spark_df.write.format("delta").saveAsTable("Population")
Validation
Per verificare che la tabella sia stata salvata correttamente, espandere l'elenco Tabelle nella vostra Lakehouse ed esaminarne il contenuto. È anche possibile passare al pannello di chat di Copilot per domande esplorative rapide; Copilot risponderà con spiegazioni o codice eseguibile. Per esempio:
What is the projected population for geo BE in 2050?
Copilot genera codice per filtrare i dati per l'area geografica e l'anno specificati e visualizzare il risultato.
# ATTENTION: AI-generated code can include errors or operations you didn't intend. Review the code in this cell carefully before running it.
from pyspark.sql import SparkSession
# Initialize Spark session
spark = SparkSession.builder.getOrCreate()
# Load the Population table into a Spark DataFrame
spark_df = spark.read.table("population")
# Filter for the projected population for geo BE in 2050
result_df = spark_df.filter((spark_df['geo'] == 'BE') & (spark_df['projection'] == 'Baseline projections')).select('2050')
# Show the result
result_df.show()
Procedure consigliate
- Copilot è attualmente più forte con scenari di ingegneria dei dati e data science, quindi la definizione di domande in tali domini tende a produrre risultati più chiari.
- Fornire riferimenti concreti di Copilot agli asset di dati (percorsi di file, nomi di tabella, nomi di colonna) in genere migliora la specificità e l'utilità delle risposte generate.
- Il caricamento dei dati come dataframe o l'aggiunta di set di dati in Lakehouse offre un contesto più completo, consentendo analisi e trasformazioni più accurate.