質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

461閲覧

[データ解析超初心者]やりたいことは明確だけどどう実現すればいいかわからない。

monolista

総合スコア11

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/11 05:12

編集2019/01/11 05:45

前提・実現したいこと

Python3を使用しています。(Numpy,pandasインストール済み)
現在、時間と位置を記録するプログラムがあります。
0.05秒刻みで位置のデータを出力しています。
このプログラムは、TSVファイルで出力するようになっています。
実際は数千行になります。
以下その内容。(左が位置、右列が時間です。)

3.2741 0
3.2741 0.05
3.218 0.1
3.218 0.15
3.218 0.2
3.2741 0.25
3.2741 0.3
3.2741 0.35
3.218 0.4
3.2741 0.45
3.2741 0.5
3.218 0.55
3.218 0.6
3.218 0.65

0.05秒間に急激な変化をしたときのみを検知して、そこから100行ほどを別ファイルに出力する
といったプログラムを書きたいと思っています。
例えば100秒間のうち3回衝撃を与えると、15秒3回分(一回分=0.05*100=5秒)のファイルがそれぞれ出力される
というプログラムを書きたいです。
急激な変化と判断する基準は以下の通りです。
0.05秒間の位置の変化が閾値より大きくなったら急激な変化とします。
1行前の位置から現在見ている値を引いた絶対値をXとすると
if X>10:などの条件式にして検知する予定です。

出力する100行の中に急激な変化が起こってもそれは無視して、出力した後の101行目にあたる場所から再度解析する
というようなプログラムにする予定です。

何行もあるデータを比べる方法がわかりません。
例えば
1行目のデータと2行目のデータ持ってきて比べます。

急な変化なし。2行目と3行目のデータを持ってきて比べます。

「〇〇.TSV」ファイルの何行目のデータを持ってきてその数値を比べる段階の
持ってくる方法がわかりません。

どのような書き方をすれば実現できるでしょうか。
初心者なのでなるべく細かく教えていただけると助かります。
よろしくお願いします。

試したこと

for文をうまく使えばできるとのアドバイスをもらい考えていますが
全く分かりません。

補足情報(FW/ツールのバージョンなど)

現在、位置、時間のデータはTSV形式ですが、CSVや行列に直すことは可能です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

・データを0.5秒ごとにまとめる
・あなたのいう「急激な変化」なるものを判定する
・その結果がtrueなら、その位置から100行をファイルに保存する
・データの最後まで繰り返し

と、こんなもんですねー


・ファイルを1行分のテキストを読み出す
・TABコードでテキストを分割
・分割したのをそれぞれ数値変換
・それでなんかする

投稿2019/01/11 05:39

編集2019/01/11 05:55
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

monolista

2019/01/11 05:47

質問の要点が不明確でした。 「〇〇.TSV」ファイルの何行目のデータを持ってきてその数値を比べる段階の持ってくる方法がわかりません。 追記しているのでもしご存知であればご教授頂けると助かります。
退会済みユーザー

退会済みユーザー

2019/01/11 06:39

確かに!
guest

0

ベストアンサー

python

1import pandas as pd 2 3# 仮データ作成 4text = """3.2741 0 53.2741 0.05 63.218 0.1 73.218 0.15 83.218 0.2 93.2741 0.25 103.2741 0.3 113.2741 0.35 123.218 0.4 133.2741 0.45 143.2741 0.5 153.218 0.55 163.218 0.6 173.218 0.65""" 18 19through_line = 2 # 検出中スルー幅(本来は100) 20threshold = 0.05 # 閾値の設定 21 22text = text.split('\n') 23text = [i.split() for i in text] 24df = pd.DataFrame(text) 25df[0] = df[0].apply(float) 26df[1] = df[1].apply(float) # ①ここでfloat型のdf完成 27 28df[2] = df[0].shift() # ②shiftカラムをつくる 29df[3] = abs(df[2] - df[0]) # ③絶対値差カラムつくる 30 31threshold_list = [] # ④閾値を超えたindexの検出 32for i, j in enumerate(list(df[3])): 33 if j >= threshold: # 閾値の判断 34 threshold_list.append(i) 35 36a = 0 # 検出中判断の仮変数(この変数で、2重検出を除く) 37last_list = [] # ⑤最終の開始indexリスト 38for i in threshold_list: 39 if a <= i: # 前回の検出中かどうか 40 last_list.append(i) 41 a = i+through_line # 検出中の同時出現スルー幅設定 42 43final_answer = [] # ⑥最終の数値リストのリスト 44for i in last_list: 45 final_answer.append(list(df[0])[i:i+through_line]) # スルー幅のリストを抽出 46 47print(last_list) # 最終の開始indexリスト 48print(final_answer) # 最終の数値リストのリスト

プロセス
①pandasのfloat型のDataFrameを作る。
②shiftカラムを作って1段ずらす。
③その差のカラムを作る。(絶対値にする)
④差カラムをリストで取り出し、for分で回し、閾値を超えるインデックスを検出する。
⑤検出したインデックスから、スルーすべき検出を取り除く。
⑥取り除いたインデックスから検出したい長さのリストを検出する。

といった、感じで、jupyter notebookでやりました。
かなりマジで考えたんですが、酔ってやったんで、こらあかんって思ったときはスルーしてください。
(そのときは、どうぞ、あしからず)

投稿2019/01/11 15:58

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

monolista

2019/01/15 11:16

丁寧に教えていただきありがとうございます。 プログラミングの知識が浅いためまだ、理解再現が出来ない部分があります。 今週書いていただいたコードを理解しながら再現していこうと思いますありがとうございました。 また再現出来たら報告させてもらいます。
退会済みユーザー

退会済みユーザー

2019/01/15 11:31

参考になったのなら、うれしいですが、 再現できてないのは残念です。 再現できない箇所の状況を教えてもらえたら、 お手伝いさせてもらいますんで、コメントしてください。 僕もまだまだ経験浅いんでお役に立てるかわかりませんが。 うまくいくといいですね^^
guest

0

会心の一撃

python

1from collections import deque 2from weakref import WeakSet 3 4 5threshold = 0.01 6numrecords = 100 7 8with open("ichi.tsv") as fp: 9 ttl = deque(maxlen=numrecords) 10 bucket = WeakSet() 11 12 last = next(fp) 13 for curr in fp: 14 delta = abs(float(curr.split()[0]) - float(last.split()[0])) 15 if delta > threshold: 16 new_fp = open("ichi-from-{}-{}.tsv".format(*curr.split()), "w") 17 bucket.add(new_fp) 18 ttl.append(new_fp) 19 else: 20 ttl.append(None) 21 22 for new_fp in bucket: 23 new_fp.write(curr) 24 new_fp.flush() 25 del new_fp 26 27 last = curr

投稿2019/01/11 07:42

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

0.05秒間に急激な変化をしたとき

なにをもって急激な変化とするのでしょうか。

連続して急激な変化が起きた場合の扱いはどうしましょう。100行の間でまた急激な変化があったら?

別ファイルは急激な変化ごとに生成するのでしょうか。それとも、1つのファイルにまとめたいのでしょうか。

など、不明確な点が多いのでもう少し具体的にしてください。

投稿2019/01/11 05:20

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

monolista

2019/01/11 05:48

質問の要点が不明確でした。 「〇〇.TSV」ファイルの何行目のデータを持ってきてその数値を比べる段階の持ってくる方法がわかりません。 追記しているのでもしご存知であればご教授頂けると助かります。
hayataka2049

2019/01/11 06:21

説明を読んでもよく意図が伝わらなかったので、追加で説明していただけると的確に回答できるかもしれません。 また、現時点で行えていることも記載していただけると助かります(pandasで読み込んでDataFrameに変換することはできている、DataFrameにして1データずつループさせることはできている、とかを想定しています)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問