Source code for pyFTS.models.seasonal.common
import numpy as np
import pandas as pd
from enum import Enum
from pyFTS.common import FuzzySet, Membership
from pyFTS.partitioners import partitioner, Grid
[docs]class DateTime(Enum):
year = 1
month = 12
day_of_month = 30
day_of_year = 364
day_of_week = 7
hour = 6
minute = 7
second = 8
hour_of_day = 24
hour_of_week = 168
hour_of_month = 744
hour_of_year = 8736
minute_of_hour = 60
minute_of_day = 1440
minute_of_week = 10080
minute_of_month = 44640
minute_of_year = 524160
second_of_minute = 60.00001
second_of_hour = 3600
second_of_day = 86400
[docs]def strip_datepart(date, date_part):
if date_part == DateTime.year:
tmp = date.year
elif date_part == DateTime.month:
tmp = date.month
elif date_part == DateTime.day_of_year:
tmp = date.timetuple().tm_yday
elif date_part == DateTime.day_of_month:
tmp = date.day
elif date_part == DateTime.day_of_week:
tmp = date.weekday()
elif date_part == DateTime.hour or date_part == DateTime.hour_of_day:
tmp = date.hour
elif date_part == DateTime.hour_of_week:
wk = (date.weekday()-1) * 24
tmp = date.hour + wk
elif date_part == DateTime.hour_of_month:
wk = (date.day-1) * 24
tmp = date.hour + wk
elif date_part == DateTime.hour_of_year:
wk = (date.timetuple().tm_yday-1) * 24
tmp = date.hour + wk
elif date_part == DateTime.minute or date_part == DateTime.minute_of_hour:
tmp = date.minute
elif date_part == DateTime.minute_of_day:
wk = date.hour * 60
tmp = date.minute + wk
elif date_part == DateTime.minute_of_week:
wk1 = (date.weekday()-1) * 1440 #24 * 60
wk2 = date.hour * 60
tmp = date.minute + wk1 + wk2
elif date_part == DateTime.minute_of_month:
wk1 = (date.day - 1) * 1440 #24 * 60
wk2 = date.hour * 60
tmp = date.minute + wk1 + wk2
elif date_part == DateTime.minute_of_year:
wk1 = (date.timetuple().tm_yday - 1) * 1440 #24 * 60
wk2 = date.hour * 60
tmp = date.minute + wk1 + wk2
elif date_part == DateTime.second or date_part == DateTime.second_of_minute:
tmp = date.second
elif date_part == DateTime.second_of_hour:
wk1 = date.minute * 60
tmp = date.second + wk1
elif date_part == DateTime.second_of_day:
wk1 = date.hour * 3600 #60 * 60
wk2 = date.minute * 60
tmp = date.second + wk1 + wk2
else:
raise Exception("Unknown DateTime value!")
return tmp
[docs]class FuzzySet(FuzzySet.FuzzySet):
"""
Temporal/Seasonal Fuzzy Set
"""
def __init__(self, datepart, name, mf, parameters, centroid, alpha=1.0, **kwargs):
super(FuzzySet, self).__init__(name, mf, parameters, centroid, alpha, type = 'datetime', **kwargs)
self.datepart = datepart
self.type = 'seasonal'
[docs] def membership(self, x):
dp = strip_datepart(x, self.datepart)
return self.mf(dp, self.parameters) * self.alpha