Извлеките таблицу SAS casout на pandas фрейм данных - PullRequest
1 голос
/ 11 февраля 2020

Я использую python API SAS, и загрузил таблицу по:

s.upload("./data/hmeq.csv", casout=dict(name=tbl_name, replace=True))

Я могу видеть детали таблицы по s.tableinfo().

§ TableInfo
    Name    Rows    Columns IndexedColumns  Encoding    CreateTimeFormatted ModTimeFormatted    AccessTimeFormatted JavaCharSet CreateTime  ... Repeated    View    MultiPart   SourceName  SourceCaslib    Compressed  Creator Modifier    SourceModTimeFormatted  SourceModTime
0   HMEQ    5960    13  0   utf-8   2020-02-10T16:48:02-05:00   2020-02-10T16:48:02-05:00   2020-02-10T21:10:34-05:00   UTF8    1.896990e+09    ... 0   0   0           0   aforoo      2020-02-10T16:48:02-05:00   1.896990e+09
1 rows × 23 columns

Но я не могу получить доступ к какому-либо значению таблицы в python. Например, предположим, что я хочу получить число строк и столбцов в виде python скаляра. Я знаю, что могу получить таблицы SAS в pandas таблицах, используя pd.DataFrame, но это не работает для этой таблицы, и я получаю:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy)
    346                                  dtype=dtype, copy=copy)
    347         elif isinstance(data, dict):
--> 348             mgr = self._init_dict(data, index, columns, dtype=dtype)
    349         elif isinstance(data, ma.MaskedArray):
    350             import numpy.ma.mrecords as mrecords

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\frame.py in _init_dict(self, data, index, columns, dtype)
    457             arrays = [data[k] for k in keys]
    458 
--> 459         return _arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype)
    460 
    461     def _init_ndarray(self, values, index, columns, dtype=None, copy=False):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\frame.py in _arrays_to_mgr(arrays, arr_names, index, columns, dtype)
   7354     # figure out the index, if necessary
   7355     if index is None:
-> 7356         index = extract_index(arrays)
   7357 
   7358     # don't force copy because getting jammed in an ndarray anyway

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\frame.py in extract_index(data)
   7391 
   7392         if not indexes and not raw_lengths:
-> 7393             raise ValueError('If using all scalar values, you must pass'
   7394                              ' an index')
   7395 

ValueError: If using all scalar values, you must pass an index

У меня такая же проблема с любым другим casout таблица в САС. Я ценю любую помощь или комментарий.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Я нашел решение ниже, и оно отлично работает. Например, здесь я использовал действие dataSciencePilot.exploreData и могу получить результаты следующим образом:

casout = dict(name = 'out1', replace=True)
s.dataSciencePilot.exploreData(table=tbl_name, target='bad', casout=casout)
fetch_opts = dict(maxrows=100000000, to=1000000)
df = s.fetch(table='out1', **fetch_opts)['Fetch']
features = pd.DataFrame(df)
type(features)

, что возвращает pandas.core.frame.DataFrame.

0 голосов
/ 11 февраля 2020

Я бы посоветовал вам использовать Pandas для чтения из SAS.

Ссылка из другого ответа: Считайте файл SAS с помощью pandas

Вот еще один пример https://www.marsja.se/how-to-read-sas-files-in-python-with-pandas/

...