آمار ۴۲۶ بازدید

یکی از زبان‌های پرطرفدار برای انجام محاسبات ریاضی در حوزه «علم داده» (Data Science) و «یادگیری ماشین» (Machine Learning)، پایتون است بطوری که در سال‌های اخیر شاهد رشد بسیار زیاد استفاده کنندگان و پروژه‌های نوشته شده با زبان پایتون هستیم. به همین دلیل شرکت IBM که صاحب نرم‌افزار SPSS‌ است، استفاده از این زبان برنامه‌نویسی را در این بسته محاسبات آماری گنجانده است. در این نوشتار به بررسی انجام عملیات تکراری با پایتون در SPSS می‌پردازیم. این متن قسمت دوم از دنباله مطالب مربوط به برنامه‌نویسی پایتون در SPSS‌ است. فهرست زیر این مطالب را معرفی کرده است.

به عنوان پیش‌نیاز و برای آشنایی با محیط نرم‌افزار SPSS‌ و کار با آن بهتر است مطلب پنجره ویرایشگر داده (Data Editor) در SPSS — راهنمای کاربردی و امکانات جدید SPSS نسخه 2۵ که باید آن‌ها را بدانید را بخوانید. همچنین مطالعه قسمت اول از این مجموعه به نام پایتون در SPSS – راهنمای گام به گام و زبان برنامه نویسی پایتون (Python) — از صفر تا صد نیز خالی از لطف نیست. برای آشنایی بیشتر با نحوه برنامه‌نویسی به زبان پایتون بهتر است آموزش‌های ویدئو‌یی برنامه‌نویسی پایتون را نیز تهیه کنید.

انجام عملیات تکراری با پایتون در SPSS

در بسیاری از اوقات لازم است که کارهای تکراری در محیط SPSS انجام دهیم که شاید با استفاده از قابلیت Syntax امکان‌پذیر نباشند. در ادامه این متن، به بررسی حالتی در محیط SPSS می‌پردازیم که احتیاج به برنامه‌نویسی به زبان پایتون داریم. در ابتدا نحوه تغییرات روی رشته‌های متنی در خروجی‌های SPSS یعنی پنجره Output، بوسیله زبان برنامه‌نویسی پایتون را مورد بررسی قرار داده سپس نکاتی را متذکر می‌شویم که باید در زمان برنامه‌نویسی با این زبان رعایت کنیم.

کار با رشته‌های متنی پایتون در محیط SPSS

یکی از موضوعاتی که در محیط SPSS مورد توجه است، نحوه انجام عملیات روی رشته‌های متنی است. در این قسمت به بررسی نحوه عملکرد توابع پایتون روی رشته‌های متنی می‌پردازیم. ابتدا قواعد پایه برای انجام عملیات روی رشته‌های متنی در پایتون را مرور می‌کنیم.

  • رشته‌های متنی در پایتون باید داخل علامت نقل قول (”) یا (“”) قرار گیرند.
  • اگر در رشته متنی لازم باشد که خود علامت نقل قول نیز ظاهر شود، باید به همراه علامت \ این کار صورت گیرد.
  • اگر رشته متنی قرار است در چند خط ظاهر شود، هر قطعه را داخل علامت نقل قول قرار داده و بینشان از علامت n\ استفاده می‌کنیم. همچنین می‌توانید از علامت “”” به عنوان شروع و پایان عبارت متنی استفاده کرده و با علامت n\ خط بعدی را آغاز کنید.

hello python

در ادامه مثال‌هایی در این زمینه مورد بررسی قرار گرفته است.

*Create empty string object - single line.

begin program.
myString = '' #Create empty string
print myString #(Empty line)
print type(myString) #<type 'str'>
end program.

*Create multiple line string.

begin program.
begin program.
myString = """Here is my \n new line text."""
print myString
end program.


*Escape single quote in string.

begin program.
myString = 'I don\'t know!'
print myString #I don't know!
end program.

خروجی اجرای این قطعه کدها به صورت زیر خواهد بود.

*Create empty string object - single line.  
<type 'str'> 
 
*Create multiple line string. 
 Here is my 
 new line text. 
 
*Escape single quote in string. 
 I don't know!

همانطور که در خروجی این برنامه‌ها مشاهده خواهید کرد، در قسمت اول، فقط به تولید رشته خالی اختصاص یافته و قطعه کد دوم یک عبارت را در دو خط ایجاد می‌کند. توجه داشته باشید که از کد n\ برای رفتن به خط بعدی در عبارت متنی استفاده شده است. در قطعه کد سوم نیز با استفاده از علامت ‘\ باعث شده‌ایم که علامت نقل قول در خروجی ظاهر شود. در جدول زیر بعضی از توابع مربوط به تغییرات در رشته‌های متنی آورده شده است.

شرح کد مثال نتیجه
استخراج رشته [ ] myString[0] رشته متنی
ادغام دو رشته متنی + یا += myString + myString رشته متنی
استخراج محل یک متن از سمت چپ عبارت متنی find myString.find(‘a’) مقدار عددی
استخراج محل یک متن از سمت راست عبارت متنی rfind myString.rfind(‘a’) مقدار عددی
جایگزنی یک عبارت در یک رشته متنی replace myString.replace(‘a’,’b’) رشته متنی
تعیین طول رشته متنی len len(myString) مقدار عددی
تغییر رشته متنی به حروف کوچک لاتین lower ‍myString.lower() رشته متنی
تغییر رشته متنی به حروف بزرگ لاتین upper myString.upper() رشته متنی
تغییر رشته متنی به صورت حرف بزرگ در ابتدای جمله capitalize myString.capitalize() رشته متنی
حذف حروف از سمت چپ رشته متنی lstrip() myString.lstrip() رشته متنی
حذف حروف از سمت راست رشته متنی rstrip() myString.rstrip() رشته متنی
حذف حروف از سمت چپ و راست رشته متنی strip() myString.strip() رشته متنی
تبدیل رشته متنی از اعداد به ساختار عدد int int(myString) مقدار عددی
تبدیل رشته متنی به لیست پایتون split myString.split(‘ ‘) لیست
بررسی آغاز یک عبارت با رشته متنی داده شده startswith myString.startswith(“var”) منطقی
بررسی پایان یک عبارت با رشته متنی داده شده startswith myString.startswith(“var”) منطقی
اضافه کردن صفر به سمت چپ یک عبارت zfill myString.zfill(3) رشته متنی

در ادامه سعی می‌کنیم برای هر یک از این حالت‌ها مثال‌هایی بیاوریم.

 استخراج یک عبارت از رشته متنی در پایتون

همانطور که در جدول بالا اشاره شد، علامت [ ] وظیفه استخراج متن را به عهده دارد. در مثال‌های زیر از رشته متنی که درون متغیر myString وجود دارد، حروف یا عبارتی را خارج می‌کنیم. کدهای زیر به این منظور نوشته شده‌اند. درون علامت [ ]، موقعیت یا اندیسی که باید حرف استخراج شود را مشخص می‌کنیم.

*SPSS Python substring examples.

begin program.
myString = 'abcdefghij'
print myString[0] #a 
print myString[1:] #bcdefghij
print myString[:4] #abcd 
print myString[1:3] #bc 
print myString[-1] #j
end program.

همانطور که مشاهده شد، دستور مربوط به خط دوم، رشته متنی abcdefghij را در متغیر myString قرار داده است. در خطوط بعدی به ترتیب اولین حرف (a)، از دومین حرف تا آخرین حرف (bcdefghij)، از حرف دوم تا حرف چهارم (bc) و در انتها نیز از سمت راست اولین حرف (j) استخراج شده‌اند.

نکته: توجه کنید که اندیس‌ها در پایتون از صفر آغاز شده و صفر به معنی اولین عنصر است.

خروجی به صورت زیر خواهد بود:

a 
bcdefghij 
abcd 
bc 
j

ادغام دو رشته متنی

با استفاده از علامت + می‌توانیم دو رشته متنی را به یکدیگر ادغام کنیم. البته همانطور که دیده شد، از علامت =+ نیز می‌توانید به منظور پیوند رشته قبلی با رشته جدید استفاده کنید. برای مثال اگر ‘myString=’Hello باشد، دستورات زیر معادل هستند و هر دو عبارت Hello A را ایجاد می کنند.

myString = myString + ‘ A’

myString += ‘ A’

به قطعه کد زیر توجه کنید.

begin program.
myString='Hello'
myString1= myString+' A'
myString += ' A'
print myString
print myString1
end program.

خروجی این دستورات به صورت زیر خواهد بود.

Hello A 
Hello A

همچنین با استفاده از کدهای زیر رشته‌های متنی را در پایتون با یکدیگر ادغام کرده‌ایم.

*1. Concatenate with "+".

begin program.
myString = 'abc'
print myString + 'def' #abcdef
end program.

*2. Concatenate with "+="

begin program.
myString = 'abc'
for i in range(5):
    myString += str(i)
print myString #abc01234
end program.

با اجرای این کدها، در پنجره خروجی SPSS عبارت‌های زیر ظاهر خواهد شد.

begin program. 
myString = 'abc' 
print myString + 'def' #abcdef 
end program. 
abcdef 
 
*2. Concatenate with "+=" 
 
begin program. 
myString = 'abc' 
for i in range(5): 
    myString += str(i) 
print myString #abc01234 
end program. 
abc01234

در قسمت دوم از برنامه مشخص است که با استفاده از یک حلقه تکرار، رشته‌هایی از اعداد ۰ تا ۴ را به رشته متنی abc اضافه کرده‌ایم.

تعیین محل قرارگیری یک عبارت از رشته متنی

فرض کنید در یک رشته متنی می‌خواهیم محل قرارگیری یک عبارت را مشخص کنیم. تابع find این کار را به خوبی انجام می‌دهد. ولی باید توجه داشته باشید که چند نکته مهم در استفاده از این تابع وجود دارد.

  • شروع جستجو از سمت چپ عبارت متنی آغاز می‌شود.
  • در زبان برنامه نویسی پایتون حروف بزرگ و کوچک لاتین با یکدیگر تفاوت دارند و هنگام جستجو باید حروف ذکر شده با توجه به این موضوع در نظر گرفته شوند.
  • در پایتون آغاز اندیس از صفر است در نتیجه در توابعی که با اندیس سر و کار دارند، توجه به این نکته ضروری است.

به متنی که در تصویر زیر نوشته شده،‌ توجه کنید. مشخص است که حرف اول در این رشته، در اندیس صفر قرار گرفته است.

python-indices-string-characters

با توجه به عبارت متنی مربوط به تصویر بالا، کدهای زیر به منظور استخراج محل حرف  c و عبارت in به کار رفته است.

*Find leftmost occurrence of substring.

begin program.
myString = 'Cycling in the mountains is fun.'
print myString.find('c') # 2
print myString.find('in') # 4
end program.

همانطور که مشخص است خروجی این کد مقدار ۲ و ۴ خواهد بود.

نکته: اگر می‌خواهید همین عمل را از سمت راست انجام دهید بهتر است از تابع rfind استفاده کنید. کدی که در زیر مشاهده می‌کنید مرتبط با رشته متنی تصویر بالا و برای نمایش محل حرف i و عبارت in نوشته شده است.

*Find rightmost occurrence of substring.

begin program.
myString = 'Cycling in the mountains is fun.'
print myString.rfind('i') # 25
print myString.rfind('in') # 21
end program.

در خروجی با اجرای این کد،‌ مقدار ۲۵ و ۲۱ ظاهر می‌شود. توجه دارید که محل قرارگیری حروف و عبارت‌ها از سمت چپ مشخص شده است ولی اولین محل جستجو از سمت راست برای حرف i و in تعیین شده است. در ادامه به صورت فهرست‌وار به کدهایی اشاره می‌کنیم که برخی از عملیات روی رشته‌های متنی را انجام می‌‌دهند.

جایگزینی حروف در یک عبارت

*Replace one or more characters in string.

begin program.
myString = 'The cat caught the mouse in the living room.'
print myString.replace('a','') #The ct cught the mouse in the living room. 
print myString.replace('the','a') # The cat caught a mouse in a living room.
end program.

همانطور که مشخص است، این کد دو کار را انجام می‌دهد. جایگزینی حرف a درون یک رشته متنی با جای خالی (جایگزینی ۵ مورد) در نتیجه حذف حرف a و سپس جایگزینی همه عبارت‌های the با حرف a. نتیجه حاصل در خروجی به شکل زیر خواهد بود.

The ct cught the mouse in the living room. 
The cat caught a mouse in a living room.

تعیین طول رشته متنی

*Find length of string.

begin program.
myString = 'abcde'
print len(myString) # 5
end program.

مقدار نتیجه اجرای کد عدد ۵ است.

تبدیل حروف رشته متنی به حروف کوچک لاتین

*Lowercase string.

begin program.
myString = 'SPSS Is Fun!'
print myString.lower() # spss is fun!
end program.

نتیجه اجرا نمایش عبارت !spss is fun.

تبدیل رشته متنی به حروف بزرگ لاتین

*Uppercase string.

begin program.
myString = 'This is Some Title'
print myString.upper() # THIS IS SOME TITLE
end program.

نتیجه اجرا نمایش عبارت THIS IS SOME TITLE خواهد بود.

حذف حروف از سمت چپ یک رشته متنی

در پایتون تابع ()lstrip باعث حذف همه فاصله‌های خالی و علامت پرش در ابتدای یک عبارت متنی می‌شود. از آنجایی که در خروجی‌های SPSS ممکن است از این علامت‌ها برای تنظیم جانمایی عبارت‌های متنی استفاده شده باشد، بهره‌گیری از این تابع می‌تواند شما را به یک رشته متن خالص برساند. اگر حرف خاصی را می‌خواهید حذف کنید کافی است که آن حروف یا علامت را در داخل پرانتز به عنوان پارامتر تابع lstrip‌ وارد کنید.

*A. Remove whitespace from start of string.

begin program.
myString = '    left padding removed'
print myString.lstrip() # left padding removed
end program.

*B. Remove asterisks (*) from start of string.

begin program.
myString = '****left padding removed'
print myString.lstrip('*') # left padding removed
end program.

در قسمت اول (A)، فاصله‌های خالی اولیه در یک عبارت متنی حذف شده و در قسمت دوم کد (B) نیز علامت * از درون رشته متنی حذف می‌شود. البته خروجی در هر دو حالت برابر با left padding removed است.

حذف حروف از سمت راست یک رشته متنی

*A. Remove whitespace from end of string.

begin program.
myString = 'right padding removed    '
print myString.rstrip() # right padding removed
end program.

*B. Remove asterisks (*) from end of string.

begin program.
myString = 'right padding removed****'
print myString.rstrip('*') # right padding removed
end program.

حذف حروف از راست و چپ یک رشته متنی

*A. Remove whitespace from end of string.

begin program.
myString = '    left and right padding removed    '
print myString.strip() # left and right padding removed
end program.

*B. Remove asterisks (*) from end of string.

begin program.
myString = '****left and right padding removed****'
print myString.rstrip('*') # left and right padding removed
end program.

خروجی A:

left and right padding removed

خروجی B:

left and right padding removed

تبدیل رشته متنی از اعداد به ساختار عدد

*Convert String to Integer.

begin program.
myString = '123'
myInt = int(myString)
print type(myInt) # <type 'int'>
print myInt # 123
end program.

خروجی اجرای این کد رشته عددی 123خواهد بود.

تبدیل رشته متنی به لیست پایتون

*A. Split string into Python list object.

begin program.
myString = 'A A C A B C'
myList = myString.split(' ')
print type(myList) # <type 'list'>
print myList # ['A', 'A', 'C', 'A', 'B', 'C']
end program.

*B. Split string into Python list without separator.

begin program.
myString = 'AACABC'
myList = [i for i in myString]
print myList # ['A', 'A', 'C', 'A', 'B', 'C']
end program.

خروجی A:

<‘type ‘list>

[‘A’, ‘A’, ‘C’, ‘A’, ‘B’, ‘C’]

خروجی B:

[‘A’, ‘A’, ‘C’, ‘A’, ‘B’, ‘C’]

بررسی آغاز یک عبارت با رشته متنی داده شده

A. *Evaluate if string starts with given substring.

begin program.
myString = 'abcdef'
print myString.startswith('abc') # True
print myString.startswith('bcd') # False
end program.

B. *Typical use of startswith().

begin program.
if myString.startswith('a'):
    print "First character is 'a'."
else:
    print "First character is not 'a'."
end program.

خروجی A:

True

False

خروجی B:

.’First character is ‘a

نکته: خروجی این تابع یک مقدار منطقی است. بنابراین همانطور که دیده می‌شود، می‌توان از آن در تابع شرطی if استفاده کرد.

بررسی پایان یک عبارت با رشته متنی داده شده

*Evaluate if string ends with given substring.

begin program.
myString = 'abcdef'
print myString.endswith('f') # True
print myString.endswith('e') # False
end program.

خروجی:

True

False

اضافه کردن صفر به سمت چپ یک عبارت

*Left pad string with zeroes.

begin program.
myString = '1'
print myString.zfill(3) # 001
myString = '10'
print myString.zfill(3) # 010
end program.

در پایتون، تابع (3)zfill از سمت چپ به تعداد لازم صفر به یک رشته متنی اضافه می‌کند تا طول رشته، سه حرف شود.

خروجی:

001

010

پنج نکته مهم در کد نویسی پایتون

برنامه‌نویسی به زبان پایتون شامل مقرراتی است که شاید در زبان‌های برنامه نویسی دیگر وجود نداشته باشند. در این قسمت به معرفی این مقررات خواهیم پرداخت.

۱- استفاده از حروف بزرگ و کوچک لاتین

هنگام کد نویسی باید بین حروف بزرگ و کوچک تفاوت قائل شوید زیرا پایتون نیز به همین شکل عمل می‌کند. کدی که در ادامه دیده می‌شود، هنگام اجرا با خطا روبرو می‌شود زیرا دستوری به نام spssclient‌ وجود ندارد و باید آن را با املا صحیح SpssClient وارد کرد.

*Wrong casing for module.

begin program.
import spss,spssclient # ImportError: No module named spssclient
end program.

*Correct casing.

begin program.
import spss,SpssClient
end program.

*Wrong casing for attribute.

begin program.
import spssaux
sDict = spssaux.Variabledict() # AttributeError: 'module' object has no attribute 'Variabledict'
end program.

*Correct casing.

begin program.
import spssaux
sDict = spssaux.VariableDict()
end program.

پیغام خطای SPSS به صورت زیر است.

spss-python-import-error

2- رعایت فرورفتگی در کدها

در بسیاری از زبان‌های برنامه‌نویسی مانند HTML و PhP، قرار دادن فرورفتگی در ابتدای کدها و تراز دستورات اهمیتی ندارد. ولی در پایتون مقررات سختی برای این منظور وجود داشته و در صورت رعایت نکردن آن، دستورات قابل اجرا نخواهند بود.

در قطعه کدی که در ادامه مشاهده می‌کنید، در قسمت اول با توجه به فرورفتگی‌ها عبارت hello  و bye پنج بار تکرار شده ولی در قطعه کد دوم bye فقط یکبار ظاهر خواهد شد.

*Print "hello" and "bye" 5 times in loop.

begin program.
for i in range(5):
    print "hello"
    print "bye" #Indented so still in loop
end program.

*Print "hello" " 5 times in loop and "bye just once.

begin program.
for i in range(5):
    print "hello"
print "bye" #Not indented so loop has ended
end program.

3- یادداشت گذاری در کد

برای ثبت یادداشت در کدهای پایتونی که در محیط Syntax نوشته می‌شوند از علامت # استفاده کنید. در تصویر زیر این نحوه استفاده به خوبی دیده می‌شود.

spss-python-comments

4- چاپ نتایج در خروجی

در پایتون با توجه به نوع متغیر یا نتیجه‌ای که باید در خروجی ظاهر شود، بهتر است مقدار و نوع متغیری که قرار است در خروجی قرار گیرد را بوسیله دستور print ظاهر کنید. کدی که در زیر می‌بینید، بیانگر این عمل است.

*Look up value labels for job satisfaction.

begin program.
import spssaux
sDict = spssaux.VariableDict()
vallabs = sDict['job_satisfaction'].ValueLabels
print type(vallabs) # <type 'dict'> 
end program.

*Since vallabs = Python dict object, we can retrieve key-value pairs with iteritems() method.

begin program.
for key,val in vallabs.iteritems():
    print key,val
end program.

5- استفاده صحیح از علامت \

علامت \ در پایتون معنی خاصی دارد. همانطور که دیدید n\ به معنی چاپ عبارت متنی در خط بعدی است، در نتیجه اگر این کد در پنجره Syntax اجرا شود با خطا مواجه خواهیم شد.

somepath = ‘c:\newdata\data.sav’

در حالیکه اگر بخواهیم از قالب خالص متنی در این حالت استفاده کنیم بهتر است دستور زیر را به کار ببریم. حرف r به معنی RAW یا رشته متنی خام بوده و بدون در نظر گرفتن کدهای Escape عبارت به صورت متن خالص در نظر گرفته می‌شود.

somepath = r‘c:\newdata\data.sav’

کدی که در ادامه مشاهده می‌کنید به منظور نمایش نحوه استفاده از علامت \ نوشته شده است.

*Wrong way: \n indicates new line.

begin program.
somepath = 'c:\newdata\data.sav'
print somepath
end program.

*Right way: \n in raw string is just \n.

begin program.
somepath = r'c:\newdata\data.sav'
print somepath
end program.

*Wrong way: second quote ends string prematurely.

begin program.
print 'I don't know!'
end program.

*Right way: \ escapes second quote.

begin program.
print 'I don\'t know!'
end program.

خلاصه و جمع‌بندی

در این قسمت از دنباله نوشتارهای پایتون در SPSS، با توابعی که امکان تغییر متن را فراهم می‌آورند، آشنا شدیم. در قسمت بعدی به معرفی چند ابزار آماده‌ای که بوسیله کدهای پایتون برای نرم‌افزار SPSS تهیه شده، پرداخته و نحوه نصب و اجرای آن‌ها را فرا خواهیم گرفت.

اگر علاقه‌مند به یادگیری مباحث بیشتر در مورد SPSS و پایتون هستید، آموزش‌های زیر به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«آرمان ری‌بد» دکتری آمار در شاخه آمار ریاضی دارد. از علاقمندی‌های او، یادگیری ماشین، خوشه‌بندی و داده‌کاوی است و در حال حاضر نوشتارهای مربوط به آمار و یادگیری ماشین را در مجله فرادرس تهیه می‌کند.