わかさぎのブログ

プログラミング、Atcoderの勉強とか

サビツキゴレイフィルタ(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の次数とモードがパラメータ

 

 

scipy.signal.savgol_filter — SciPy v1.7.1 Manual

SciPy で Savitzky-Golay フィルタ | org-技術 (org-technology.com)

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:
                    break

            kara=
            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:
            pass

        plt.savefig(os.path.join(picture_box, picture_title))

 

解説

ファイル名に対してスライスで必要な部分だけ取り出す。

os.path.joinで保存先とタイトルを連結する。

 

ファイル名は、ファイル名一覧のリストを使ってfor文で回す。

for file in files:

    picture_make(file)

みたいにする。