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

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

ただいまの
回答率

90.38%

  • Python

    12885questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 361

monolista

score 1

前提・実現したいこと

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や行列に直すことは可能です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

import pandas as pd

# 仮データ作成
text = """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"""

through_line = 2 # 検出中スルー幅(本来は100)
threshold = 0.05 # 閾値の設定

text = text.split('\n')
text = [i.split() for i in text]
df = pd.DataFrame(text)
df[0] = df[0].apply(float)
df[1] = df[1].apply(float) # ①ここでfloat型のdf完成

df[2] = df[0].shift() # ②shiftカラムをつくる
df[3] = abs(df[2] - df[0]) # ③絶対値差カラムつくる

threshold_list = [] # ④閾値を超えたindexの検出
for i, j in enumerate(list(df[3])):
    if j >= threshold: # 閾値の判断
        threshold_list.append(i)

a = 0 # 検出中判断の仮変数(この変数で、2重検出を除く)
last_list = [] # ⑤最終の開始indexリスト
for i in threshold_list:
    if a <= i: # 前回の検出中かどうか
        last_list.append(i)
        a = i+through_line # 検出中の同時出現スルー幅設定

final_answer = [] # ⑥最終の数値リストのリスト
for i in last_list:
    final_answer.append(list(df[0])[i:i+through_line]) # スルー幅のリストを抽出

print(last_list) # 最終の開始indexリスト
print(final_answer) # 最終の数値リストのリスト

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/15 20:16

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

    キャンセル

  • 2019/01/15 20:31

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

    キャンセル

+1

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

と、こんなもんですねー


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/11 14:47

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

    キャンセル

  • 2019/01/11 15:39

    確かに!

    キャンセル

0

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/11 14:48

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

    キャンセル

  • 2019/01/11 15:21

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

    キャンセル

0

会心の一撃

from collections import deque
from weakref import WeakSet


threshold = 0.01
numrecords = 100

with open("ichi.tsv") as fp:
    ttl = deque(maxlen=numrecords)
    bucket = WeakSet()

    last = next(fp)
    for curr in fp:
        delta = abs(float(curr.split()[0]) - float(last.split()[0]))
        if delta > threshold:
            new_fp = open("ichi-from-{}-{}.tsv".format(*curr.split()), "w")
            bucket.add(new_fp)
            ttl.append(new_fp)
        else:
            ttl.append(None)

        for new_fp in bucket:
            new_fp.write(curr)
            new_fp.flush()
            del new_fp

        last = curr

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    12885questions

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