サビツキゴレイフィルタ(savgol)
def savgol(y,n):
#サビツキ-ゴレイフィルタ
signed_y = signal.savgol_filter(y, n, 7, mode="mirror")return signed_y
結構お世話になっているフィルタ。
窓の長さは奇数にしないといけない。
参考にしたブログではデータ数/4 +1としていた。
n=len(list)
n=n-n%8
とかすればいい(8の倍数は4で割っても偶数で1足すと奇数になる)
あとはploymoninaiの次数とモードがパラメータ
unzipは*zip
def data_range_csv_make_kai(self,file_name):
with open(file_name, encoding="cp932") as f:
lineral= f.read().splitlines()
del lineral[0:320]
#20行削除
data=
for line in lineral:
if line:
data.append(line)
else:
breakkara=
for line in data:
element=re.split(",", line)
kara.append(element)
unzip=list(zip(*kara))
#unzipは二次元配列。unzip[0]がx、unzip[1]がy
x_kari= list(unzip[0])
y_kari= list(unzip[1])
x_true= ; y_true=
for i ,j in zip(x_kari,y_kari):
x_true.append(float(i))
y_true.append(float(j))
self.x=np.array(x_true)
self.y=np.array(y_true)
解説
ファイルを読み込んで一行ごとにリストに格納。
if (リストの要素)はリストの要素が空の時はFALSEを返すことを利用して、空白の行が登場するまでデータを格納したリストを作成する。
ここまでで
[ "12,12", "342,32", "34,43"]
みたいな状態になっているからunzipする。(zipの反対)そのあとで、
文字列の数字状態になっているからfloatに変換している。
時系列データで初めて閾値超えた点の検出
#R開始点は閾値を超えたところとして定義する
thresh=[] ; threshold=np.average(y[0:100]+100)
for i,j in enumerate(y):
if j>threshold:
thresh.append(i)
else:
pass
メモリの無駄遣いだが、thresholdを超えているなら空のリストに追加して、リストの先頭の要素を取り出せばよい。
subplotするときにfor文を使う
def visualize_1(self,file_name):
#結果を可視化する
x=self.x ; y=self.y
plt.rcParams["figure.figsize"] = (15, 8)
plt.style.use('seaborn-whitegrid')
fig=plt.figure()ax=[[0,0,0],[0,0,0]]
for i in range(2):
for j in range(3):
ax[i][j]=fig.add_subplot(2,3,3*i+j+1)
3*i+j+1がミソ
大量のグラフを作成し保存
def picture_make(file_name):
#画像保存用のディレクトリを作成しその中にグラフの画像を保存する
picture_title=file_name[-8:-4]
picture_box=os.path.join(path_loc,"picture")if os.path.exists(picture_box)==False:
os.mkdir(picture_box)
else:
passplt.savefig(os.path.join(picture_box, picture_title))
解説
ファイル名に対してスライスで必要な部分だけ取り出す。
os.path.joinで保存先とタイトルを連結する。
ファイル名は、ファイル名一覧のリストを使ってfor文で回す。
for file in files:
picture_make(file)
みたいにする。