Много често се чува, че учен по данни е статистик, който работи с Python на Mac. Отчасти това е правилно. Но всеки, който е работил в академичния свят, знае, че за един статистик „кравите са сферични“ и месеците имат 365,25/12 дни. Вместо това в реалния свят нито две крави са еднакви, нито един месец е равен на всеки друг.

Надявам се, че тази публикация добавя стойност към цялата тази допълнителна работа и време, прекарано от тези, които работят с данни, избягвайки статистически опростявания, независимо дали са специалисти по данни или както се наричат.

Времеви серии с Pandas

Pandas е де факто инструментът за анализ за управление на данни в Python. Тя ви позволява лесно да работите с цифрови таблици и времеви редове. Полезна функция в Pandas е лесното определяне на диапазони от дати с функцията pd.date_range(), която включва следните параметри (трябва да бъдат посочени точно три):

  • начало: Начало на диапазона. Ляво ограничение за генериране на дати
  • end: Край на диапазона. Право ограничение
  • периоди: Брой периоди за генериране
  • freq: Низове с честота (напр. D: честота на календарния ден, M: честота в края на месеца, Y: честота в края на годината) вижте списъка с Офсетни псевдоними.

Основен пример за времеви ред

Достатъчни са няколко реда:

         Date
0  2019-01-31
1  2019-02-28
2  2019-03-31
3  2019-04-30
4  2019-05-31
5  2019-06-30
6  2019-07-31
7  2019-08-31
8  2019-09-30
9  2019-10-31
10 2019-11-30
11 2019-12-31

Създайте времева поредица с последните работни дни на всеки месец

В определени области, главно финансови и актюерски, е особено полезно да се управляват диапазони от дати, където дните в серията съответстват на първия или последния работен ден от месеца (например, когато се предвиждат купонни плащания или анюитети).

За да направите това, функцията pd.date_range() има различни стойности за параметъра за честота. В следния пример „BM“ съответства на BusinessMonthEnd (последен работен ден от месеца):

         Date
0  2019-01-31
1  2019-02-28
2  2019-03-29
3  2019-04-30
4  2019-05-31
5  2019-06-28
6  2019-07-31
7  2019-08-30
8  2019-09-30
9  2019-10-31
10 2019-11-29
11 2019-12-31

За да се предвиди бъдещето въз основа на данни, е необходимо да се знаят пропуските, които трябва да се запълнят

Въпреки това, ако искаме по-голяма точност, трябва да вземем предвид банковите празници (например, ако изчисляваме разходи, които зависят от точните дни между купон и купон, 1 почивен ден на 20 е грешка от 5%). Познаването на празниците в даден период е особено полезно, когато се оценяват човешките навици и поведение (медицински грижи, пътувания и др.). В застрахователния сектор тези модели могат пряко да повлияят на счетоводните резерви; например при изчисляване на направени, но неотчетени разходи (IBNR). Всъщност в някои застрахователни компании е обичайно леко да се увеличава съотношението на искове през високосни години поради това, че имат един календарен ден повече от останалите.

В следващия пример въвеждаме списък с два официални празника (28 февруари и 31 май), само за да видим как работи. След това изчисляваме дните между плащанията, ако това се случи в последния работен ден от месеца:

         Date  n_days
0  2019-01-31     0.0
1  2019-02-27    27.0
2  2019-03-29    30.0
3  2019-04-30    32.0
4  2019-05-30    30.0
5  2019-06-28    29.0
6  2019-07-31    33.0
7  2019-08-30    30.0
8  2019-09-30    31.0
9  2019-10-31    31.0
10 2019-11-29    29.0
11 2019-12-31    32.0

Както е показано, 2019–02–28 и 2019–05–31 не се показват в календара за плащане.

Създайте правила за персонализиран празничен календар

И накрая, има възможност за писане на правила за изчисляване на официалните празници (тъй като те обикновено се пренасят за следващия работен ден).

В някои държави, като Съединените щати, има закони (Uniform Monday Holiday Act of 1968), чиито правила са включени в Pandas, print(USFederalHolidayCalendar.rules) като пример за разработване на други календари.

В много други страни обаче няма правила за определяне на празниците през годината (както се случва в Европа), където празниците се определят с разпоредби всяка година. За празници, които се случват на фиксирани дати (напр. Ден на възпоменанието в САЩ или4 юли) правило за спазване определя кога да се спазва този празник, ако се пада през уикенда или друг ден - наблюдаван ден. Определените правила за спазване са:

В този случай е възможно да напишете правилата на трудовите календари, като използвате някои общи предпоставки за изчисляване на официалните празници, тъй като дните в неделя се преместват към следващия понеделник (observance=sunday_to_monday инструкция). Например: Денят на Канада за 2018 г. (1 юли) падна в неделя и беше преместен на 2 юли. Те трябва да бъдат презаписани в класа AbstractHolidayCalendar, за да може диапазонът да се прилага към всички подкласове на календара.

По-късно показвам работните дни през юли 2018 г., за да проверя как работи:

         Date
0  2018-07-03
1  2018-07-05
2  2018-07-06
3  2018-07-09
4  2018-07-10
5  2018-07-11
6  2018-07-12
7  2018-07-13
8  2018-07-16
9  2018-07-17
10 2018-07-18
11 2018-07-19
12 2018-07-20
13 2018-07-23
14 2018-07-24
15 2018-07-25
16 2018-07-26
17 2018-07-27
18 2018-07-30
19 2018-07-31

Можете да видите как неделя, 1 юли се заменя с понеделник, 2 юли

По този начин, след като сме създали наш собствен национален календар на празниците, можем да го използваме, за да видим банковите празници през следващите години, например 2020 г.:

DatetimeIndex(['2019-01-01', '2019-01-07', '2019-03-18', 
               '2019-04-01', '2019-04-19', '2019-05-01', 
               '2019-07-01', '2019-07-04', '2019-11-01', 
               '2019-12-25'],
              dtype='datetime64[ns]', freq=None)

Регионалните и местните празници могат да бъдат включени по същия начин, но се отбелязва, че в някои страни това обикновено са подвижните празници (религиозен празник, който не е на един и същи ден всяка година). В такъв случай става необходимо да се създаде нова функция, базирана на панди Easter() или sunday_to_monday() функция). Например Свети понеделник е 7-ият понеделник след Великден във Франция.

Нашият персонализиран календар може да се използва и в други библиотеки като Prophet. Prophet е усъвършенствана библиотека за машинно обучение, създадена от Facebook, фокусирана върху нелинейни във времето модели на регресия на данни, която изисква списък с празници, предоставен от потребителя.

За създаването на правила в еврейския календар вижте тези правила, направени от Улрих и Дейвид Греве.

(En español, aquí)