در این مثال، نحوه استفاده از روش Chow-Lin برای درون یابی یک سری زمانی با فرکانس پایین (در اینجا سالانه) به یک سری با فرکانس بالاتر (در اینجا فصلی) با استفاده از یک سری فصلی به عنوان indicator نشان داده می شود.

این مثال به ترتیب از مراحل زیر پیروی می‌کند:

1. **آماده‌سازی داده‌ها در Python**: در این مرحله، دو سری زمانی ساخته می‌شود. سری "benchmark" یک سری سالانه است و سری "indicator" یک سری فصلی است.

2. **انتقال داده به EViews**: با استفاده از کتابخانه `pyeviews`، داده‌های ساخته شده در Python به EViews منتقل می‌شوند.

3. **انجام عملیات‌ها در EViews**: در EViews، سری "benchmark" از صفحه با فرکانس سالانه به صفحه با فرکانس فصلی منتقل می‌شود. در این فرآیند، سری "indicator" به عنوان indicator فصلی استفاده می‌شود. سری جدید "benchmarked" حاصل می‌شود که نشان‌دهنده سری درون یابی شده است.

4. **بازیابی داده از EViews به Python**: سری درون یابی شده "benchmarked" از EViews به Python بازگردانده می‌شود.

5. **نمایش داده‌ها**: در نهایت، با استفاده از کتابخانه `matplotlib`، همه سری‌های زمانی (سری اصلی، indicator فصلی و سری درون یابی شده) نمایش داده می‌شوند تا بتوانید نحوه عملکرد درون یابی را مشاهده کنید.

در واقع، هدف این مثال نشان دادن نحوه ترکیب امکانات Python و EViews برای انجام عملیات‌های تحلیل سری‌های زمانی و درون یابی است.

نکته1:
درون یابی یک روش ریاضیاتی است که با استفاده از آن می‌توان مقادیر یک تابع در بازه‌هایی که مقادیر آن‌ها مشخص نیست، تخمین زد. به عبارت دیگر، درون یابی به ما کمک می‌کند تا بر اساس مجموعه‌ای از نقاط مشخص (که مقادیر آن‌ها معلوم است)، مقادیر تابع را در نقاط نامعلوم بازه میان این نقاط تخمین زد. در مثال بالا از روش "Chow-Lin interpolation" استفاده شده است. روش Chow-Lin یک روش درون یابی مبتنی بر رگرسیون است که برای تبدیل داده‌های با فرکانس پایین (مانند سالیانه) به داده‌های با فرکانس بالاتر (مانند فصلی) استفاده می‌شود. این روش یک سری با فرکانس بالاتر را به عنوان الگویی برای سری درون یابی شده انتخاب می‌کند تا در یکی از چهار روش (اول، آخر، مجموع یا میانگین) به سری مرجع سالیانه مطابقت داشته باشد.

نکته2:

در مثال بالا، "indicator" یک سری زمانی با فرکانس بالاتر (در اینجا فصلی) است که به عنوان الگو یا نمونه‌ای برای درون یابی سری با فرکانس پایین‌تر (در اینجا سالیانه) استفاده می‌شود.

روش Chow-Lin بر پایه رگرسیون است، و نیاز دارد تا یک سری با فرکانس بالاتر به عنوان نمونه یا الگو برای درون یابی سری با فرکانس پایین‌تر استفاده شود. در واقع، indicator به عنوان یک "راهنما" یا "مرجع" عمل می‌کند که اطلاعات فرکانس بالاتر را به سری درون یابی اضافه می‌کند.

با استفاده از indicator، می‌توانیم الگوی فصلی یا تغییرات فرکانس بالاتر را در سری درون یابی داشته باشیم، به طوری که سری جدید (درون یابی شده) به خوبی الگوی فرکانس بالاتر را دنبال کند، ضمن اینکه با داده‌های فرکانس پایین‌تر (سالیانه) هم مطابقت داشته باشد.

مثال:

فرض کنید داده‌های مربوط به تولید ناخالص داخلی (GDP) یک کشور را برای هر سال دارید، اما می‌خواهید داده‌های فصلی (یعنی هر ۳ ماه یک بار) این متغیر را داشته باشید. در اینجا، سری سالانه را می‌توان "بنچمارک" نامید.

همچنین فرض کنید شما داده‌های فصلی مربوط به فروش خودرو در همان کشور را دارید. این داده‌ها می‌تواند به عنوان "indicator" استفاده شود.

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

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

با استفاده از روش Chow-Lin، می‌توانید داده‌های سالانه GDP را با الگوی فصلی فروش خودرو ترکیب کنید تا داده‌های فصلی GDP را بسازید. این داده‌های فصلی جدید به گونه‌ای خواهد بود که با داده‌های سالانه اصلی مطابقت داشته باشد (به عنوان مثال، مجموع چهار فصل جدید با داده سالانه اصلی برابر است)، اما همچنین الگوی فصلی فروش خودرو را نیز دنبال می‌کند.

کد:


# ابتدا نیاز است که ایویز نصب باشد
# نصب کردن پکیج‌های لازم
# !pip install pyeviews matplotlib pandas numpy

import numpy as np
import pandas as pa
import pyeviews as evp
import matplotlib.pyplot as plt

# ایجاد دو سری زمانی با استفاده از pandas
dtsa = pa.date_range('1998', periods = 3, freq = 'A')
benchmark = pa.Series([4000.,4161.4,np.nan], index=dtsa, name = 'benchmark')

dtsq = pa.date_range('1998q1', periods = 12, freq ='Q')
indicator = pa.Series([98.2, 100.8, 102.2, 100.8, 99., 101.6, 102.7, 101.5, 100.5, 103., 103.5, 101.5], index = dtsq, name = 'indicator')

# انتقال داده به EViews و انجام عملیات‌های لازم
eviewsapp = evp.GetEViewsApp(instance='new', showwindow=True)
evp.PutPythonAsWF(benchmark, app=eviewsapp)
evp.PutPythonAsWF(indicator, app=eviewsapp, newwf=False)

evp.Run('pageselect Untitled', app=eviewsapp)
evp.Run('pagerename Untitled annual', app=eviewsapp)
evp.Run('pageselect Untitled1', app=eviewsapp)
evp.Run('pagerename Untitled1 quarterly', app=eviewsapp)

evp.Run('copy(rho=.7, c=chowlins, overwrite) annual\\benchmark quarterly\\benchmarked @indicatorindicator', app=eviewsapp)

# بازیابی داده از EViews به Python
benchmarked = evp.GetWFAsPython(app=eviewsapp, pagename= 'quarterly', namefilter= 'benchmarked ')

# انتشار حافظه
eviewsapp.Hide()
eviewsapp = None
evp.Cleanup()

# نمایش داده با استفاده از matplotlib
benchmarked_reindexed = pa.Series(benchmarked.values.flatten(), index = benchmarked.index + pa.DateOffset(months = 3, days = -1))

fig, ax1 = plt.subplots()
plt.xticks(rotation=70)
ax1.plot(benchmarked_reindexed, 'b-', label='benchmarked')
ax1.plot(indicator*10, 'b--', label='indicator*10')
ax1.set_xlabel('dates')
ax1.set_ylabel('indicator & interpolated values', color='b')
ax1.xaxis.grid(True)
for tl in ax1.get_yticklabels():
    tl.set_color('b')
plt.legend(loc='lower right')
ax2 = ax1.twinx()
ax2.set_ylim([3975, 4180])
ax2.plot(benchmark, 'ro', label='benchmark')
ax2.set_ylabel('benchmark', color='r')
for tl in ax2.get_yticklabels():
    tl.set_color('r')
plt.legend(loc='upper left')
plt.title("Chow-Lin interpolation: \nannual sum of benchmarked = benchmark", fontsize=14)
plt.show()