انجام عملیات تکراری با پایتون در SPSS — راهنمای گام به گام
یکی از زبانهای پرطرفدار برای انجام محاسبات ریاضی در حوزه «علم داده» (Data Science) و «یادگیری ماشین» (Machine Learning)، پایتون است بطوری که در سالهای اخیر شاهد رشد بسیار زیاد استفاده کنندگان و پروژههای نوشته شده با زبان پایتون هستیم. به همین دلیل شرکت IBM که صاحب نرمافزار SPSS است، استفاده از این زبان برنامهنویسی را در این بسته محاسبات آماری گنجانده است. در این نوشتار به بررسی انجام عملیات تکراری با پایتون در SPSS میپردازیم. این متن قسمت دوم از دنباله مطالب مربوط به برنامهنویسی پایتون در SPSS است. فهرست زیر این مطالب را معرفی کرده است.
- قسمت اول: پایتون در SPSS – راهنمای گام به گام
- قسمت دوم: انجام عملیات تکراری با پایتون در SPSS – راهنمای گام به گام
- قسمت سوم: استفاده از افزونههای آماده پایتون در SPSS – راهنمای گام به گام
به عنوان پیشنیاز و برای آشنایی با محیط نرمافزار SPSS و کار با آن بهتر است مطلب پنجره ویرایشگر داده (Data Editor) در SPSS — راهنمای کاربردی و امکانات جدید SPSS نسخه 2۵ که باید آنها را بدانید را بخوانید. همچنین مطالعه قسمت اول از این مجموعه به نام پایتون در SPSS – راهنمای گام به گام و زبان برنامه نویسی پایتون (Python) — از صفر تا صد نیز خالی از لطف نیست. برای آشنایی بیشتر با نحوه برنامهنویسی به زبان پایتون بهتر است آموزشهای ویدئویی برنامهنویسی پایتون را نیز تهیه کنید.
انجام عملیات تکراری با پایتون در SPSS
در بسیاری از اوقات لازم است که کارهای تکراری در محیط SPSS انجام دهیم که شاید با استفاده از قابلیت Syntax امکانپذیر نباشند. در ادامه این متن، به بررسی حالتی در محیط SPSS میپردازیم که احتیاج به برنامهنویسی به زبان پایتون داریم. در ابتدا نحوه تغییرات روی رشتههای متنی در خروجیهای SPSS یعنی پنجره Output، بوسیله زبان برنامهنویسی پایتون را مورد بررسی قرار داده سپس نکاتی را متذکر میشویم که باید در زمان برنامهنویسی با این زبان رعایت کنیم.
کار با رشتههای متنی پایتون در محیط SPSS
یکی از موضوعاتی که در محیط SPSS مورد توجه است، نحوه انجام عملیات روی رشتههای متنی است. در این قسمت به بررسی نحوه عملکرد توابع پایتون روی رشتههای متنی میپردازیم. ابتدا قواعد پایه برای انجام عملیات روی رشتههای متنی در پایتون را مرور میکنیم.
- رشتههای متنی در پایتون باید داخل علامت نقل قول ('') یا ("") قرار گیرند.
- اگر در رشته متنی لازم باشد که خود علامت نقل قول نیز ظاهر شود، باید به همراه علامت \ این کار صورت گیرد.
- اگر رشته متنی قرار است در چند خط ظاهر شود، هر قطعه را داخل علامت نقل قول قرار داده و بینشان از علامت n\ استفاده میکنیم. همچنین میتوانید از علامت """ به عنوان شروع و پایان عبارت متنی استفاده کرده و با علامت n\ خط بعدی را آغاز کنید.
در ادامه مثالهایی در این زمینه مورد بررسی قرار گرفته است.
1*Create empty string object - single line.
2
3begin program.
4myString = '' #Create empty string
5print myString #(Empty line)
6print type(myString) #<type 'str'>
7end program.
8
9*Create multiple line string.
10
11begin program.
12begin program.
13myString = """Here is my \n new line text."""
14print myString
15end program.
16
17
18*Escape single quote in string.
19
20begin program.
21myString = 'I don\'t know!'
22print myString #I don't know!
23end program.
خروجی اجرای این قطعه کدها به صورت زیر خواهد بود.
1*Create empty string object - single line.
2<type 'str'>
3
4*Create multiple line string.
5 Here is my
6 new line text.
7
8*Escape single quote in string.
9 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 وجود دارد، حروف یا عبارتی را خارج میکنیم. کدهای زیر به این منظور نوشته شدهاند.
درون علامت [ ]، موقعیت یا اندیسی که باید حرف استخراج شود را مشخص میکنیم.
1*SPSS Python substring examples.
2
3begin program.
4myString = 'abcdefghij'
5print myString[0] #a
6print myString[1:] #bcdefghij
7print myString[:4] #abcd
8print myString[1:3] #bc
9print myString[-1] #j
10end program.
همانطور که مشاهده شد، دستور مربوط به خط دوم، رشته متنی abcdefghij را در متغیر myString قرار داده است. در خطوط بعدی به ترتیب اولین حرف (a)، از دومین حرف تا آخرین حرف (bcdefghij)، از حرف دوم تا حرف چهارم (bc) و در انتها نیز از سمت راست اولین حرف (j) استخراج شدهاند.
نکته: توجه کنید که اندیسها در پایتون از صفر آغاز شده و صفر به معنی اولین عنصر است.
خروجی به صورت زیر خواهد بود:
1a
2bcdefghij
3abcd
4bc
5j
ادغام دو رشته متنی
با استفاده از علامت + میتوانیم دو رشته متنی را به یکدیگر ادغام کنیم. البته همانطور که دیده شد، از علامت =+ نیز میتوانید به منظور پیوند رشته قبلی با رشته جدید استفاده کنید. برای مثال اگر 'myString='Hello باشد، دستورات زیر معادل هستند و هر دو عبارت Hello A را ایجاد می کنند.
myString = myString + ' A'
myString += ' A'
به قطعه کد زیر توجه کنید.
1begin program.
2myString='Hello'
3myString1= myString+' A'
4myString += ' A'
5print myString
6print myString1
7end program.
خروجی این دستورات به صورت زیر خواهد بود.
1Hello A
2Hello A
همچنین با استفاده از کدهای زیر رشتههای متنی را در پایتون با یکدیگر ادغام کردهایم.
1*1. Concatenate with "+".
2
3begin program.
4myString = 'abc'
5print myString + 'def' #abcdef
6end program.
7
8*2. Concatenate with "+="
9
10begin program.
11myString = 'abc'
12for i in range(5):
13 myString += str(i)
14print myString #abc01234
15end program.
با اجرای این کدها، در پنجره خروجی SPSS عبارتهای زیر ظاهر خواهد شد.
1begin program.
2myString = 'abc'
3print myString + 'def' #abcdef
4end program.
5<b>abcdef
6</b>
7*2. Concatenate with "+="
8
9begin program.
10myString = 'abc'
11for i in range(5):
12 myString += str(i)
13print myString #abc01234
14end program.
15<b>abc01234</b>
در قسمت دوم از برنامه مشخص است که با استفاده از یک حلقه تکرار، رشتههایی از اعداد ۰ تا ۴ را به رشته متنی abc اضافه کردهایم.
تعیین محل قرارگیری یک عبارت از رشته متنی
فرض کنید در یک رشته متنی میخواهیم محل قرارگیری یک عبارت را مشخص کنیم. تابع find این کار را به خوبی انجام میدهد. ولی باید توجه داشته باشید که چند نکته مهم در استفاده از این تابع وجود دارد.
- شروع جستجو از سمت چپ عبارت متنی آغاز میشود.
- در زبان برنامه نویسی پایتون حروف بزرگ و کوچک لاتین با یکدیگر تفاوت دارند و هنگام جستجو باید حروف ذکر شده با توجه به این موضوع در نظر گرفته شوند.
- در پایتون آغاز اندیس از صفر است در نتیجه در توابعی که با اندیس سر و کار دارند، توجه به این نکته ضروری است.
به متنی که در تصویر زیر نوشته شده، توجه کنید. مشخص است که حرف اول در این رشته، در اندیس صفر قرار گرفته است.
با توجه به عبارت متنی مربوط به تصویر بالا، کدهای زیر به منظور استخراج محل حرف c و عبارت in به کار رفته است.
1*Find leftmost occurrence of substring.
2
3begin program.
4myString = 'Cycling in the mountains is fun.'
5print myString.find('c') # 2
6print myString.find('in') # 4
7end program.
همانطور که مشخص است خروجی این کد مقدار ۲ و ۴ خواهد بود.
نکته: اگر میخواهید همین عمل را از سمت راست انجام دهید بهتر است از تابع rfind استفاده کنید. کدی که در زیر مشاهده میکنید مرتبط با رشته متنی تصویر بالا و برای نمایش محل حرف i و عبارت in نوشته شده است.
1*Find rightmost occurrence of substring.
2
3begin program.
4myString = 'Cycling in the mountains is fun.'
5print myString.rfind('i') # 25
6print myString.rfind('in') # 21
7end program.
در خروجی با اجرای این کد، مقدار ۲۵ و ۲۱ ظاهر میشود. توجه دارید که محل قرارگیری حروف و عبارتها از سمت چپ مشخص شده است ولی اولین محل جستجو از سمت راست برای حرف i و in تعیین شده است. در ادامه به صورت فهرستوار به کدهایی اشاره میکنیم که برخی از عملیات روی رشتههای متنی را انجام میدهند.
جایگزینی حروف در یک عبارت
1*Replace one or more characters in string.
2
3begin program.
4myString = 'The cat caught the mouse in the living room.'
5print myString.replace('a','') #The ct cught the mouse in the living room.
6print myString.replace('the','a') # The cat caught a mouse in a living room.
7end program.
همانطور که مشخص است، این کد دو کار را انجام میدهد. جایگزینی حرف a درون یک رشته متنی با جای خالی (جایگزینی ۵ مورد) در نتیجه حذف حرف a و سپس جایگزینی همه عبارتهای the با حرف a. نتیجه حاصل در خروجی به شکل زیر خواهد بود.
1The ct cught the mouse in the living room.
2The cat caught a mouse in a living room.
تعیین طول رشته متنی
1*Find length of string.
2
3begin program.
4myString = 'abcde'
5print len(myString) # 5
6end program.
مقدار نتیجه اجرای کد عدد ۵ است.
تبدیل حروف رشته متنی به حروف کوچک لاتین
1*Lowercase string.
2
3begin program.
4myString = 'SPSS Is Fun!'
5print myString.lower() # spss is fun!
6end program.
نتیجه اجرا نمایش عبارت !spss is fun.
تبدیل رشته متنی به حروف بزرگ لاتین
1*Uppercase string.
2
3begin program.
4myString = 'This is Some Title'
5print myString.upper() # THIS IS SOME TITLE
6end program.
نتیجه اجرا نمایش عبارت THIS IS SOME TITLE خواهد بود.
حذف حروف از سمت چپ یک رشته متنی
در پایتون تابع ()lstrip باعث حذف همه فاصلههای خالی و علامت پرش در ابتدای یک عبارت متنی میشود. از آنجایی که در خروجیهای SPSS ممکن است از این علامتها برای تنظیم جانمایی عبارتهای متنی استفاده شده باشد، بهرهگیری از این تابع میتواند شما را به یک رشته متن خالص برساند.
اگر حرف خاصی را میخواهید حذف کنید کافی است که آن حروف یا علامت را در داخل پرانتز به عنوان پارامتر تابع lstrip وارد کنید.
1*A. Remove whitespace from start of string.
2
3begin program.
4myString = ' left padding removed'
5print myString.lstrip() # left padding removed
6end program.
7
8*B. Remove asterisks (*) from start of string.
9
10begin program.
11myString = '****left padding removed'
12print myString.lstrip('*') # left padding removed
13end program.
در قسمت اول (A)، فاصلههای خالی اولیه در یک عبارت متنی حذف شده و در قسمت دوم کد (B) نیز علامت * از درون رشته متنی حذف میشود. البته خروجی در هر دو حالت برابر با left padding removed است.
حذف حروف از سمت راست یک رشته متنی
1*A. Remove whitespace from end of string.
2
3begin program.
4myString = 'right padding removed '
5print myString.rstrip() # right padding removed
6end program.
7
8*B. Remove asterisks (*) from end of string.
9
10begin program.
11myString = 'right padding removed****'
12print myString.rstrip('*') # right padding removed
13end program.
حذف حروف از راست و چپ یک رشته متنی
1*A. Remove whitespace from end of string.
2
3begin program.
4myString = ' left and right padding removed '
5print myString.strip() # left and right padding removed
6end program.
7
8*B. Remove asterisks (*) from end of string.
9
10begin program.
11myString = '****left and right padding removed****'
12print myString.rstrip('*') # left and right padding removed
13end program.
خروجی A:
left and right padding removed
خروجی B:
left and right padding removed
تبدیل رشته متنی از اعداد به ساختار عدد
1*Convert String to Integer.
2
3begin program.
4myString = '123'
5myInt = int(myString)
6print type(myInt) # <type 'int'>
7print myInt # 123
8end program.
خروجی اجرای این کد رشته عددی 123خواهد بود.
تبدیل رشته متنی به لیست پایتون
1*A. Split string into Python list object.
2
3begin program.
4myString = 'A A C A B C'
5myList = myString.split(' ')
6print type(myList) # <type 'list'>
7print myList # ['A', 'A', 'C', 'A', 'B', 'C']
8end program.
9
10*B. Split string into Python list without separator.
11
12begin program.
13myString = 'AACABC'
14myList = [i for i in myString]
15print myList # ['A', 'A', 'C', 'A', 'B', 'C']
16end program.
خروجی A:
<'type 'list>
['A', 'A', 'C', 'A', 'B', 'C']
خروجی B:
['A', 'A', 'C', 'A', 'B', 'C']
بررسی آغاز یک عبارت با رشته متنی داده شده
1A. *Evaluate if string starts with given substring.
2
3begin program.
4myString = 'abcdef'
5print myString.startswith('abc') # True
6print myString.startswith('bcd') # False
7end program.
8
9B. *Typical use of startswith().
10
11begin program.
12if myString.startswith('a'):
13 print "First character is 'a'."
14else:
15 print "First character is not 'a'."
16end program.
خروجی A:
True
False
خروجی B:
.'First character is 'a
نکته: خروجی این تابع یک مقدار منطقی است. بنابراین همانطور که دیده میشود، میتوان از آن در تابع شرطی if استفاده کرد.
بررسی پایان یک عبارت با رشته متنی داده شده
1*Evaluate if string ends with given substring.
2
3begin program.
4myString = 'abcdef'
5print myString.endswith('f') # True
6print myString.endswith('e') # False
7end program.
خروجی:
True
False
اضافه کردن صفر به سمت چپ یک عبارت
1*Left pad string with zeroes.
2
3begin program.
4myString = '1'
5print myString.zfill(3) # 001
6myString = '10'
7print myString.zfill(3) # 010
8end program.
در پایتون، تابع (3)zfill از سمت چپ به تعداد لازم صفر به یک رشته متنی اضافه میکند تا طول رشته، سه حرف شود.
خروجی:
001
010
پنج نکته مهم در کد نویسی پایتون
برنامهنویسی به زبان پایتون شامل مقرراتی است که شاید در زبانهای برنامه نویسی دیگر وجود نداشته باشند. در این قسمت به معرفی این مقررات خواهیم پرداخت.
۱- استفاده از حروف بزرگ و کوچک لاتین
هنگام کد نویسی باید بین حروف بزرگ و کوچک تفاوت قائل شوید زیرا پایتون نیز به همین شکل عمل میکند. کدی که در ادامه دیده میشود، هنگام اجرا با خطا روبرو میشود زیرا دستوری به نام spssclient وجود ندارد و باید آن را با املا صحیح SpssClient وارد کرد.
1*Wrong casing for module.
2
3begin program.
4import spss,spssclient # ImportError: No module named spssclient
5end program.
6
7*Correct casing.
8
9begin program.
10import spss,SpssClient
11end program.
12
13*Wrong casing for attribute.
14
15begin program.
16import spssaux
17sDict = spssaux.Variabledict() # AttributeError: 'module' object has no attribute 'Variabledict'
18end program.
19
20*Correct casing.
21
22begin program.
23import spssaux
24sDict = spssaux.VariableDict()
25end program.
پیغام خطای SPSS به صورت زیر است.
2- رعایت فرورفتگی در کدها
در بسیاری از زبانهای برنامهنویسی مانند HTML و PhP، قرار دادن فرورفتگی در ابتدای کدها و تراز دستورات اهمیتی ندارد. ولی در پایتون مقررات سختی برای این منظور وجود داشته و در صورت رعایت نکردن آن، دستورات قابل اجرا نخواهند بود.
در قطعه کدی که در ادامه مشاهده میکنید، در قسمت اول با توجه به فرورفتگیها عبارت hello و bye پنج بار تکرار شده ولی در قطعه کد دوم bye فقط یکبار ظاهر خواهد شد.
1*Print "hello" and "bye" 5 times in loop.
2
3begin program.
4for i in range(5):
5 print "hello"
6 print "bye" #Indented so still in loop
7end program.
8
9*Print "hello" " 5 times in loop and "bye just once.
10
11begin program.
12for i in range(5):
13 print "hello"
14print "bye" #Not indented so loop has ended
15end program.
3- یادداشت گذاری در کد
برای ثبت یادداشت در کدهای پایتونی که در محیط Syntax نوشته میشوند از علامت # استفاده کنید. در تصویر زیر این نحوه استفاده به خوبی دیده میشود.
4- چاپ نتایج در خروجی
در پایتون با توجه به نوع متغیر یا نتیجهای که باید در خروجی ظاهر شود، بهتر است مقدار و نوع متغیری که قرار است در خروجی قرار گیرد را بوسیله دستور print ظاهر کنید. کدی که در زیر میبینید، بیانگر این عمل است.
1*Look up value labels for job satisfaction.
2
3begin program.
4import spssaux
5sDict = spssaux.VariableDict()
6vallabs = sDict['job_satisfaction'].ValueLabels
7print type(vallabs) # <type 'dict'>
8end program.
9
10*Since vallabs = Python dict object, we can retrieve key-value pairs with iteritems() method.
11
12begin program.
13for key,val in vallabs.iteritems():
14 print key,val
15end program.
5- استفاده صحیح از علامت \
علامت \ در پایتون معنی خاصی دارد. همانطور که دیدید n\ به معنی چاپ عبارت متنی در خط بعدی است، در نتیجه اگر این کد در پنجره Syntax اجرا شود با خطا مواجه خواهیم شد.
somepath = 'c:\newdata\data.sav'
در حالیکه اگر بخواهیم از قالب خالص متنی در این حالت استفاده کنیم بهتر است دستور زیر را به کار ببریم. حرف r به معنی RAW یا رشته متنی خام بوده و بدون در نظر گرفتن کدهای Escape عبارت به صورت متن خالص در نظر گرفته میشود.
somepath = r'c:\newdata\data.sav'
کدی که در ادامه مشاهده میکنید به منظور نمایش نحوه استفاده از علامت \ نوشته شده است.
1*Wrong way: \n indicates new line.
2
3begin program.
4somepath = 'c:\newdata\data.sav'
5print somepath
6end program.
7
8*Right way: \n in raw string is just \n.
9
10begin program.
11somepath = r'c:\newdata\data.sav'
12print somepath
13end program.
14
15*Wrong way: second quote ends string prematurely.
16
17begin program.
18print 'I don't know!'
19end program.
20
21*Right way: \ escapes second quote.
22
23begin program.
24print 'I don\'t know!'
25end program.
خلاصه و جمعبندی
در این قسمت از دنباله نوشتارهای پایتون در SPSS، با توابعی که امکان تغییر متن را فراهم میآورند، آشنا شدیم. در قسمت بعدی به معرفی چند ابزار آمادهای که بوسیله کدهای پایتون برای نرمافزار SPSS تهیه شده، پرداخته و نحوه نصب و اجرای آنها را فرا خواهیم گرفت.
اگر علاقهمند به یادگیری مباحث بیشتر در مورد SPSS و پایتون هستید، آموزشهای زیر به شما پیشنهاد میشوند:
- مجموعه آموزش های آمار و احتمالات
- آموزش های نرم افزار آماری SPSS
- مجموعه آموزشهای برنامهنویسی پایتون
- آموزش آماده سازی داده ها برای تحلیل آماری در SPSS
- پنجره ویرایشگر داده (Data Editor) در SPSS — راهنمای کاربردی
- امکانات جدید SPSS نسخه 2۵ که باید آنها را بدانید
^^