前提
PythonでCSVファイルから読み取ったデータにFFTをかけたいです。
最終的にはFFTしたデータにある周波数以下を0にしてIFFTするいわゆるノイズ処理のようなことをしようと考えています。
今回ではCSVデータを読み取りいったんそのデータを表示、FFTをかけるところまでは上手くいったと思うのですが以下のようなエラーが発生しました。
実現したいこと
エラーの解決方法のご教授。
発生している問題・エラーメッセージ
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) Input In [2], in <cell line: 5>() 3 """df=pd.read_csv('csv in/observationdata.csv',names=['time','voltage'])""" 4 df=pd.read_csv('csv in/observationdata.csv') ----> 5 df[(df["time"])] 6 t=df['time'] 7 f=df['voltage'] # 変更部分 File ~/miniforge3/envs/test1/lib/python3.9/site-packages/pandas/core/frame.py:3511, in DataFrame.__getitem__(self, key) 3509 if is_iterator(key): 3510 key = list(key) -> 3511 indexer = self.columns._get_indexer_strict(key, "columns")[1] 3513 # take() does not accept boolean indexers 3514 if getattr(indexer, "dtype", None) == bool: File ~/miniforge3/envs/test1/lib/python3.9/site-packages/pandas/core/indexes/base.py:5782, in Index._get_indexer_strict(self, key, axis_name) 5779 else: 5780 keyarr, indexer, new_indexer = self._reindex_non_unique(keyarr) -> 5782 self._raise_if_missing(keyarr, indexer, axis_name) 5784 keyarr = self.take(indexer) 5785 if isinstance(key, Index): 5786 # GH 42790 - Preserve name from an Index File ~/miniforge3/envs/test1/lib/python3.9/site-packages/pandas/core/indexes/base.py:5842, in Index._raise_if_missing(self, key, indexer, axis_name) 5840 if use_interval_msg: 5841 key = list(key) -> 5842 raise KeyError(f"None of [{key}] are in the [{axis_name}]") 5844 not_found = list(ensure_index(key)[missing_mask.nonzero()[0]].unique()) 5845 raise KeyError(f"{not_found} not in index") KeyError: "None of [Float64Index([ 0.0, 5e-06, 1e-05, 1.5e-05, 2e-05, 2.5e-05,\n 3e-05, 3.5e-05, 4e-05, 4.5e-05,\n ...\n 5.242825, 5.24283, 5.242835, 5.24284, 5.242845, 5.24285,\n 5.242855, 5.24286, 5.242865, 5.24287],\n dtype='float64', length=1048575)] are in the [columns]"
該当のソースコード
Python
1import matplotlib.pyplot as plt 2import csv 3import pandas as pd 4import numpy as np 5from scipy import signal 6 7N = 1048576 8dt = 0.000001 9"""df=pd.read_csv('csv in/observationdata.csv',names=['time','value'])""" 10df=pd.read_csv('csv in/observationdata.csv') 11t=df['time'] 12f=df['voltage'] # 変更部分 13F=np.fft.fft(f) 14F_abs=np.abs(F) 15F_abs_amp = F_abs / N * 2 # 交流成分はデータ数で割って2倍する 16F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分(今回は扱わないけど)は2倍不要 17 18#グラフ表示 19plt.xlabel('time(sec)', fontsize=14) 20plt.ylabel('voltage', fontsize=14) 21plt.plot(t, f) 22 23# 高速フーリエ変換(FFT) 24F = np.fft.fft(f) 25 26# FFTの複素数結果を絶対値に変換 27F_abs = np.abs(F) 28# 振幅をもとの信号に揃える 29F_abs_amp = F_abs / N * 2 # 交流成分はデータ数で割って2倍 30F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分(今回は扱わないけど)は2倍不要 31 32# 周波数軸のデータ作成 33fq = np.linspace(0, 1.0/dt, N) # 周波数軸 linspace(開始,終了,分割数) 34 35 36# グラフ表示(FFT解析結果) 37plt.xlabel('freqency(Hz)', fontsize=14) 38plt.ylabel('amplitude', fontsize=14) 39plt.plot(fq, F_abs_amp)
試したこと
ハイパスフィルタをかけてノイズを除去する方法は行いました。しかしFFTかけて特定のノイズを除去するという方法も確立しておきたいです。
補足情報(FW/ツールのバージョンなど)
質問に記載のエラーメッセージよりも上に「Traceback」と書かれてたら、そこから下をできるだけ省略せずに質問に記載してください
(ここに書くのではなく、質問を編集して追記する)
ユーザー名等の個人情報は伏せ字でいいですが、それ以外はできるだけそのまま記載してください
fq = np.linspace(0, 1.0/dt, N)
↓ 修正
fq = np.linspace(0, 1.0/dt, len(F_abs_amp)+1)[:-1]
で、どうでしょうか?
> x and y must have same first dimension, but have shapes (1048576,) and (1048575,)
は、「F_abs_amp」のサイズが「N」(1048576)と違ってるのだと思います
エラーが出てる行のすぐ上に下記を追加して実行して、結果を確認してみてください
print(len(F_abs_amp))
何で、下記を2回実行してるのでしょうか?
> F=np.fft.fft(f)
F_abs=np.abs(F)
F_abs_amp = F_abs / N * 2
F_abs_amp[0] = F_abs_amp[0] / 2
jbpb0様 2回実行している理由はただの消し忘れのため本コードでは削除しました。また自分の方でも解決できないかとコード修正に取り組んでいたところ新たなエラーが出てしまいました...コード自体を変更はしていないのですが、元データ(ここでは"observationdata")のある値を0にするなどの変更を行ったことが原因かもしれません...(他に修正した心当たりがないため)
またご提示して頂いたコードを試したいのですがFFTに辿り着く前にエラーが出てしまっている状況です。エラー内容については更新させていただきました。
jbpb0様 上記の問題自己解決しました。jbpb0様のおっしゃる通りサイズが違っていたのだろうと思われます。
回答2件
あなたの回答
tips
プレビュー
