11# Query Jupyter server for the info about a dataframe
22import json as _VSCODE_json
33import pandas as _VSCODE_pd
4+ import pandas .io .json as _VSCODE_pd_json
45
56# _VSCode_sub_supportsDataExplorer will contain our list of data explorer supported types
67_VSCode_supportsDataExplorer = "['list', 'Series', 'dict', 'ndarray', 'DataFrame']"
1920 del _VSCode_supportsDataExplorer
2021 _VSCODE_evalResult = eval (_VSCODE_targetVariable ['name' ])
2122
22- # First list out the columns of the data frame (assuming it is one for now)
23- _VSCODE_columnTypes = []
24- _VSCODE_columnNames = []
25- if _VSCODE_targetVariable ['type' ] == 'list' :
26- _VSCODE_evalResult = _VSCODE_pd .DataFrame (_VSCODE_evalResult )
27- _VSCODE_columnTypes = list (_VSCODE_evalResult .dtypes )
28- _VSCODE_columnNames = list (_VSCODE_evalResult )
29- elif _VSCODE_targetVariable ['type' ] == 'Series' :
30- _VSCODE_evalResult = _VSCODE_pd .Series .to_frame (_VSCODE_evalResult )
31- _VSCODE_columnTypes = list (_VSCODE_evalResult .dtypes )
32- _VSCODE_columnNames = list (_VSCODE_evalResult )
33- elif _VSCODE_targetVariable ['type' ] == 'dict' :
23+ # Figure out shape if not already there. Use the shape to compute the row count
24+ if (hasattr (_VSCODE_evalResult , 'shape' )):
25+ try :
26+ # Get a bit more restrictive with exactly what we want to count as a shape, since anything can define it
27+ if isinstance (_VSCODE_evalResult .shape , tuple ):
28+ _VSCODE_targetVariable ['rowCount' ] = _VSCODE_evalResult .shape [0 ]
29+ except TypeError :
30+ _VSCODE_targetVariable ['rowCount' ] = 0
31+ elif (hasattr (_VSCODE_evalResult , '__len__' )):
32+ try :
33+ _VSCODE_targetVariable ['rowCount' ] = len (_VSCODE_evalResult )
34+ except TypeError :
35+ _VSCODE_targetVariable ['rowCount' ] = 0
36+
37+ # Turn the eval result into a df
38+ _VSCODE_df = _VSCODE_evalResult
39+ if isinstance (_VSCODE_evalResult , list ):
40+ _VSCODE_df = _VSCODE_pd .DataFrame (_VSCODE_evalResult )
41+ elif isinstance (_VSCODE_evalResult , _VSCODE_pd .Series ):
42+ _VSCODE_df = _VSCODE_pd .Series .to_frame (_VSCODE_evalResult )
43+ elif isinstance (_VSCODE_evalResult , dict ):
3444 _VSCODE_evalResult = _VSCODE_pd .Series (_VSCODE_evalResult )
35- _VSCODE_evalResult = _VSCODE_pd .Series .to_frame (_VSCODE_evalResult )
36- _VSCODE_columnTypes = list (_VSCODE_evalResult .dtypes )
37- _VSCODE_columnNames = list (_VSCODE_evalResult )
45+ _VSCODE_df = _VSCODE_pd .Series .to_frame (_VSCODE_evalResult )
3846 elif _VSCODE_targetVariable ['type' ] == 'ndarray' :
39- _VSCODE_evalResult = _VSCODE_pd .DataFrame (_VSCODE_evalResult )
40- _VSCODE_columnTypes = list (_VSCODE_evalResult .dtypes )
41- _VSCODE_columnNames = list (_VSCODE_evalResult )
42- elif _VSCODE_targetVariable ['type' ] == 'DataFrame' :
43- _VSCODE_columnTypes = list (_VSCODE_evalResult .dtypes )
44- _VSCODE_columnNames = list (_VSCODE_evalResult )
47+ _VSCODE_df = _VSCODE_pd .DataFrame (_VSCODE_evalResult )
48+
49+ # If any rows, use pandas json to convert a single row to json. Extract
50+ # the column names and types from the json so we match what we'll fetch when
51+ # we ask for all of the rows
52+ if _VSCODE_targetVariable ['rowCount' ]:
53+ try :
54+ _VSCODE_row = _VSCODE_df .iloc [0 :1 ]
55+ _VSCODE_json_row = _VSCODE_pd_json .to_json (None , _VSCODE_row , date_format = 'iso' )
56+ _VSCODE_columnNames = list (_VSCODE_json .loads (_VSCODE_json_row ))
57+ del _VSCODE_row
58+ del _VSCODE_json_row
59+ except :
60+ _VSCODE_columnNames = list (_VSCODE_df )
61+ else :
62+ _VSCODE_columnNames = list (_VSCODE_df )
63+
64+ # Compute the index column. It may have been renamed
65+ _VSCODE_indexColumn = _VSCODE_df .index .name if _VSCODE_df .index .name else 'index'
66+ _VSCODE_columnTypes = list (_VSCODE_df .dtypes )
67+ del _VSCODE_df
4568
46- # Make sure we have an index column (see code in getJupyterVariableDataFrameRows.py)
47- if 'index' not in _VSCODE_columnNames :
48- _VSCODE_columnNames .insert (0 , 'index' )
69+ # Make sure the index column exists
70+ if _VSCODE_indexColumn not in _VSCODE_columnNames :
71+ _VSCODE_columnNames .insert (0 , _VSCODE_indexColumn )
4972 _VSCODE_columnTypes .insert (0 , 'int64' )
5073
5174 # Then loop and generate our output json
5275 _VSCODE_columns = []
5376 for _VSCODE_n in range (0 , len (_VSCODE_columnNames )):
54- _VSCODE_column_name = _VSCODE_columnNames [_VSCODE_n ]
5577 _VSCODE_column_type = _VSCODE_columnTypes [_VSCODE_n ]
78+ _VSCODE_column_name = str (_VSCODE_columnNames [_VSCODE_n ])
5679 _VSCODE_colobj = {}
5780 _VSCODE_colobj ['key' ] = _VSCODE_column_name
5881 _VSCODE_colobj ['name' ] = _VSCODE_column_name
6689
6790 # Save this in our target
6891 _VSCODE_targetVariable ['columns' ] = _VSCODE_columns
92+ _VSCODE_targetVariable ['indexColumn' ] = _VSCODE_indexColumn
6993 del _VSCODE_columns
94+ del _VSCODE_indexColumn
7095
71- # Figure out shape if not already there. Use the shape to compute the row count
72- if (hasattr (_VSCODE_evalResult , "shape" )):
73- _VSCODE_targetVariable ['rowCount' ] = _VSCODE_evalResult .shape [0 ]
74- elif _VSCODE_targetVariable ['type' ] == 'list' :
75- _VSCODE_targetVariable ['rowCount' ] = len (_VSCODE_evalResult )
76- else :
77- _VSCODE_targetVariable ['rowCount' ] = 0
7896
7997 # Transform this back into a string
8098 print (_VSCODE_json .dumps (_VSCODE_targetVariable ))
81- del _VSCODE_targetVariable
99+ del _VSCODE_targetVariable
100+
101+ # Cleanup imports
102+ del _VSCODE_json
103+ del _VSCODE_pd
104+ del _VSCODE_pd_json
0 commit comments