1. درباره ی این دوره#

“ پایتون به قدری پیشرفت کرده و به سلاحی قدرتمند تبدیل شده است که دیگر نیازی به استفاده از R نداریم. طرفداران R، ببخشید؛ خود من هم زمانی یکی از شما بودم، اما دیگر به سراغ R نمی روم.” – کریس ویگینس

1.1. مقدمه#

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

در این درس:

  • پایتون را معرفی خواهیم کرد

  • برخی از ویژگی های پایتون را نشان خواهیم داد

  • توضیح می دهیم که چرا پایتون زبان محبوب ما برای محاسبات علمی است

  • و شما را به ادامه ی مسیر و اهدافتان تشویق می کنیم.

همچنین شما نیازی به درک همه ی مواردی که در این درس خواهید دید، ندارید؛ زیرا در ادامه ی دروس تمامی جزئیات را آموزش خواهیم داد.

1.1.1. آیا نمیتوانم فقط از مدل های زبانی بزرگ (LLM) استفاده کنم؟#

خیر!

البته که وسوسه انگیز است که در عصر هوش مصنوعی فکر کنیم دیگر لازم نیست کد نویسی یاد بگیریم.

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

اما هوش مصنوعی نمی تواند سوالات جدیدی را که قبلا ندیده است به طور کامل و قابل اعتماد حل کند.

بنابراین شما نیاز خواهید داشت تا به‌ عنوان یک ناظر بتوانید کد ها رابخوانید، بنویسید و درک کنید.

با این حال، یک مدل زبانی بزرگ (LLM) خوب میتواند هراه مفیدی برای دنبال کردن این درس ها باشد؛ میتوانید بخشی از کدهای این درس را کپی کنید و ازآنها بخواهید برایتان توضیح دهند.

1.1.2. آیا Matlab بهتر نیست؟#

نه! نه و هزاران بار نه!

نیروانا گروه بزرگی بود (و ساوندگاردن حتی بهتر بود) اما وقت آن است که از دهه 90 عبور کنیم.

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

این موضوع به ویژه در حوزه های به سرعت در حال رشد، مانند یادگیری عمیق (Deep Learning) و یادگیری تقویتی(Reinforcement Learning) صادق است.

علاوه بر این، تمام مدل های زبانی بزرگ (LLM) اصلی در نوشتن کد پایتون مهارت بسیار بیشتری نسبت به کد متلب دارند.

ما در طول این سری از دروس و همچنین در سرس بعدی در مورد JAX، به بحث در مورد مزایای نسبی کتابخانه های پایتون خواهیم پرداخت.

1.2. برنامه نویسی پایتون چیست؟#

پایتون یک زبان برنامه نویسی همه منظوره است که در سال 1989 توسط خیدو فان روسوم ابداع شد.

پایتون رایگان و متن باز است و توسعه ی آن از طریق بنیاد نرم افزار پایتون انجام می شود.

این موضوع مهم است زیرا:

  • پولمان را پس انداز می کند

  • به جای یک شرکت انتفاعی، توسط جامعه ی کاربران کنترل می شود

  • و قابلیت بازتولید و علم باز را تشویق می کند.

1.2.1. کاربردهای رایج پایتون#

پایتون یک زبان همه منظوره است که تقریبا در همه ی حوزه های کاربردی از جمله موارد زیر استفاده می شود:

  • هوش مصنوعی و علوم کامپیوتر

  • محاسبات علمی

  • ارتباطات

  • توسعه ی وب

  • رابط های کاربری گرافیکی (GUI) و پردازش تصویر (CGI)

  • توسعه ی بازی

  • برنامه ریزی منابع سازمانی

  • محتوای چندرسانه ای

  • و غیره.

همچنین بطور گسترده ای توسط شرکت های زیر و بسیاری دیگر از شرکت ها مورد استفاده و پشتیبانی قرار می گیرد:

1.2.2. جایگاه محبوبیت#

بدون شک، پایتون یکی از محبوب ترین زبان های برنامه نویسی است و کتابخانه های پایتون مانند pandas و Polars جایگزین ابزارهای آشنایی همچون Excel و VBA هستند که به عنوان یک مهارت ضروری در زمینه های مالی و بانکی محسوب می شوند.

علاوه براین، پایتون در جامعه ی علمی - به ویژه هوش مصنوعی – بسیار محبوب است؛ نمودار زیر که با استفاده از آمارهای وبسایت استک اورفلو تهیه شده، شواهدی از این امر را نشان می دهد.

این تصویر نسبت محبوبیت یک کتابخانه ی هوش مصنوعی پایتون با نام PyTorch به MATLAB را نشان می دهد.

مقایسه متلب و پایتون

نمودار نشان می دهد که با رشد سریع PyTorch محبوبیت MATLAB در حال کمرنگ شدن است. علاوه براین، PyTorch تنها یکی از هزاران کتابخانه های در دسترس پایتون برای محاسبات علمی است.

1.2.3. ویژگی ها#

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

پایتون انعطاف پذیر و عمل گرا است و از چندین الگوی برنامه نویسی (مثل برنامه نویسی رویه ای، شیء گرا، تابع محور و غیره.) پشتیبانی می کند.

1.2.4. نحو و طراحی#

یکی از دلایل محبوبیت پایتون، طراحی ساده و ظریف آن است.

برای بهتر درک کردن این موضوع، اجازه دهید به یک مثال نگاهی بیاندازیم.

کد زیر به جای پایتون با Java نوشته شده است.

شما نیازی به خواندن و درک کد جاوا ندارید!

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class CSVReader {
    public static void main(String[] args) {
        String filePath = "data.csv"; 
        String line;
        String splitBy = ",";
        int columnIndex = 1; 
        double sum = 0;
        int count = 0;

        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            while ((line = br.readLine()) != null) {
                String[] values = line.split(splitBy);
                if (values.length > columnIndex) {
                    try {
                        double value = Double.parseDouble(
                            values[columnIndex]
                        );
                        sum += value;
                        count++;
                    } catch (NumberFormatException e) {
                        System.out.println(
                            "Skipping non-numeric value: " + 
                            values[columnIndex]
                        );
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (count > 0) {
            double average = sum / count;
            System.out.println(
                "Average of the second column: " + average
            );
        } else {
            System.out.println(
                "No valid numeric data found in the second column."
            );
        }
    }
}

قرار است کد جاوا یک فایل پیش فرض به نام data.csv باز کند و میانگین مقادیر را در ستون دوم محاسبه کند. طبق آنچه در زیر می بینید، حتی بدون دانستن جاوا می توانید متوجه شوید که کد طولانی و پیچیده ای است.

حال به کد پایتون برای همان دستور را ببینید، حتی اگر هنوز چیزی از پایتون نمی دانید، می توانید ببینید که کد پایتون ساده تر و خواندن آن آسان تر است. به همین علت سادگی پایتون و طراحی منظم آن است که باعث گسترش محبوبیت این زبان برنامه نویسی شده است.

import csv

total, count = 0, 0
with open('data.csv', mode='r') as file:
    reader = csv.reader(file)
    for row in reader:
        try:
            total += float(row[1])
            count += 1
        except (ValueError, IndexError):
            pass
print(f"Average: {total / count if count else 'No valid data'}")

1.2.5. ارتباط با هوش مصنوعی#

هوش مصنوعی در حال تحول و جایگزینی بسیاری از وظایفی است که هم اکنون توسط انسان ها انجام می شود، دقیقا همانگونه که دیگر اشکال فناوری و ماشین آلات در طی قرون گذشته این روند را طی کرده اند.

پایتون نیز نقش بزرگی را در پیشرفت هوش مصنوعی و یادگیری ماشین ایفا می کند و این بدان معناست که شرکت های فناوری، در حال سرمایه گذاری بر روی توسعه ی کتابخانه های بسیار قدرتمند پایتون هستند. بنابراین حتی اگر قصد ندارید روی هوش مصنوعی و یادگیری ماشین کار کنید، می توانید از یادگیری بهره مند شده و از برخی از این کتابخانه ها برای پروژه های خود در اقتصاد، مالی و همچنین سایر علوم استفاده کنید؛ که این دوره چگونگی این کار را توضیح خواهد داد.

1.3. برنامه نویسی علمی با پایتون#

پیش تر درباره ی اهمیت پایتون در هوش مصنوعی، یادگیری ماشین و علم داده صحبت کرده ایم. حال بیاید به نقش پایتون در سایر زمینه های محاسبات علمی نگاهی بیاندازیم.

پایتون یک بازیکن اصلی در علومی چون نجوم، شیمی، زیست شناسی محاسباتی، هواشناسی، پردازش زبان طبیعی و… است. همچنین استفاده از پایتون در اقتصاد، امور مالی و زمینه های مرتبط آن مانند تحقیق در عملیات -که قبلا تحت سلطه ی برنامه هایی چون متلب، اکسل، استتا، C و فورترن بود- درحال گسترش است.

در ادامه به طور مختصر چند نمونه از استفاده ی پایتون را برای برنامه نویسی علمی نشان می ذهیم.

1.3.1. NumPy#

یکی از مهم ترین بخش های محاسبات علمی کار با داده است. داده ها اغلب در ماتریس ها، بردارها و آرایه ها ذخیره می شوند و ما میتوانیم یک آرایه ی ساده از اعداد را با پایتون خالص به صورت زیر ایجاد کنیم:

a = [-3.14, 0, 3.14]                    # A Python list
a
[-3.14, 0, 3.14]

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

برای پایتون، مهمترین کتابخانه ی پردازش ماتریس و آرایه، کتابخانه NumPy است. به عنوان مثال بیاید یک آرایه با 100 عنصر را با NumPy بسازیم:

import numpy as np                     # Load the library

a = np.linspace(-np.pi, np.pi, 100)    # Create even grid from -π to π
a
array([-3.14159265, -3.07812614, -3.01465962, -2.9511931 , -2.88772658,
       -2.82426006, -2.76079354, -2.69732703, -2.63386051, -2.57039399,
       -2.50692747, -2.44346095, -2.37999443, -2.31652792, -2.2530614 ,
       -2.18959488, -2.12612836, -2.06266184, -1.99919533, -1.93572881,
       -1.87226229, -1.80879577, -1.74532925, -1.68186273, -1.61839622,
       -1.5549297 , -1.49146318, -1.42799666, -1.36453014, -1.30106362,
       -1.23759711, -1.17413059, -1.11066407, -1.04719755, -0.98373103,
       -0.92026451, -0.856798  , -0.79333148, -0.72986496, -0.66639844,
       -0.60293192, -0.53946541, -0.47599889, -0.41253237, -0.34906585,
       -0.28559933, -0.22213281, -0.1586663 , -0.09519978, -0.03173326,
        0.03173326,  0.09519978,  0.1586663 ,  0.22213281,  0.28559933,
        0.34906585,  0.41253237,  0.47599889,  0.53946541,  0.60293192,
        0.66639844,  0.72986496,  0.79333148,  0.856798  ,  0.92026451,
        0.98373103,  1.04719755,  1.11066407,  1.17413059,  1.23759711,
        1.30106362,  1.36453014,  1.42799666,  1.49146318,  1.5549297 ,
        1.61839622,  1.68186273,  1.74532925,  1.80879577,  1.87226229,
        1.93572881,  1.99919533,  2.06266184,  2.12612836,  2.18959488,
        2.2530614 ,  2.31652792,  2.37999443,  2.44346095,  2.50692747,
        2.57039399,  2.63386051,  2.69732703,  2.76079354,  2.82426006,
        2.88772658,  2.9511931 ,  3.01465962,  3.07812614,  3.14159265])

حالا بیاید این آرایه را با اعمال توابع تبدیل کنیم:

b = np.cos(a)                          # Apply cosine to each element of a
c = np.sin(a)                          # Apply sin to each element of a

و حالا میتوانیم به راحتی حاصل ضرب اسکالر b و c را بدست بیاوریم:

b @ c
np.float64(9.853229343548264e-16)

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

1.3.2. جایگزین های NumPy#

درحالیکه هنوز سلطان پردازش آرایه ها در پایتون NumPy است، اما اکنون رقبای جدیدی نیز دارد؛ کتابخانه هایی مانند CuPy، Pytorch، JAX نیز انواع آرایه ها و عملیات آرایه ای را تعبیه کرده اند و می توانند بسیار سریع و کارآمد باشند. همانطور که بعدا در این مجموعه توضیح خواهیم داد؛ در واقع این کتابخانه ها در استفاده از پردازش موازی و سخت افزار سریع، بهتر هستند. با این حال، شما هنوز هم باید ابتدا NumPy را یاد بگیرید، زیرا؛ ساده تر است و یک پایه ی قوی را فراهم می کند، به طور مستقیم عملکرد کتابخانه هایی مانند JAX را گسترش می دهد و از اینرو وقتی NumPy را می شناسید، یادگیری آن را نیز آسان تر می کند.

1.3.3. SciPy#

کتابخانه SciPy بر روی NumPy ساخته شده است و قابلیت های اضافی را ارائه می دهد.

برای مثال بیاید حساب کنیم جاییکه 2 2 ϕ ( z ) d z دارای توزیع نرمال استاندارد است:

from scipy.stats import norm
from scipy.integrate import quad

ϕ = norm()
value, error = quad(ϕ.pdf, -2, 2) # Integrate using Gaussian quadrature
value
0.9544997361036417

کتابخانه ی SciPy شامل بسیاری از امور استاندارد کاربردی مانند جبرخطی، انتگرال گیری، درون یابی، بهینه سازی، توزیع ها و تکنیک های آماری و پردازش سیگنال است که می توانید همه ی آنها را اینجا ببینید.

بعدا SciPy را با جزئیات بیشتری توضیح خواهیم داد.

1.3.4. گرافیک#

نقطه ی قوت اصلی پایتون تجسم داده ها است. محبوب ترین و جامع ترین کتابخانه ی پایتون برای ایجاد شکل ها و نمودارها Matplotlib است که شامل قابلیت های ایجاد تصاویر نمودارها، هیستوگرام ها، سطوح کانتور، نمودارهای سه بعدی، نمودارهای میله ای و… بوده و می تواند خروجی ها را در قالب های مختلف مانند (PDF، PNG، EPS و…) ارائه دهد و همچنین قابلیت ادغام LaTex را نیز دارد.

آنچه در ادامه می بینید مثال هایی از این کتابخانه هستند:

نمونه طرح دو بعدی

نمونه طرح دو بعدی با حاشیه نویسی لاتکس تعبیه شده

نمونه طرح سه بعدی

نمونه طرح سه بعدی

نمونه طرح کانتور

نمونه طرح کانتور

همچنین می توانید نمونه های بیشتری را در گالری تصاویر Matplotlib بیابید.

سایر کتابخانه های گرافیکی عبارتند از:

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

1.3.5. شبکه ها و نمودارها#

مطالعه ی شبکه ها و نمودارها بخش مهمی از کار علمی در اقتصاد، مالی و سایر زمینه ها است؛ به عنوان مثال، ما به مطالعه ی مواردی چون شبکه های تولید، شبکه های بانکی و موسسات مالی، شبکه های اجتماعی و… علاقه مند هستیم.

پایتون نیز کتابخانه های زیادی برای مطالعه ی شبکه ها و نمودارها دارد. یکی از معروف ترین این کتابخانه ها NetworkX است که از جمله ویژگی های آن داشتن الگوریتم های استاندارد گراف برای تحلیل شبکه ها و فرآیندهای مربوط به نمایش نمودارها است.

در زیر نمونه ای از کد آورده شده است که یک گراف تصادفی ایجاد و رسم می کند که رنگ گره ها براساس طول کوتاه ترین مسیر از یک گره ی مرکزی مشخص تعیین می شود.

import networkx as nx
import matplotlib.pyplot as plt
np.random.seed(1234)

# Generate a random graph
p = dict((i, (np.random.uniform(0, 1), np.random.uniform(0, 1)))
         for i in range(200))
g = nx.random_geometric_graph(200, 0.12, pos=p)
pos = nx.get_node_attributes(g, 'pos')

# Find node nearest the center point (0.5, 0.5)
dists = [(x - 0.5)**2 + (y - 0.5)**2 for x, y in list(pos.values())]
ncenter = np.argmin(dists)

# Plot graph, coloring by path length from central node
p = nx.single_source_shortest_path_length(g, ncenter)
plt.figure()
nx.draw_networkx_edges(g, pos, alpha=0.4)
nx.draw_networkx_nodes(g,
                       pos,
                       nodelist=list(p.keys()),
                       node_size=120, alpha=0.5,
                       node_color=list(p.values()),
                       cmap=plt.cm.jet_r)
plt.show()
_images/f4b18fbbe70fe747610f22b479921e01da47ce4388ef659cce95a632ea864e1d.png

1.3.6. سایرکتابخانه های علمی#

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

در اینجا فهرست کوتاهی از چند کتابخانه ی علمی مهم برای پایتون که پیشتر نگفتیم برایتان آورده ایم:

  • SymPy: برای جبر نمادین، از جمله محاسبه ی حد، مشتق و انتگرال

  • statsmodels: برای توابع آماری

  • scikit-learn: برای یادگیری ماشین

  • Keras: برای یادگیری ماشین

  • Pyro و PyStan: برای تحلیل داده های بیزی

  • GeoPandas: برای تحلیل داده های مکانی

  • Dask: برای پردازش موازی

  • Numba: اجرای پایتون با سرعت برابر با کدهای سطح پایین قابل اجرا توسط سخت افزار

  • CVXPY: برای بهینه سازی محدب

  • scikit-image و OpenCV: برای پردازش و تحلیل داده های تصویری

  • BeautifulSoup: XML و HTML برای استخراج داده ها از فایل های

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