import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math
import datetime
from pandas import dataframe,series
from copy import deepcopy
import seaborn
deftimer
(func):
""" 乙個裝飾器,用來裝飾test_data_gen()
使test_data_gen()成為乙個帶日期的資料
返回值為乙個dataframe
"""defdeco
(*args,**kwargs):
res=func(*args,**kwargs)
date_need=
start_dt = datetime.datetime(2017, 1, 1)
interval = datetime.timedelta(seconds=300)
for i in range(len(res)):
df = dataframe(res,index = date_need[0:len(res)],columns=["data"])
return df
return deco
@timer
deftest_data_gen
(num_pi,num_ex,num_gap,num_bk):
""" num_pi為要產生幾個π的sin資料
num_ex為異常點的個數
num_gap為段缺失資料的個數
num_bk為單個缺失值的個數
"""if (num_pi>0) :
num_point=72*num_pi
x=np.linspace(0,np.pi*num_pi,num_point)
signal1=[(math.sin(i)+15) for i in x] #產生測試用的num_pi個sin資料
noise=np.random.normal(0,0.05,num_point)#numpy.random.normal(雜訊均值, 雜訊標準差, 雜訊的shape)
signal1=signal1+noise#在sin資料上新增雜訊
else:
print("please input valid num_pi")
return
if (num_ex>0) :
#隨機新增異常值
point_ex=
for i in range(num_ex):
for _ in point_ex:
signal1[_]=signal1[_]*1.8
else:
pass
if (num_gap>0) :
#隨機新增段資料缺失
longth_gap=np.random.randint(15)+5
#缺口大小5~20
point_gap= #缺口的位置
for i in range(num_gap):
for i in point_gap:
for j in range(longth_gap):
signal1[i+j]=none
else:
pass
if (num_bk>0) :
#隨機新增單點缺失值
point_break=
for i in range(num_bk):
for _ in point_break:
signal1[_]=none
else:
pass
return signal1
@timer
defpressure_below_timer
(df,standard):
""" args為一組壓力資料
standard是服務標準
返回值為低於服務標準的概率,壓力資料的均值和方差
"""args=df.iloc[:,-1]
args2=deepcopy(args)
k=0for i in range(len(args)):
if args[i] 1
else:
args2[i]=none
percent_below=k/len(args)
data_mean=np.mean(args)
data_std=np.std(args)
if(percent_below>0.1):#壓力出現10%的概率不合格則認為該點壓力不合格
print("壓力不足,需要增壓")
return args2
@timer
defstandard_line
(standard,args):
""" 服務基準線
"""return [standard]*len(args)
if __name__ == '__main__':
standard=14.5
#人為設定的服務基準
df=test_data_gen(4,0,0,0)
df2=pressure_below_timer(df,standard)
df_s=standard_line(standard,df)
plt.figure(figsize=(10,5))
plt.plot(df,'b')
plt.plot(df2,'r')
plt.plot(df_s,'r')
plt.show()
由於test_data_gen()、pressure_below_timer()和standard_line()三個函式都需要新增日期資料並轉換為dateframe,為了使**更簡潔,使用裝飾器裝飾這三個函 裝飾器使用
裝飾器本質上是乙個 python 函式或類,它可以讓其他函式或類在不需要做任何 修改的前提下增加額外功能,裝飾器的返回值也是乙個函式 類物件。它經常用於有切面需求的場景,比如 插入日誌 效能測試 事務處理 快取 許可權校驗等場景,裝飾器是解決這類問題的絕佳設計。有了裝飾器,我們就可以抽離出大量與函式...
python裝飾器使用
根據裝飾器有參 無參,函式有參 無參,組合共4種 無參裝飾器 包裝無引數函式 不需要針對引數進行處理和優化 def decorator func 自定義處理邏輯 pass decorator def foo pass這樣呼叫foo 的時候等價於 foo decorator foo foo 無參裝飾器...
python函式裝飾器使用詳解
def hint func def args,kwargs print is running format func.name return func args,kwargs hint defhello print hello 我們現在對hello已經進行了裝飾,當我們呼叫hello 時,我們可以看...