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(®ions));
%let region = %scan(®ions, &i);
%process_region(®ion)
%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 [ ]: