Utiliser le système de types de données BigQuery DataFrames
Le système de types de données BigQuery DataFrames est basé sur les types de données BigQuery. Cette conception assure une intégration parfaite et un alignement avec l' Google Cloud entrepôt de données, reflétant les types intégrés utilisés pour le stockage des données dans BigQuery.
Mappages des types
Le tableau suivant présente les équivalents des types de données dans BigQuery, BigQuery DataFrames et d'autres bibliothèques Python, ainsi que leurs niveaux de compatibilité :
| Type de données | BigQuery | BigQuery DataFrames | Python intégré | PyArrow |
|---|---|---|---|---|
| Booléen | BOOL |
pandas.BooleanDtype() |
bool |
bool_() |
| Integer | INT64 |
pandas.Int64Dtype() |
int |
int64() |
| Float | FLOAT64 |
pandas.Float64Dtype() |
float |
float64() |
| Chaîne | STRING |
pandas.StringDtype(storage="pyarrow") |
str |
string() |
| Octets | BYTES |
pandas.ArrowDtype(pyarrow.binary()) |
bytes |
binary() |
| Date | DATE |
pandas.ArrowDtype(pyarrow.date32()) |
datetime.date |
date32() |
| Heure | TIME |
pandas.ArrowDtype(pyarrow.time64("us")) |
datetime.time |
time64("us") |
| Date/Heure | DATETIME |
pandas.ArrowDtype(pyarrow.timestamp("us")) |
datetime.datetime |
timestamp("us") |
| Horodatage | TIMESTAMP |
pandas.ArrowDtype(pyarrow.timestamp("us", tz="UTC")) |
Datetime.datetime avec fuseau horaire |
timestamp("us", tz="UTC") |
| Numérique | NUMERIC |
pandas.ArrowDtype(pyarrow.decimal128(38, 9)) |
decimal.Decimal |
decimal128(38, 9) |
| Grand nombre | BIGNUMERIC |
pandas.ArrowDtype(pyarrow.decimal256(76, 38)) |
decimal.Decimal |
decimal256(76, 38) |
| Liste<T> | ARRAY<T> |
pandas.ArrowDtype(pyarrow.list_(T)) |
list[T] |
list_(T) |
| Struct | STRUCT |
pandas.ArrowDtype(pyarrow.struct()) |
dict |
struct() |
| JSON | JSON |
pandas.ArrowDtype(pyarrow.json_(pa.string()) dans pandas version 3.0 ou ultérieure et PyArrow version 19.0 ou ultérieure ; sinon, les colonnes JSON sont exposées en tant que pandas.ArrowDtype(db_dtypes.JSONArrowType()). Cette fonctionnalité est disponible en version bêta. |
Non compatible | json_() (bêta) |
| Zone géographique | GEOGRAPHY |
Geopandas.array.GeometryDtype()Compatible avec to_pandas() uniquement. |
Non compatible | Non compatible |
| Timedelta | Non compatible | pandas.ArrowDtype(pyarrow.duration("us")) |
datetime.timedelta |
duration("us") |
Conversions de types
Lorsqu'il est utilisé avec des données locales, BigQuery DataFrames convertit les types de données en leurs équivalents BigQuery DataFrames chaque fois qu'un mappage de type est défini, comme illustré dans l'exemple suivant :
PyArrow dicte le comportement en cas de différences entre les équivalents de types de données. Dans de rares cas où le type intégré Python fonctionne différemment de son homologue PyArrow, BigQuery DataFrames privilégie généralement le comportement PyArrow pour garantir la cohérence.
L'exemple de code suivant utilise l'opération datetime.date + timedelta pour montrer que, contrairement à la bibliothèque Python datetime qui renvoie toujours une instance de date, BigQuery DataFrames suit le comportement PyArrow en renvoyant une instance d'horodatage :
Types spéciaux
Les sections suivantes décrivent les types de données spéciaux utilisés par BigQuery DataFrames.
JSON
Dans BigQuery DataFrames, les colonnes utilisant le format
JSON
BigQuery (une norme légère) sont représentées par pandas.ArrowDtype. Le type Arrow sous-jacent exact dépend des versions de votre bibliothèque. Les environnements plus anciens utilisent généralement db_dtypes.JSONArrowType() pour la compatibilité. Il s'agit d'un type d'extension Arrow qui agit comme un wrapper léger autour de pa.string(). En revanche, les configurations plus récentes (pandas 3.0 et versions ultérieures, et PyArrow 19.0 et versions ultérieures) utilisent la représentation pa.json_(pa.string()) plus récente.
timedelta
Le type timedelta n'a pas d'équivalent direct dans le système de types intégré BigQuery. Pour gérer les données de durée, BigQuery DataFrames utilise le type INT64 comme format de stockage sous-jacent dans les tables BigQuery. Vous pouvez vous attendre à ce que les résultats de vos calculs soient cohérents avec le comportement que vous attendez des opérations équivalentes effectuées avec la bibliothèque pandas.
Vous pouvez charger directement les valeurs timedelta dans les objets BigQuery DataFrames et Series, comme illustré dans l'exemple suivant :
Contrairement à pandas, BigQuery DataFrames n'est compatible qu'avec les valeurs timedelta avec une précision en microsecondes. Si vos données incluent des nanosecondes, vous devez les arrondir pour éviter les exceptions potentielles, comme illustré dans l'exemple suivant :
Vous pouvez utiliser la bigframes.pandas.to_timedelta fonction pour caster un
objet Series BigQuery DataFrames au type timedelta, comme illustré
dans l'exemple suivant :
Lorsque vous chargez des données contenant des valeurs timedelta dans une table BigQuery, les valeurs sont converties en microsecondes et stockées dans des colonnes INT64. Pour préserver les informations de type, BigQuery DataFrames ajoute la chaîne #microseconds aux descriptions de ces colonnes. Certaines opérations, telles que les exécutions de requêtes SQL et les appels de fonctions UDF, ne conservent pas les descriptions de colonnes, et les informations de type timedelta sont perdues une fois ces opérations terminées.
Outils pour les types composites
Pour certains types composites, BigQuery DataFrames fournit des outils qui vous permettent d'accéder aux valeurs élémentaires de ces types et de les traiter.
Accesseur de liste
L'objet ListAccessor peut vous aider à effectuer des opérations sur chaque élément de liste à l'aide de la propriété de liste de l'objet Series, comme illustré dans l'exemple suivant :
Accesseur de structure
L'objet StructAccessor peut accéder aux champs d'une série de structures et les traiter. L'objet accesseur de l'API est series.struct, comme illustré dans l'exemple suivant :
Si le champ struct auquel vous prévoyez d'accéder n'est pas ambigu par rapport aux autres propriétés Series, vous pouvez ignorer l'appel de struct, comme illustré dans l'exemple suivant :
Toutefois, il est recommandé d'utiliser struct pour accéder aux champs, car cela facilite la compréhension de votre code et réduit le risque d'erreurs.
Accesseur de chaîne
Vous pouvez accéder à l'objet StringAccessor avec la propriété str d'un objet Series, comme illustré dans l'exemple suivant :
Accesseur de zone géographique
BigQuery DataFrames fournit un objet GeographyAccessor qui partage des API similaires avec la structure GeoSeries fournie par la bibliothèque GeoPandas. Vous pouvez appeler l'objet GeographyAccessor avec la propriété geo d'un objet Series, comme illustré dans l'exemple suivant :
Étape suivante
- En savoir plus sur BigQuery DataFrames.
- En savoir plus sur les sessions et les E/S BigQuery DataFrames.
- Découvrez comment visualiser des graphiques à l'aide de BigQuery DataFrames.
- Explorez la documentation de référence de l'API BigQuery DataFrames.