Много често се чува, че учен по данни е статистик, който работи с 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í)