34
34
Mapping ,
35
35
MutableSequence ,
36
36
Optional ,
37
+ overload ,
37
38
Sequence ,
38
39
Tuple ,
39
40
Union ,
95
96
96
97
# Avoid circular imports.
97
98
if typing .TYPE_CHECKING :
99
+ import bigframes .core .indexes as indices
98
100
import bigframes .dataframe as dataframe
101
+ import bigframes .series as series
99
102
100
103
_BIGFRAMES_DEFAULT_CONNECTION_ID = "bigframes-default-connection"
101
104
@@ -963,7 +966,21 @@ def read_gbq_model(self, model_name: str):
963
966
model = self .bqclient .get_model (model_ref )
964
967
return bigframes .ml .loader .from_bq (self , model )
965
968
969
+ @overload
970
+ def read_pandas (self , pandas_dataframe : pandas .Index ) -> indices .Index :
971
+ ...
972
+
973
+ @overload
974
+ def read_pandas (self , pandas_dataframe : pandas .Series ) -> series .Series :
975
+ ...
976
+
977
+ @overload
966
978
def read_pandas (self , pandas_dataframe : pandas .DataFrame ) -> dataframe .DataFrame :
979
+ ...
980
+
981
+ def read_pandas (
982
+ self , pandas_dataframe : Union [pandas .DataFrame , pandas .Series , pandas .Index ]
983
+ ) -> Union [dataframe .DataFrame , series .Series , indices .Index ]:
967
984
"""Loads DataFrame from a pandas DataFrame.
968
985
969
986
The pandas DataFrame will be persisted as a temporary BigQuery table, which can be
@@ -986,13 +1003,31 @@ def read_pandas(self, pandas_dataframe: pandas.DataFrame) -> dataframe.DataFrame
986
1003
[2 rows x 2 columns]
987
1004
988
1005
Args:
989
- pandas_dataframe (pandas.DataFrame):
990
- a pandas DataFrame object to be loaded.
1006
+ pandas_dataframe (pandas.DataFrame, pandas.Series, or pandas.Index ):
1007
+ a pandas DataFrame/Series/Index object to be loaded.
991
1008
992
1009
Returns:
993
- bigframes.dataframe. DataFrame: The BigQuery DataFrame.
1010
+ An equivalent bigframes.pandas.( DataFrame/Series/Index) object
994
1011
"""
995
- return self ._read_pandas (pandas_dataframe , "read_pandas" )
1012
+ import bigframes .series as series
1013
+
1014
+ # Try to handle non-dataframe pandas objects as well
1015
+ if isinstance (pandas_dataframe , pandas .Series ):
1016
+ bf_df = self ._read_pandas (pandas .DataFrame (pandas_dataframe ), "read_pandas" )
1017
+ bf_series = typing .cast (series .Series , bf_df [bf_df .columns [0 ]])
1018
+ # wrapping into df can set name to 0 so reset to original object name
1019
+ bf_series .name = pandas_dataframe .name
1020
+ return bf_series
1021
+ if isinstance (pandas_dataframe , pandas .Index ):
1022
+ return self ._read_pandas (
1023
+ pandas .DataFrame (index = pandas_dataframe ), "read_pandas"
1024
+ ).index
1025
+ if isinstance (pandas_dataframe , pandas .DataFrame ):
1026
+ return self ._read_pandas (pandas_dataframe , "read_pandas" )
1027
+ else :
1028
+ raise ValueError (
1029
+ f"read_pandas() expects a pandas dataframe, but got a { type (pandas_dataframe )} "
1030
+ )
996
1031
997
1032
def _read_pandas (
998
1033
self , pandas_dataframe : pandas .DataFrame , api_name : str
0 commit comments