@@ -808,29 +808,60 @@ def test_list_columns_and_indexes_with_named_index_same_as_column_name(
808808@pytest .mark .skipif (pandas is None , reason = "Requires `pandas`" )
809809def test_dataframe_to_json_generator (module_under_test ):
810810 utcnow = datetime .datetime .utcnow ()
811- df_data = collections .OrderedDict (
812- [
813- ("a_series" , [pandas .NA , 2 , 3 , 4 ]),
814- ("b_series" , [0.1 , float ("NaN" ), 0.3 , 0.4 ]),
815- ("c_series" , ["a" , "b" , pandas .NA , "d" ]),
816- ("d_series" , [utcnow , utcnow , utcnow , pandas .NaT ]),
817- ("e_series" , [True , False , True , None ]),
818- ]
819- )
820811 dataframe = pandas .DataFrame (
821- df_data , index = pandas .Index ([4 , 5 , 6 , 7 ], name = "a_index" )
812+ {
813+ "a_series" : [1 , 2 , 3 , 4 ],
814+ "b_series" : [0.1 , float ("NaN" ), 0.3 , 0.4 ],
815+ "c_series" : ["a" , "b" , pandas .NA , "d" ],
816+ "d_series" : [utcnow , utcnow , utcnow , pandas .NaT ],
817+ "e_series" : [True , False , True , None ],
818+ # Support nullable dtypes.
819+ # https://github.com/googleapis/python-bigquery/issues/1815
820+ "boolean_series" : pandas .Series (
821+ [True , False , pandas .NA , False ], dtype = "boolean"
822+ ),
823+ "int64_series" : pandas .Series ([- 1 , pandas .NA , - 3 , - 4 ], dtype = "Int64" ),
824+ }
822825 )
823826
824- dataframe = dataframe .astype ({"a_series" : pandas .Int64Dtype ()})
827+ # Index is not included, even if it is not the default and has a name.
828+ dataframe = dataframe .rename (index = lambda idx : idx + 4 )
829+ dataframe .index .name = "a_index"
825830
826- rows = module_under_test .dataframe_to_json_generator (dataframe )
831+ rows = list ( module_under_test .dataframe_to_json_generator (dataframe ) )
827832 expected = [
828- {"b_series" : 0.1 , "c_series" : "a" , "d_series" : utcnow , "e_series" : True },
829- {"a_series" : 2 , "c_series" : "b" , "d_series" : utcnow , "e_series" : False },
830- {"a_series" : 3 , "b_series" : 0.3 , "d_series" : utcnow , "e_series" : True },
831- {"a_series" : 4 , "b_series" : 0.4 , "c_series" : "d" },
833+ {
834+ "a_series" : 1 ,
835+ "b_series" : 0.1 ,
836+ "c_series" : "a" ,
837+ "d_series" : utcnow ,
838+ "e_series" : True ,
839+ "boolean_series" : True ,
840+ "int64_series" : - 1 ,
841+ },
842+ {
843+ "a_series" : 2 ,
844+ "c_series" : "b" ,
845+ "d_series" : utcnow ,
846+ "e_series" : False ,
847+ "boolean_series" : False ,
848+ },
849+ {
850+ "a_series" : 3 ,
851+ "b_series" : 0.3 ,
852+ "d_series" : utcnow ,
853+ "e_series" : True ,
854+ "int64_series" : - 3 ,
855+ },
856+ {
857+ "a_series" : 4 ,
858+ "b_series" : 0.4 ,
859+ "c_series" : "d" ,
860+ "boolean_series" : False ,
861+ "int64_series" : - 4 ,
862+ },
832863 ]
833- assert list ( rows ) == expected
864+ assert rows == expected
834865
835866
836867@pytest .mark .skipif (pandas is None , reason = "Requires `pandas`" )
0 commit comments