2015-10-13 12 views
13

के साथ व्यापार छुट्टी कैलेंडर बनाएं मैं पांडों का उपयोग कर एक व्यापार कैलेंडर बनाने की कोशिश कर रहा हूं। मैं USFederalHolidayCalendar के आधार पर एक कैल उदाहरण बनाने में सक्षम हूं। यूएसएफडरल होलीडे कैलेंडर ट्रेडिंग कैलेंडर के अनुरूप नहीं है जिसमें ट्रेडिंग कैलेंडर में कोलंबस डे और वयोवृद्ध दिवस शामिल नहीं है। हालांकि, ट्रेडिंग कैलेंडर में गुड फ्राइडे शामिल है (यूएसएफडरल होलीडे कैलेंडर में शामिल नहीं है)। कोड निम्नलिखित में अंतिम पंक्ति के अलावा सब कुछ काम करता है:पांडस

from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFriday 
from datetime import datetime 

cal = get_calendar('USFederalHolidayCalendar') # Create calendar instance 
cal.rules.pop(7)        # Remove Veteran's Day rule 
cal.rules.pop(6)        # Remove Columbus Day rule 
tradingCal = HolidayCalendarFactory('TradingCalendar', cal, GoodFriday) 

tradingCal उदाहरण में काम करने के लिए है कि मैं छुट्टी नियम देखने में सक्षम हूँ लगता है।

In[10]: tradingCal.rules 
Out[10]: 
[Holiday: Labor Day (month=9, day=1, offset=<DateOffset: kwds={'weekday': MO(+1)}>), 
Holiday: Presidents Day (month=2, day=1, offset=<DateOffset: kwds={'weekday': MO(+3)}>), 
Holiday: Good Friday (month=1, day=1, offset=[<Easter>, <-2 * Days>]), 
Holiday: Dr. Martin Luther King Jr. (month=1, day=1, offset=<DateOffset: kwds={'weekday': MO(+3)}>), 
Holiday: New Years Day (month=1, day=1, observance=<function nearest_workday at 0x000000000A190BA8>), 
Holiday: Thanksgiving (month=11, day=1, offset=<DateOffset: kwds={'weekday': TH(+4)}>), 
Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x000000000A190BA8>), 
Holiday: Christmas (month=12, day=25, observance=<function nearest_workday at 0x000000000A190BA8>), 
Holiday: MemorialDay (month=5, day=31, offset=<DateOffset: kwds={'weekday': MO(-1)}>)] 

मैं एक समय अवधि के दौरान छुट्टियों सूची प्रयास करते हैं, मैं निम्नलिखित त्रुटि मिलती है:

In[11]: tradingCal.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31)) 
Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 3035, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-12-2708cd2db7a0>", line 1, in <module> 
    tradingCal.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31)) 
TypeError: unbound method holidays() must be called with TradingCalendar instance as first argument (got datetime instance instead) 

कोई भी विचार?

उत्तर

22

शायद यह इसलिए की तरह, खरोंच से व्यापार कैलेंडर बनाने के लिए और अधिक स्पष्ट है:

import datetime as dt 

from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, \ 
    USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, \ 
    USLaborDay, USThanksgivingDay 


class USTradingCalendar(AbstractHolidayCalendar): 
    rules = [ 
     Holiday('NewYearsDay', month=1, day=1, observance=nearest_workday), 
     USMartinLutherKingJr, 
     USPresidentsDay, 
     GoodFriday, 
     USMemorialDay, 
     Holiday('USIndependenceDay', month=7, day=4, observance=nearest_workday), 
     USLaborDay, 
     USThanksgivingDay, 
     Holiday('Christmas', month=12, day=25, observance=nearest_workday) 
    ] 


def get_trading_close_holidays(year): 
    inst = USTradingCalendar() 

    return inst.holidays(dt.datetime(year-1, 12, 31), dt.datetime(year, 12, 31)) 


if __name__ == '__main__': 
    print(get_trading_close_holidays(2016)) 
    # DatetimeIndex(['2016-01-01', '2016-01-18', '2016-02-15', '2016-03-25', 
    #     '2016-05-30', '2016-07-04', '2016-09-05', '2016-11-24', 
    #     '2016-12-26'], 
    #     dtype='datetime64[ns]', freq=None) 
6

आपको कक्षा का नया उदाहरण बनाना होगा: cal1 = tradingCal()। यह मेरे लिए काम करता है।

from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFriday 
from datetime import datetime 

cal = get_calendar('USFederalHolidayCalendar') # Create calendar instance 
cal.rules.pop(7)        # Remove Veteran's Day rule 
cal.rules.pop(6)        # Remove Columbus Day rule 
tradingCal = HolidayCalendarFactory('TradingCalendar', cal, GoodFriday) 
print tradingCal.rules 

#new instance of class 
cal1 = tradingCal() 

print cal1.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31)) 

#DatetimeIndex(['2015-01-01', '2015-01-19', '2015-02-16', '2015-04-03', 
#    '2015-05-25', '2015-07-03', '2015-09-07', '2015-11-26', 
#    '2015-12-25', '2016-01-01', '2016-01-18', '2016-02-15', 
#    '2016-03-25', '2016-05-30', '2016-07-04', '2016-09-05', 
#    '2016-11-24', '2016-12-26'], 
#    dtype='datetime64[ns]', freq=None, tz=None) 
+0

परफेक्ट, जेज़राइल। धन्यवाद। – vlmercado

+4

मुझे लगता है कि यह एक महत्वपूर्ण कमी है! '.pop' का उपयोग अंतर्निहित वर्ग 'pandas.tseries.holiday.USFederalHolidayCalendar' को प्रभावित करता है क्योंकि यह एक" इन-प्लेस "ऑपरेशन (शब्दावली के बारे में सुनिश्चित नहीं है)। इसका अर्थ यह है कि यदि आप 'get_calendar ('USFederalHolidayCalendar') से cal2 को पुनः प्रयास और पुन: बनाते हैं, तो नियम' cal' के समान होते हैं। यानी आपको 'यूएसएफडरल होलीडे कैलेंडर' का * साफ * संस्करण नहीं मिला है क्योंकि यह अब अस्तित्व में नहीं है, आपने इसे संशोधित किया है! – evan54

+0

@ evan54 मैंने अभी भी यह देखा है। क्या आपके पास एक समाधान है? – WillZ

8

यदि यह मदद करता है, मैं मुद्रा व्यापार कैलेंडर के लिए एक ऐसी ही जरूरत थी। क्वांटोपियन द्वारा ज़िपलाइन परियोजना में दफन किया गया कुछ उत्कृष्ट कोड था। मैंने प्रासंगिक भाग निकाला और पांडा में बाजार विनिमय व्यापार कैलेंडर बनाने के लिए एक नई परियोजना बनाई। लिंक नीचे वर्णित कुछ कार्यक्षमताओं के साथ यहां हैं।

https://github.com/rsheftel/pandas_market_calendars

https://pypi.python.org/pypi/pandas-market-calendars

यहाँ यह NYSE के लिए मान्य खुले रहने का समय के सभी की एक पांडा DatetimeIndex बनाकर क्या कर सकते हैं:

import pandas_market_calendars as mcal 
nyse = mcal.get_calendar('NYSE') 

early = nyse.schedule(start_date='2012-07-01', end_date='2012-07-10') 
early 

        market_open    market_close 
=========== ========================= ========================= 
2012-07-02 2012-07-02 13:30:00+00:00 2012-07-02 20:00:00+00:00 
2012-07-03 2012-07-03 13:30:00+00:00 2012-07-03 17:00:00+00:00 
2012-07-05 2012-07-05 13:30:00+00:00 2012-07-05 20:00:00+00:00 
2012-07-06 2012-07-06 13:30:00+00:00 2012-07-06 20:00:00+00:00 
2012-07-09 2012-07-09 13:30:00+00:00 2012-07-09 20:00:00+00:00 
2012-07-10 2012-07-10 13:30:00+00:00 2012-07-10 20:00:00+00:00 

mcal.date_range(early, frequency='1D') 

DatetimeIndex(['2012-07-02 20:00:00+00:00', '2012-07-03 17:00:00+00:00', 
       '2012-07-05 20:00:00+00:00', '2012-07-06 20:00:00+00:00', 
       '2012-07-09 20:00:00+00:00', '2012-07-10 20:00:00+00:00'], 
       dtype='datetime64[ns, UTC]', freq=None) 

mcal.date_range(early, frequency='1H') 

DatetimeIndex(['2012-07-02 14:30:00+00:00', '2012-07-02 15:30:00+00:00', 
       '2012-07-02 16:30:00+00:00', '2012-07-02 17:30:00+00:00', 
       '2012-07-02 18:30:00+00:00', '2012-07-02 19:30:00+00:00', 
       '2012-07-02 20:00:00+00:00', '2012-07-03 14:30:00+00:00', 
       '2012-07-03 15:30:00+00:00', '2012-07-03 16:30:00+00:00', 
       '2012-07-03 17:00:00+00:00', '2012-07-05 14:30:00+00:00', 
       '2012-07-05 15:30:00+00:00', '2012-07-05 16:30:00+00:00', 
       '2012-07-05 17:30:00+00:00', '2012-07-05 18:30:00+00:00', 
       '2012-07-05 19:30:00+00:00', '2012-07-05 20:00:00+00:00', 
       '2012-07-06 14:30:00+00:00', '2012-07-06 15:30:00+00:00', 
       '2012-07-06 16:30:00+00:00', '2012-07-06 17:30:00+00:00', 
       '2012-07-06 18:30:00+00:00', '2012-07-06 19:30:00+00:00', 
       '2012-07-06 20:00:00+00:00', '2012-07-09 14:30:00+00:00', 
       '2012-07-09 15:30:00+00:00', '2012-07-09 16:30:00+00:00', 
       '2012-07-09 17:30:00+00:00', '2012-07-09 18:30:00+00:00', 
       '2012-07-09 19:30:00+00:00', '2012-07-09 20:00:00+00:00', 
       '2012-07-10 14:30:00+00:00', '2012-07-10 15:30:00+00:00', 
       '2012-07-10 16:30:00+00:00', '2012-07-10 17:30:00+00:00', 
       '2012-07-10 18:30:00+00:00', '2012-07-10 19:30:00+00:00', 
       '2012-07-10 20:00:00+00:00'], 
       dtype='datetime64[ns, UTC]', freq=None) 

तुम सिर्फ प्राप्त करना चाहते हैं पांडा हॉलिडे कैलेंडर जिसका उपयोग अन्य पांडा कार्यों में किया जा सकता है जो इसे तर्क के रूप में लेते हैं:

holidays = nyse.holidays() 

holidays.holidays[-5:] 
(numpy.datetime64('2030-05-27'), 
numpy.datetime64('2030-07-04'), 
numpy.datetime64('2030-09-02'), 
numpy.datetime64('2030-11-28'), 
numpy.datetime64('2030-12-25')) 
+0

यह पुस्तकालय विश्वसनीय नहीं है। जब मैंने कोशिश की, 2010-01-01 और अन्य नए साल के कैलेंडर कैलेंडर में दिखाए गए थे, साथ ही गुड फ्राइडे और अन्य। –

+2

आप संभवतः पैकेज का उपयोग नहीं कर रहे हैं। 2010-01-01 और अन्य सभी नए साल के दिन और शुभ शुक्रवार को एक व्यापारिक दिन के रूप में शामिल नहीं किया गया है। ऊपर उदाहरण कोड का प्रयास करें। यदि आप पैकेज का उपयोग करना सीखना चाहते हैं, तो मैं ऑनलाइन दस्तावेज़ों का सुझाव देता हूं या यदि आपको अभी भी समस्याएं हैं तो आप मुझे सीधे संदेश भेज सकते हैं। –

+0

आप सही हैं। मैंने 1995 से परीक्षण किए गए कैलेंडर के खिलाफ इसकी जांच की, और यह सटीक था। याद नहीं कर सकता कि मैं किस वाक्यविन्यास का उपयोग कर रहा था जिसने मुझे अवांछनीय परिणाम दिए। –