実現したいこと
github(https://github.com/hobby-overflow/LF_HF_Monitor/blob/master/LF_HF_Monitor.py)
を実行したいです。
データとして、写真のようなデータフレームがあります。
このデータを使い下記のコードを実行したいのですが、上手くいかないです。
変更するべき点を教えて頂きたいです。
githubコード
python
1import pandas as pd 2import numpy as np 3import datetime as dt 4from scipy.signal import lombscargle, welch 5from scipy.interpolate import splrep, splev 6import pandas.tseries.offsets as offsets 7from dateutil import parser 8from pytz import timezone 9 10# csv読み込み 11df = pd.read_csv("./data/2019-06-23.csv") 12df = df.drop(0) 13# カラムの名前を変更 14df = df.rename(columns={"Unnamed: 0": "date", "value": "hr"}) 15df["test"] = [(dt.datetime.strptime(df["date"][i + 1], "%Y-%m-%d %H:%M:%S")) for i in range(0, len(df))] 16start_time = df.iloc[0, 0] 17st = int(parser.parse(start_time).timestamp()) 18df["elapsed_time"] = [int(parser.parse(i).timestamp()) - st for i in df["date"]] 19df["rri"] = [(60 * 1000 / int(i)) for i in df["hr"]] 20df.set_index("date", inplace=True) 21 22''' 23for i in df.index: 24 datas = df.loc[i - offsets.Minute():i] 25''' 26 27# print(df[(df["test"] > dt.datetime(2019,6,13,13)) & (df["test"] < dt.datetime(2019,6,13,14))]) 28 29def dateRange(h, st, en): 30 year = 2019 31 mouth = 6 32 day = 13 33 34 start = dt.datetime(year, mouth, day, h, st) 35 end = dt.datetime(year, mouth, day, h, en) 36 return df[(df["test"] > start) & (df["test"] < end)] 37 38print("Test") 39 40# 一分間隔でグループにする 41data = [] 42 43# 範囲指定で取り出す 44# print(df[(df["test"] > dt.datetime(2019,6,13,0,1)) & (df["test"] < dt.datetime(2019,6,13,0,2))]) 45 46time_data = df["test"][5727:] 47cnt = 0 48# print(df[(df["test"] > dt.datetime(2019,6,13,14) - offsets.Minute(1))]) 49print("Start") 50for i in time_data: 51 cnt = 0 52 # 一分前 53 prev_time = i - offsets.Minute(1) 54 # 検索スタート位置 55 now_time = i 56 datas = df[(df["test"] < now_time) & (df["test"] > prev_time)] 57 if len(datas) <= 1: 58 print("Nothing") 59 continue 60 time = datas["elapsed_time"] 61 t = np.array(time) 62 63 if len(t) <= 1: 64 print("LF_HF is Zero") 65 LF_HF = 0 66 else: 67 68 # calc Start 69 rri = datas["rri"] 70 ibi = np.array(rri) 71 72 phi = round((4.0 * np.pi), 0) 73 f = np.linspace(0.001, phi, 120000) 74 75 Pgram = lombscargle(t, ibi, f, normalize=True) 76 77 vlf = 0.04 78 lf = 0.15 79 hf = 0.4 80 Fs = 250 81 82 lf_freq_band = (f >= vlf) & (f <= lf) 83 hf_freq_band = (f >= lf) & (f <= hf) 84 85 dy = 1.0 / Fs 86 LF = np.trapz(y=abs(Pgram[lf_freq_band]), x=None, dx=dy) 87 HF = np.trapz(y=abs(Pgram[hf_freq_band]), x=None, dx=dy) 88 LF_HF = float(LF) / HF 89 df.at[str(i), "lf_hf"] = LF_HF 90 print(str(i) + " : " + str(LF_HF)) 91 92 print(str(i) + ": " + str(df.at[str(i), "lf_hf"])) 93 94#print(df["lf_hf"]) 95 96# 時 分 秒 97
試したこと
import pandas as pd import numpy as np import datetime as dt from scipy.signal import lombscargle, welch from scipy.interpolate import splrep, splev import pandas.tseries.offsets as offsets from dateutil import parser from pytz import timezone # csv読み込み #df = pd.read_csv("C:\Users\ csvデータ\HeartRate_0622 (1).csv") #df = df.drop(0) # カラムの名前を変更 df = df.rename(columns={"Datetime": "date", "HeartRate": "hr"}) df["test"] = [(dt.datetime.strptime(df["date"][i + 1], "%Y-%m-%d %H:%M:%S")) for i in range(0, len(df))] start_time = df.iloc[0, 0] st = int(parser.parse(start_time).timestamp()) df["elapsed_time"] = [int(parser.parse(i).timestamp()) - st for i in df["date"]] df["rri"] = [(60 * 1000 / int(i)) for i in df["hr"]] df.set_index("date", inplace=True) ''' for i in df.index: datas = df.loc[i - offsets.Minute():i] ''' # print(df[(df["test"] > dt.datetime(2019,6,13,13)) & (df["test"] < dt.datetime(2019,6,13,14))]) def dateRange(h, st, en): year = 2021 mouth = 6 day = 22 start = dt.datetime(year, mouth, day, h, st) end = dt.datetime(year, mouth, day, h, en) return df[(df["test"] > start) & (df["test"] < end)] print("Test") # 一分間隔でグループにする data = [] # 範囲指定で取り出す # print(df[(df["test"] > dt.datetime(2019,6,13,0,1)) & (df["test"] < dt.datetime(2019,6,13,0,2))]) time_data = df["test"][4758:] cnt = 0 # print(df[(df["test"] > dt.datetime(2019,6,13,14) - offsets.Minute(1))]) print("Start") for i in time_data: cnt = 0 # 一分前 prev_time = i - offsets.Minute(1) # 検索スタート位置 now_time = i datas = df[(df["test"] < now_time) & (df["test"] > prev_time)] if len(datas) <= 1: print("Nothing") continue time = datas["elapsed_time"] t = np.array(time) if len(t) <= 1: print("LF_HF is Zero") LF_HF = 0 else: # calc Start rri = datas["rri"] ibi = np.array(rri) phi = round((4.0 * np.pi), 0) f = np.linspace(0.001, phi, 120000) Pgram = lombscargle(t, ibi, f, normalize=True) vlf = 0.04 lf = 0.15 hf = 0.4 Fs = 250 lf_freq_band = (f >= vlf) & (f <= lf) hf_freq_band = (f >= lf) & (f <= hf) dy = 1.0 / Fs LF = np.trapz(y=abs(Pgram[lf_freq_band]), x=None, dx=dy) HF = np.trapz(y=abs(Pgram[hf_freq_band]), x=None, dx=dy) LF_HF = float(LF) / HF df.at[str(i), "lf_hf"] = LF_HF print(str(i) + " : " + str(LF_HF)) print(str(i) + ": " + str(df.at[str(i), "lf_hf"])) #print(df["lf_hf"]) # 時 分 秒
#エラー The above exception was the direct cause of the following exception: KeyError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_20436/2118628457.py in <module> 13 # カラムの名前を変更 14 df = df.rename(columns={"Datetime": "date", "HeartRate": "hr"}) ---> 15 df["test"] = [(dt.datetime.strptime(df["date"][i + 1], "%Y-%m-%d %H:%M:%S")) for i in range(0, len(df))] 16 start_time = df.iloc[0, 0] ... -> 3363 raise KeyError(key) from err 3364 3365 if is_scalar(key) and isna(key) and not self.hasnans: KeyError: 'date'
> 上手くいかないです。
どのように上手くいかないのかを、具体的に
Test
Start
しか表示されないです。
time_data の中身が空(empty)なのではないでしょうか。
中身を入れて実行しましたが、型変換によるエラーが止まらない状態です。
このコードでは、どのようなCSVを読み込めば実行できるのでしょうか。具体例を挙げて頂けると助かります。
こんな感じで、(縦に)5728行以上あれば、たぶん質問の「githubコード」では動くと思う
(動いたとしても、それで正しいかどうかは不明)
,"value"
"2021-06-22 02:21:20",76
"2021-06-22 02:21:25",80
"2021-06-22 02:21:30",82
"2021-06-22 02:21:32",83
"2021-06-22 02:21:36",85
"2021-06-22 02:21:42",85
"2021-06-22 02:21:49",90
"2021-06-22 02:21:53",91
"2021-06-22 02:21:56",89
全体をみていないのでそこが問題かどうかわかりませんが、
df.set_index("date", inplace=True)
とdateをindexにセットしておきながら、
time_data = df["test"][5727:]
で、数値でインデックスしているところはおかしいです。
回答ありがとうございます。
jbpb0さんのようにcsvを入れましたが、エラーがでてきます。
質問内容にcsvとエラーを更新しておきます。
解決方法教えて頂きたいです。
> jbpb0さんのようにcsvを入れましたが、エラーがでてきます。
私は一つ前のコメントに書いたように、質問の「githubコード」で読み込んで実行できるようにcsvファイルを作って、コードを実行して確認しました
以下に、私が確認した状態を再現できる手順を書くので、その通りに実行してみてください
まず、私の一つ前のコメントに書いてあるままで、一文字も変えずにcsvファイルを作ってください
行数も増やさず同じままで大丈夫です
キーボード入力をすると入力ミスするかもしれないので、コピペしてファイルを作ってください
次に、質問の「githubコード」で、読み込むcsvファイルのパスを上記作成したファイルに合わせて変更してください
また、下記を変更してください
time_data = df["test"][5727:]
↓ 変更 (5728行以上のcsvファイルを用意するのがめんどくさかったので)
time_data = df["test"][2:]
print(df)
をコードの最後に追加
変更したコードを実行したら、エラーは出ずに、下記のように表示されるはずです
念の為に、上記に書いた手順を先ほど再実行して、下記の結果が表示されることを再確認しました
(下記は、実際の表示よりもスペースが減って見えてしまいますが、スペース以外の文字はそのままです)
Test
Start
2021-06-22 02:21:32 : 0.4395318595578673
2021-06-22 02:21:32: 0.4395318595578673
2021-06-22 02:21:36 : 0.4853324822064059
2021-06-22 02:21:36: 0.4853324822064059
2021-06-22 02:21:42 : 0.8148463598934536
2021-06-22 02:21:42: 0.8148463598934536
2021-06-22 02:21:49 : 1.8012289406575295
2021-06-22 02:21:49: 1.8012289406575295
2021-06-22 02:21:53 : 2.534388449813114
2021-06-22 02:21:53: 2.534388449813114
2021-06-22 02:21:56 : 2.4969297976802505
2021-06-22 02:21:56: 2.4969297976802505
hr test elapsed_time rri lf_hf
date
2021-06-22 02:21:25 80 2021-06-22 02:21:25 0 750.000000 NaN
2021-06-22 02:21:30 82 2021-06-22 02:21:30 5 731.707317 NaN
2021-06-22 02:21:32 83 2021-06-22 02:21:32 7 722.891566 0.439532
2021-06-22 02:21:36 85 2021-06-22 02:21:36 11 705.882353 0.485332
2021-06-22 02:21:42 85 2021-06-22 02:21:42 17 705.882353 0.814846
2021-06-22 02:21:49 90 2021-06-22 02:21:49 24 666.666667 1.801229
2021-06-22 02:21:53 91 2021-06-22 02:21:53 28 659.340659 2.534388
2021-06-22 02:21:56 89 2021-06-22 02:21:56 31 674.157303 2.496930
上記が再現できるか、ご確認ください
もしエラーが出たら、どこかの手順に相違点がありますので、手順を今一度ご確認ください
ありがとうございます。
あなたの回答
tips
プレビュー