Gentle introduction to SASpy

SASPy is an interface to SAS that automatically generates SAS code from your Python 3.x scripts. You can import the SASPy module into Jupyter Notebook for SAS University Edition, create a connection to the SAS server, and then use Python objects and syntax to access SAS data and your licensed SAS software. You can also exchange data using the pandas software library.

When you submit your Python code, you can view your SAS results in your Jupyter notebook. You can also choose to view the SAS code that is automatically generated”

The above is how SAS defined saspy there isn’t much too comment about to be honest so let’s get our hands dirty.

We import saspy in the usual way. Notice that I am using SAS Studio (University Edition) so saspy comes pre-installed. If you need to install it then you can do pip install saspy (haven’t tried though).

import saspy
import pandas as pd

Create a SAS Session

It is as simple as follow.

sas = saspy.SASsession()
Using SAS Config named: default
SAS Connection established. Subprocess id is 19082

We will use sas to link subsequent commands to the SASsession().

Load a SAS dataset into a python object

We can read any SAS dataset in any library so long it is available to your SAS profile. So far I have only played with base SAS datasets I wonder if works fine with let’s say an Oracle libname for example. I will cover this in a different post.

We use sasdata method to pass the data set name as first parameter and then the libname. I would have done the other way around, libname first and then the table name to be consistent with libname.sas-data-set-name format. Not a deal breaker anyway.

cars = sas.sasdata('cars','sashelp')
print(type(cars))
<class 'saspy.sasbase.SASdata'>

SAS returns its own python object saspy.sasbase.SASdata but it can be converted to a pandas dataframe using to_df() if this is more convenient.

cars2 =cars.to_df()
print(type(cars2))
<class 'pandas.core.frame.DataFrame'>

SASpy and pandas share common methods that differentiate cosmetically only. Here is an example with describe()

cars.describe() #SAS
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

cars2.describe() #Pandas
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

Let’s see how many methods are available for SAS datasets:

sas_method_available_to_ds =len([method_name for method_name in dir(cars)])
print(sas_method_available_to_ds)
61

and now, let’s do the same check for pandas dataframes:

pandas_method_available_to_ds =len([method_name for method_name in dir(cars2)])
print(pandas_method_available_to_ds)
469

Pandas has way more methods to deal with dataframes than SAS! But I don’t think SAS strategy is to compete with Pandas. Instead SAS uses pandas as leverage for interfacing other environments. For example, there is no straight forward way to export data from SAS to MongoDB. I’ve seen some macros that are complex and rely on the OS that export the SAS data to a CSV file, then make calls to the mongoimport command to import the csv file in MongoDB.

In my view, a more elegant solutions would have been to convert the SAS data set to a Pandas data frame (either using saspy or read_sas()) convert the data frame to json and copy the data to mongoDB using pymongo. This is indeed a larger solution in terms of lines of code but definitely a more robust version which is OS independent.

Let’s see now some of the methods availble for SAS datasets in saspy:

print([method_name for method_name in dir(cars)])
['HTML', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_checkLogForError', '_dsopts', '_is_valid', '_returnPD', 'assessModel', 'bar', 'columnInfo', 'contents', 'describe', 'dsopts', 'head', 'heatmap', 'hist', 'impute', 'info', 'libref', 'logger', 'means', 'partition', 'results', 'sas', 'scatter', 'score', 'series', 'set_results', 'sort', 'table', 'tail', 'to_csv', 'to_df', 'to_df_CSV', 'to_frame', 'top', 'where']

top give the top n (default = 10) most common records of any given variable.

cars.top(var='make')
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

columnInfo() provides information about columns held in the dataset in standard SAS template.

cars.columnInfo()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

I wonder that python modules come shipped with SAS Studio:

help('modules')
Please wait a moment while I gather a list of all available modules...

/usr/lib64/python3.5/site-packages/IPython/kernel/__init__.py:13: ShimWarning: The `IPython.kernel` package has been deprecated since IPython 4.0.You should import from ipykernel or jupyter_client instead.
      "You should import from ipykernel or jupyter_client instead.", ShimWarning)


    /usr/lib64/python3.5/site-packages/sas_kernel/data
    CDROM               asyncore            itertools           select
    DLFCN               atexit              jinja2              selectors
    IN                  audioop             json                setuptools
    IPython             autoreload          jsonschema          shelve
    TYPES               backports           jupyter             shlex
    __future__          base64              jupyter_client      shutil
    _ast                bdb                 jupyter_core        signal
    _bisect             binascii            keyword             simplegeneric
    _bootlocale         binhex              lib2to3             site
    _bz2                bisect              linecache           six
    _codecs             builtins            locale              smtpd
    _codecs_cn          bz2                 logging             smtplib
    _codecs_hk          cProfile            lzma                sndhdr
    _codecs_iso2022     calendar            macpath             socket
    _codecs_jp          cgi                 macurl2path         socketserver
    _codecs_kr          cgitb               mailbox             spwd
    _codecs_tw          chunk               mailcap             sqlite3
    _collections        cmath               markupsafe          sre_compile
    _collections_abc    cmd                 marshal             sre_constants
    _compat_pickle      code                math                sre_parse
    _compression        codecs              metakernel          ssl
    _crypt              codeop              mimetypes           stat
    _csv                collections         mistune             statistics
    _ctypes             colorsys            mmap                storemagic
    _ctypes_test        compileall          modulefinder        string
    _datetime           concurrent          multiprocessing     stringprep
    _dbm                configparser        nbconvert           struct
    _decimal            contextlib          nbformat            subprocess
    _dummy_thread       copy                netrc               sunau
    _functools          copyreg             nis                 symbol
    _gdbm               crypt               nntplib             sympyprinting
    _hashlib            csv                 notebook            symtable
    _heapq              ctypes              ntpath              sys
    _imp                curses              nturl2path          sysconfig
    _io                 cythonmagic         numbers             syslog
    _json               datetime            numpy               tabnanny
    _locale             dateutil            opcode              tarfile
    _lsprof             dbm                 operator            telnetlib
    _lzma               decimal             optparse            tempfile
    _markupbase         decorator           os                  termios
    _md5                difflib             ossaudiodev         test
    _multibytecodec     dis                 pandas              testpath
    _multiprocessing    distutils           pandocfilters       textwrap
    _opcode             doctest             parser              this
    _operator           dummy_threading     pathlib             threading
    _osx_support        easy_install        pdb                 time
    _pickle             email               pexpect             timeit
    _posixsubprocess    encodings           pickle              tkinter
    _pydecimal          ensurepip           pickleshare         token
    _pyio               entrypoints         pickletools         tokenize
    _random             enum                pipes               tornado
    _sha1               errno               pkg_resources       trace
    _sha256             faulthandler        pkgutil             traceback
    _sha512             fcntl               platform            tracemalloc
    _signal             filecmp             plistlib            traitlets
    _sitebuiltins       fileinput           poplib              tty
    _socket             fnmatch             posix               turtle
    _sqlite3            formatter           posixpath           types
    _sre                fractions           pprint              typing
    _ssl                ftplib              profile             unicodedata
    _stat               functools           prompt_toolkit      unittest
    _string             gc                  pstats              urllib
    _strptime           genericpath         pty                 uu
    _struct             getopt              ptyprocess          uuid
    _symtable           getpass             pwd                 venv
    _sysconfigdata      gettext             py_compile          warnings
    _testbuffer         glob                pyclbr              wave
    _testcapi           grp                 pydoc               wcwidth
    _testimportmultiple gzip                pydoc_data          weakref
    _testmultiphase     hashlib             pyexpat             webbrowser
    _thread             heapq               pygments            widgetsnbextension
    _threading_local    hmac                pytz                wsgiref
    _tkinter            html                queue               xdrlib
    _tracemalloc        http                quopri              xml
    _warnings           imaplib             random              xmlrpc
    _weakref            imghdr              re                  xxlimited
    _weakrefset         imp                 readline            xxsubtype
    abc                 importlib           reprlib             zipapp
    aifc                inspect             resource            zipfile
    antigravity         io                  rlcompleter         zipimport
    argparse            ipaddress           rmagic              zlib
    array               ipykernel           runpy               zmq
    ast                 ipykernel_launcher  sas_kernel          
    asynchat            ipython_genutils    saspy               
    asyncio             ipywidgets          sched               
    
    Enter any module name to get more help.  Or, type "modules spam" to search
    for modules whose name or summary contain the string "spam".

There are a few “key” packages missing in action for data science such as NLTK, scikit_learn, statsmodels among others.

One really neat feature of saspy is the ability to send SAS code and get feedback. This alone is a huge advantage for mixing up SAS and Python and open up a wide variety of scenarios where such mix can be a win-win combination!

c = sas.submit("""
proc contents data=sashelp.class;run;
""")

The above code, send to the SASsession() a proc contents statement and save results in the python variable c

type(c)
dict

As you can see, the variable c is a standard python dictionary and inspecting its keys we can see:

c.keys()

that the SAS log and SAS List are available. Please note that LST will only make sense for procedures that produce any kind of output such as proc print, proc means, proc tabulate, etc. In the case of data steps LST is empty.

dict_keys(['LOG', 'LST'])

Let’s have a look at the output of the proc contents:

print(c['LST'][1:1000])
!DOCTYPE html>
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8"/>
<meta content="SAS 9.4" name="generator"/>
<title>SAS Output</title>
<style>
/*<![CDATA[*/
.body.c > table, .body.c > pre, .body.c div > table,
.body.c div > pre, .body.c > table, .body.c > pre,
.body.j > table, .body.j > pre, .body.j div > table,
.body.j div > pre, .body.j > table, .body.j > pre,
.body.c p.note, .body.c p.warning, .body.c p.error, .body.c p.fatal,
.body.j p.note, .body.j p.warning, .body.j p.error, .body.j p.fatal,
.body.c > table.layoutcontainer, .body.j > table.layoutcontainer { margin-left: auto; margin-right: auto }
.layoutregion.l table, .layoutregion.l pre, .layoutregion.l p.note,
.layoutregion.l p.warning, .layoutregion.l p.error, .layoutregion.l p.fatal { margin-left: 0 }
.layoutregion.c table, .layoutregion.c pre, .layoutregion.c p.note,
.layoutregion.c p.warning, .layoutregion.c p.error, .layoutregion.c p.fatal { margin-left: auto; margin-right:

It looks awful!!! but there is a quick fix for this:

from IPython.display import HTML
HTML(c['LST'])
font-size:  normal;
font-style: normal;
font-weight: normal;
text-align: right;
vertical-align: top;
width: 100%;

} .bycontentfolder { color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: none; margin-left: 6pt; } .byline { background-color: #fafbfe; border-spacing: 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .bylinecontainer > col, .bylinecontainer > colgroup > col, .bylinecontainer > colgroup, .bylinecontainer > tr, .bylinecontainer > * > tr, .bylinecontainer > thead, .bylinecontainer > tbody, .bylinecontainer > tfoot { border: none; } .bylinecontainer { background-color: #fafbfe; border: none; border-spacing: 1px; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; width: 100%; } .caption { background-color: #fafbfe; border-spacing: 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .cell, .container { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .contentfolder, .contentitem { color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: none; margin-left: 6pt; } .contentproclabel, .contentprocname { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .contents { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: decimal; margin-left: 8px; margin-right: 8px; } .contentsdate { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; width: 100%; } .contenttitle { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: italic; font-weight: bold; } .continued { background-color: #fafbfe; border-spacing: 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; width: 100%; } .data, .dataemphasis { background-color: #ffffff; border-color: #c1c1c1; border-style: solid; border-width: 0 1px 1px 0; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .dataemphasisfixed { background-color: #ffffff; border-color: #c1c1c1; border-style: solid; border-width: 0 1px 1px 0; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: italic; font-weight: normal; } .dataempty { background-color: #ffffff; border-color: #c1c1c1; border-style: solid; border-width: 0 1px 1px 0; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .datafixed { background-color: #ffffff; border-color: #c1c1c1; border-style: solid; border-width: 0 1px 1px 0; font-family: ‘Courier New’, Courier; font-size: normal; font-style: normal; font-weight: normal; } .datastrong { background-color: #ffffff; border-color: #c1c1c1; border-style: solid; border-width: 0 1px 1px 0; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .datastrongfixed { background-color: #ffffff; border-color: #c1c1c1; border-style: solid; border-width: 0 1px 1px 0; color: #000000; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: normal; font-weight: bold; } .date { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; width: 100%; } .document { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .errorbanner { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .errorcontent { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .errorcontentfixed { background-color: #fafbfe; color: #112277; font-family: ‘Courier New’, Courier; font-size: normal; font-style: normal; font-weight: normal; } .extendedpage { background-color: #fafbfe; border-style: solid; border-width: 1pt; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: italic; font-weight: normal; text-align: center; } .fatalbanner { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .fatalcontent { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .fatalcontentfixed { background-color: #fafbfe; color: #112277; font-family: ‘Courier New’, Courier; font-size: normal; font-style: normal; font-weight: normal; } .folderaction { color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: none; margin-left: 6pt; } .footer { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .footeremphasis { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: italic; font-weight: normal; } .footeremphasisfixed { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: italic; font-weight: normal; } .footerempty { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .footerfixed { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: ‘Courier New’, Courier; font-size: normal; font-style: normal; font-weight: normal; } .footerstrong { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .footerstrongfixed { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: normal; font-weight: bold; } .frame { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .graph > colgroup { border-left: 1px solid #c1c1c1; border-right: 1px solid #c1c1c1; } .graph > tbody, .graph > thead, .graph > tfoot { border-top: 1px solid #c1c1c1; border-bottom: 1px solid #c1c1c1; } .graph { border: hidden; } .graph { background-color: #fafbfe; border: 1px solid #c1c1c1; border-collapse: separate; border-spacing: 1px; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .header { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .headeremphasis { background-color: #d8dbd3; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: italic; font-weight: normal; } .headeremphasisfixed { background-color: #d8dbd3; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #000000; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: italic; font-weight: normal; } .headerempty { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .headerfixed { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: ‘Courier New’, Courier; font-size: normal; font-style: normal; font-weight: normal; } .headersandfooters { background-color: #edf2f9; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .headerstrong { background-color: #d8dbd3; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .headerstrongfixed { background-color: #d8dbd3; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #000000; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: normal; font-weight: bold; } .heading1, .heading2, .heading3, .heading4, .heading5, .heading6 { font-family: Arial, Helvetica, sans-serif } .index { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .indexaction, .indexitem { color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: none; margin-left: 6pt; } .indexprocname { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .indextitle { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: italic; font-weight: bold; } .layoutcontainer, .layoutregion { border-width: 0; border-spacing: 30px; } .linecontent { background-color: #fafbfe; border-color: #c1c1c1; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } a:link { color: #0000ff } .list { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: disc; } .list10 { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: square; } .list2 { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: circle; } .list3, .list4, .list5, .list6, .list7, .list8, .list9 { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: square; } .listitem { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: disc; } .listitem10 { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: square; } .listitem2 { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: circle; } .listitem3, .listitem4, .listitem5, .listitem6, .listitem7, .listitem8, .listitem9 { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: square; } .note { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .notebanner { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .notecontent { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .notecontentfixed { background-color: #fafbfe; color: #112277; font-family: ‘Courier New’, Courier; font-size: normal; font-style: normal; font-weight: normal; } .output > colgroup { border-left: 1px solid #c1c1c1; border-right: 1px solid #c1c1c1; } .output > tbody, .output > thead, .output > tfoot { border-top: 1px solid #c1c1c1; border-bottom: 1px solid #c1c1c1; } .output { border: hidden; } .output { background-color: #fafbfe; border: 1px solid #c1c1c1; border-collapse: separate; border-spacing: 1px; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .pageno { background-color: #fafbfe; border-spacing: 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; text-align: right; vertical-align: top; } .pages { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: decimal; margin-left: 8px; margin-right: 8px; } .pagesdate { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; width: 100%; } .pagesitem { color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; list-style-type: none; margin-left: 6pt; } .pagesproclabel, .pagesprocname { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .pagestitle { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: italic; font-weight: bold; } .paragraph { background-color: #fafbfe; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .parskip > col, .parskip > colgroup > col, .parskip > colgroup, .parskip > tr, .parskip > * > tr, .parskip > thead, .parskip > tbody, .parskip > tfoot { border: none; } .parskip { border: none; border-spacing: 0; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .prepage { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; text-align: left; } .proctitle { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .proctitlefixed { background-color: #fafbfe; color: #112277; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: normal; font-weight: bold; } .rowfooter { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .rowfooteremphasis { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: italic; font-weight: normal; } .rowfooteremphasisfixed { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: italic; font-weight: normal; } .rowfooterempty { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .rowfooterfixed { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: ‘Courier New’, Courier; font-size: normal; font-style: normal; font-weight: normal; } .rowfooterstrong { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .rowfooterstrongfixed { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: normal; font-weight: bold; } .rowheader { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .rowheaderemphasis { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: italic; font-weight: normal; } .rowheaderemphasisfixed { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: italic; font-weight: normal; } .rowheaderempty { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .rowheaderfixed { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: ‘Courier New’, Courier; font-size: normal; font-style: normal; font-weight: normal; } .rowheaderstrong { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .rowheaderstrongfixed { background-color: #edf2f9; border-color: #b0b7bb; border-style: solid; border-width: 0 1px 1px 0; color: #112277; font-family: ‘Courier New’, Courier, monospace; font-size: normal; font-style: normal; font-weight: bold; } .systemfooter, .systemfooter10, .systemfooter2, .systemfooter3, .systemfooter4, .systemfooter5, .systemfooter6, .systemfooter7, .systemfooter8, .systemfooter9 { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .systemtitle, .systemtitle10, .systemtitle2, .systemtitle3, .systemtitle4, .systemtitle5, .systemtitle6, .systemtitle7, .systemtitle8, .systemtitle9 { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: small; font-style: normal; font-weight: bold; } .systitleandfootercontainer > col, .systitleandfootercontainer > colgroup > col, .systitleandfootercontainer > colgroup, .systitleandfootercontainer > tr, .systitleandfootercontainer > * > tr, .systitleandfootercontainer > thead, .systitleandfootercontainer > tbody, .systitleandfootercontainer > tfoot { border: none; } .systitleandfootercontainer { background-color: #fafbfe; border: none; border-spacing: 1px; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; width: 100%; } .table > col, .table > colgroup > col { border-left: 1px solid #c1c1c1; border-right: 0 solid #c1c1c1; } .table > tr, .table > * > tr { border-top: 1px solid #c1c1c1; border-bottom: 0 solid #c1c1c1; } .table { border: hidden; } .table { border-color: #c1c1c1; border-style: solid; border-width: 1px 0 0 1px; border-collapse: collapse; border-spacing: 0; } .titleandnotecontainer > col, .titleandnotecontainer > colgroup > col, .titleandnotecontainer > colgroup, .titleandnotecontainer > tr, .titleandnotecontainer > * > tr, .titleandnotecontainer > thead, .titleandnotecontainer > tbody, .titleandnotecontainer > tfoot { border: none; } .titleandnotecontainer { background-color: #fafbfe; border: none; border-spacing: 1px; color: #000000; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; width: 100%; } .titlesandfooters { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .usertext { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } a:visited { color: #800080 } .warnbanner { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: bold; } .warncontent { background-color: #fafbfe; color: #112277; font-family: Arial, ‘Albany AMT’, Helvetica, Helv; font-size: normal; font-style: normal; font-weight: normal; } .warncontentfixed { background-color: #fafbfe; color: #112277; font-family: ‘Courier New’, Courier; font-size: normal; font-style: normal; font-weight: normal; } /]]>/

Now you can see the output as you would see it in SAS.

That’s all for now folks but keep in tune as I will be adding more content about saspy.

See you later!

Comments

comments powered by Disqus