rozetko
7 years ago
1 changed files with 0 additions and 46 deletions
@ -1,46 +0,0 @@ |
|||||||
from fbprophet import Prophet |
|
||||||
import pandas as pd |
|
||||||
|
|
||||||
|
|
||||||
class prophet_algorithm(object): |
|
||||||
def __init__(self): |
|
||||||
self.model = None |
|
||||||
self.dataset = None |
|
||||||
|
|
||||||
def fit(self, data, anomalies): |
|
||||||
pass |
|
||||||
|
|
||||||
def predict(self, data): |
|
||||||
data = data.reset_index() |
|
||||||
data = data.rename(columns={'timestamp': 'ds', 'value': 'y'}) |
|
||||||
self.dataset = data |
|
||||||
|
|
||||||
self.model = Prophet(yearly_seasonality=False, weekly_seasonality=False, daily_seasonality=True) |
|
||||||
self.model.fit(self.dataset) |
|
||||||
|
|
||||||
future = self.model.make_future_dataframe(freq='H', periods=0, include_history=True) |
|
||||||
forecast = self.model.predict(future) |
|
||||||
cmp_df = forecast.set_index('ds')[['yhat', 'yhat_lower', 'yhat_upper']].join(self.dataset.set_index('ds')) |
|
||||||
cmp_df['e'] = [ max(row.y - row.yhat_upper, row.yhat_lower - row.y, 0) for index, row in cmp_df.iterrows() ] |
|
||||||
return self.__calc_anomalies(cmp_df) |
|
||||||
|
|
||||||
def __calc_anomalies(self, dataset): |
|
||||||
anomalies = [] |
|
||||||
cur_anomaly = None |
|
||||||
for i in range(len(dataset)): |
|
||||||
if dataset['e'][i] > 17: |
|
||||||
if cur_anomaly is None: |
|
||||||
cur_anomaly = {'start': dataset.index[i], 'finish': dataset.index[i], 'weight': 0} |
|
||||||
cur_anomaly['finish'] = dataset.index[i] |
|
||||||
cur_anomaly['weight'] += dataset['e'][i] |
|
||||||
elif cur_anomaly is not None: |
|
||||||
anomalies.append(cur_anomaly) |
|
||||||
cur_anomaly = None |
|
||||||
return anomalies |
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__": |
|
||||||
dataset = pd.read_csv('art_daily_flatmiddle.csv', index_col=['timestamp'], parse_dates=['timestamp']) |
|
||||||
algo = prophet_algorithm(dataset) |
|
||||||
res = algo.fit() |
|
||||||
print(res) |
|
Loading…
Reference in new issue