Lesson 15, Part 1C: Emulating a SAS Macro in Python Using Functions¶

Here we mimic the following SAS Macro with a Python Function¶

options nodate nonumber nonotes nosource;
%macro process_region(rname);
    proc sql noprint;
        select distinct trim(name)
            into :&rname._clist separated by ","
            from SASHELP.demographics
            where region="&rname";
    quit;
    %put NOTE: Processing region &rname using a macro Loop;
    %put NOTE: SQL Observation count = &sqlobs;
    %put &rname._clist = %superq(&rname._clist);
    %put NOTE: End of region &rname processing;
%mend process_region;
%macro run_all;
    %let regions = AFR AMR EMR SEAR WPR EUR;
    %do i = 1 %to %sysfunc(countw(&regions));
        %let region = %scan(&regions, &i);
        %process_region(&region)
    %end;
%mend run_all;
%run_all
In [18]:
import saspy
import pandas as pd

# Start SAS session
sas = saspy.SASsession()

# Load SAS dataset into pandas
df = sas.sasdata2dataframe(
    table='demographics',
    libref='sashelp'
)

def runit(rname):

    clist = (
        df.loc[df['region'] == rname, 'NAME']
          .dropna()
          .unique()
          .tolist()
    )

    clist.sort()
    clist_str = ", ".join(clist)

    print(f"NOTE: Processing region {rname}")
    print(f"{rname}_clist = {clist_str}")
    print(f"Number of countries = {len(clist)}\n")


# region list (correct scope)
regions = ['AFR', 'AMR', 'EMR', 'SEAR', 'WPR', 'EUR']

# loop
for r in regions:
    runit(r)
Using SAS Config named: winlocal
SAS Connection established. Subprocess id is 127628

NOTE: Processing region AFR
AFR_clist = ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI, CAMEROON, CAPE VERDE, CENTRAL AFRICAN REP., CHAD, COMOROS, CONGO, EQUATORIAL GUINEA, ERITREA, ETHIOPIA, GABON, GAMBIA, GHANA, GUINEA, GUINEA-BISSAU, IVORY COAST, KENYA, LESOTHO, LIBERIA, MADAGASCAR, MALAWI, MALI, MAURITANIA, MAURITIUS, MOZAMBIQUE, NAMIBIA, NIGER, NIGERIA, RWANDA, SAO TOME/PRINCIPE, SENEGAL, SEYCHELLES, SIERRA LEONE, SOUTH AFRICA, SWAZILAND, TANZANIA, TOGO, UGANDA, ZAIRE, ZAMBIA, ZIMBABWE
Number of countries = 46

NOTE: Processing region AMR
AMR_clist = ANTIGUA/BARBUDA, ARGENTINA, BAHAMAS, BARBADOS, BELIZE, BOLIVIA, BRAZIL, CANADA, CHILE, COLOMBIA, COSTA RICA, CUBA, DOMINICA, DOMINICAN REPUBLIC, ECUADOR, EL SALVADOR, GRENADA, GUATEMALA, GUYANA, HAITI, HONDURAS, JAMAICA, MEXICO, NICARAGUA, PANAMA, PARAGUAY, PERU, SAINT KITTS/NEVIS, SAINT VINCENT/GRENADINES, ST. LUCIA, SURINAME, TRINIDAD AND TOBAGO, UNITED STATES, URUGUAY, VENEZUELA
Number of countries = 35

NOTE: Processing region EMR
EMR_clist = AFGHANISTAN, BAHRAIN, DJIBOUTI, EGYPT, IRAN, IRAQ, JORDAN, KUWAIT, LEBANON, LIBYA, MOROCCO, OMAN, PAKISTAN, QATAR, SAUDI ARABIA, SOMALIA, SUDAN, SYRIA, TUNISIA, UNITED ARAB EMIRATES, YEMEN
Number of countries = 21

NOTE: Processing region SEAR
SEAR_clist = BANGLADESH, BHUTAN, EAST TIMOR, INDIA, INDONESIA, KOREA, NORTH, MALDIVES, MYANMAR, NEPAL, SRI LANKA, THAILAND
Number of countries = 11

NOTE: Processing region WPR
WPR_clist = ASHMORE/CARTIER, AUSTRALIA, BRUNEI, CAMBODIA, CHINA, COOK ISLANDS, CORAL SEA ISLANDS, FIJI, JAPAN, KIRIBATI, KOREA, SOUTH, LAOS, MALAYSIA, MARSHALL ISLANDS, MICRONESIA, MONGOLIA, NAURU, NEW ZEALAND, NIUE, PALAU, PAPUA NEW GUINEA, PHILIPPINES, SAMOA, SINGAPORE, SOLOMON ISLANDS, TONGA, TUVALU, VANUATU, VIETNAM
Number of countries = 29

NOTE: Processing region EUR
EUR_clist = ALBANIA, ANDORRA, ARMENIA, AUSTRIA, AZERBAIJAN, BELARUS, BELGIUM, BOSNIA/HERZEGOVINA, BULGARIA, CROATIA, CYPRUS, CZECH REPUBLIC, DENMARK, ESTONIA, FINLAND, FRANCE, GEORGIA, GERMANY, GREECE, GUERNSEY, HUNGARY, ICELAND, IRELAND, ISRAEL, ITALY, JERSEY, KAZAKHSTAN, KYRGYZSTAN, LATVIA, LITHUANIA, LUXEMBOURG, MACEDONIA, MALTA, MAN, MOLDOVA, MONACO, NETHERLANDS, NORWAY, POLAND, PORTUGAL, ROMANIA, RUSSIA, SAN MARINO, SERBIA, SLOVAKIA, SLOVENIA, SPAIN, SWEDEN, SWITZERLAND, TAJIKISTAN, TURKEY, TURKMENISTAN, UKRAINE, UNITED KINGDOM, UZBEKISTAN
Number of countries = 55

In [ ]: