اگر از تاکسیاینترنتی اسنپ برای حمل و نقل استفاده کرده باشید و به قول معروف «اسنپ زده باشید!»، حتما با تصویر زیر آشنا هستید. 😉
![توضیح تصویر](https://quera.ir/qbox/view/MZ4pn03L9T/snapp_taxi.jpg)
در این تصویر، تعداد رانندگان اطراف یک درخواست کننده سفر، نشان داده شدهاند. اما شما (طبیعتا!) تعداد مسافرانی که در آن لحظه از اسنپ درخواست سفر کردهاند را نمیبینید.
# دادگان
در این سوال، مجموعه [اسنپکب](https://snapp.ir/taxi-ride?utm_source=snapp-website)، ارائه دهنده خدمت تاکسی اینترنتی اسنپ، تاریخچه تعداد مسافرانی که در هر دقیقه، درخواست سفر کردهاند را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/125362/) ، در اختیار شما قرار دادهاست.
هنگامی که این فایل را از حالت فشرده خارج کنید. پوشه `cab` را میبینید. در صورتی که وارد این پوشه شوید، فایلهای آموزش (`train.csv`) و آزمایش (`test.csv`) در اختیار شما خواهند بود. فایل آموزش، اطلاعات درخواست مسافران به ازای هر دقیقه را در یک بازه ۲ ماهه، در اختیار شما قرار میدهد که جزییات آن، در جدول زیر آمدهاست:
| نام ستون | توضیحات ستون |
|:----------|:------------------:|
| time | زمان ثبت درخواستها (با دقت دقیقه) |
| y | تابعی از تعداد مسافران منتظر راننده|
# صورت مسئله
معیار `y`، نشاندهنده وضعیت جاری کسب و کار و میزان مشتریان ورودی در لحظه است. به همین دلیل، این [معیار (KPI)](https://fa.wikipedia.org/wiki/%D8%B4%D8%A7%D8%AE%D8%B5_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF) و رصد آن در طول زمان، دارای اهمیت بسیار ویژهای برای مجموعه اسنپکب است. 🤗
یکی از عوامل ناخواسته و خارج از کنترلی که این معیار را تحت تاثیر منفی قرار میدهد، مشکلات فنی یا به قولی `Technical Incident`ها هستند که گاهی باعث از دسترس خارج شدن مقطعی و یا حتی کامل سامانه دریافت درخواست اسنپکب میشوند. 😢
در نتیجه اگر نمودار سری زمانی این دادگان را رسم کنید؛ با افتادگیهایی ناشی از همین اتفاقات (مانند شکل زیر) روبرو خواهید شد:
![توضیح تصویر](https://quera.ir/qbox/view/IxUQmbZqrm/time_series.png)
در شکل بالا، نمودار قرمز رنگ، نحوه تغییر معیار `y` را در طول زمان نشان میدهد. همانگونه که در تصویر معلوم است، از دقایقی قبل از ساعت ۱۵:۳۰ تا حدود ۱۶:۴۰، سامانه دچار مشکل شده و درخواستهای سفر کاهش پیدا کرده بودند. در همین نمودار، خطچین زردرنگ نشانگر **انتظار** ما از رفتار سیستم است اگر خطایی رخ نداده بود و از آن با نام **مقدار ایدهآل** `y` یاد میکنیم.
بهعبارت دیگر، مقدار ایدهآل `y` در زمانهایی که مشکل فنی نیست برابر است با مقدار `y` و در زمانهایی که مشکل فنی وجود دارد، بایستی مقدار آن به شکلی باشد که بین سریزمانی قبل و بعد از حادثه، یک نمودار `smooth` و یا به اصطلاح صاف مانند شکل بالا، ایجاد شود.
حال، اسنپکب از شما انتظار دارد که با استفاده از روشهای یادگیریماشین، یادگیری عمیق و یا سریهای زمانی، اقدام به پیشبینی **مقدار ایدهآل** `y` در دادگان آزمایش بکنید. 😎
<details class="yellow">
<summary>
**توجه**
</summary>
لطفا به نکات زیر توجه داشته باشید:
+ شناسایی زمانهای بروز مشکل فنی، جزوی از چالش این مسئله است و تعریف دقیقی برای آنها ارائه نشدهاست.
+ شما در دادگان آموزش، مقدار ایدهآل `y` را در لحظات رخدادن حادثه ندارید. در نتیجه، چالشهای مرتبط با آن نیز، جزوی از این مسئله است.
</details>
<details class="pink">
<summary>
**راهنمایی**
</summary>
**شاید** نکات زیر، بتوانند به شما در حل این مسئله کمک بکنند:
+ شناسایی بازههای مشکلات فنی و اصلاح آنها در دادگان آموزش و یا در پیشبینیهای دادگان آزمایش با استفاده از روشهای مرتبط مانند `Moving Average`
+ استفاده از یادگیری نظارتشده (`supervised`)
+ استفاده از الگوریتمهای مرتبط با سری زمانی
+ یا استفاده از هر روش دیگر مرتبط با تحلیل داده، یادگیری ماشین و عمیق
</details>
# ارزیابی
برای ارزیابی مُدل شما از معیار (`metric`) زیر استفاده میشود:
$$metric = \frac{\sum_{i=1}^{i=n} |y_i-prediction_i|}{\sum_{i=1}^{i=n} y_i} $$
در فرمول بالا، $y_i$ مقدار ایدهآل معیار $y$ برای زمان $i$ است و $prediction_i$ نیز مقدار پیشبینی شده مُدل شما برای آن زمان میباشد. همچنین تعداد نمونههای دادگان را از شماره ۱ تا $n$ در نظر میگیریم. در نهایت، امتیاز شما از این مرحله بر اساس فرمول زیر محاسبه میگردد:
$$score = (0.2 - metric) \times1000$$
هدف شما، بایستی ساختن مُدلی با $metric<0.2$ باشد.
<details class="green">
<summary>
**توضیحات**
</summary>
با توجه به این که `metric` برابر یا بزرگتر از ۰.۲ به عنوان مدل مناسب این مسئله، از سمت تیم اسنپکب مورد قبول قرار نمیگیرد. پس هرمدلی که چنین عملکردی را روی دادگان آزمایش داشتهباشد، **صفر** امتیاز از این سوال کسب میکند.
</details>
<details class="yellow">
<summary>
**توجه**
</summary>
لطفا در هنگام کار با این دادگان، به نکات زیر توجه داشته باشید:
+ مقدار `metric` مدل شما، تا سه رقم اعشار محاسبه (رُند) و در فرمول امتیازدهی بالا، قرار داده میشود.
+ این سوال، امتیاز منفی ندارد. حتی اگر `score` شما، منفی شود. از این سوال حداقل **صفر** امتیاز میگیرید. 😜
+ بیشترین امتیاز ممکن از این سوال ۲۰۰ و کمترین امتیاز ممکن، صفر است.
</details>
# خروجی
پیشبینیهای مدل خود بر روی دادگان آزمایش (`test.csv`) را در فایلی با نام `output.csv` قرار دهید. این فایل باید دارای یک ستون با نام `prediction` باشد که ردیف iام آن، پیشبینی شما برای سطر iام دادگان آزمایش باشد (دقت کنید که این ستون باید حتما دارای `header` باشد).
بعد از آمادهسازی فایل `output.csv`، آن را برای ما بارگذاری کنید.
## نمونه خروجی فایل `output.csv` (فقط سه خط اول به همراه نام ستون)
```
prediction
7835
6431
8304
```
<details class="yellow">
<summary>
**توجه**
</summary>
حتما فایل `output.csv` باید دارای ۴,۳۲۰ سطر (بدون در نظر گرفتن `header`) و یک ستون باشد.
همچنین نام ستون بایستی بدون `space` در قبل و بعد از نام آن، باشد. در غیر این صورت، سیستم داوری نمرهای به شما نخواهد داد.
</details>
<details class="red">
<summary>
**هشدار 😱**
</summary>
فراموش نکنید که **قبل از پایان زمان مسابقه**، **بایستی** تمامی کدهای این مسابقه را از قسمت **بارگذاری کُد** برای ما ارسال کنید. در غیر این صورت، شما از این مسابقه، امتیازی کسب نمی کنید.
توجه داشته باشید که اگر از `jupter notebook` استفاده می کنید بایستی همانند توضیحات قسمت **بارگذاری کُد**، خروجی `.py` را دریافت و برای ارسال در نظر بگیرید. ارسال فایلهای `jupyter` همانند `.ipynb` مورد قبول واقع نخواهند شد.
</details>