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

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

ただいまの
回答率

88.59%

python バッチ時系列データのカウント

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 464

hidemomo

score 29

 実現したいこと

ある変数をバッチ処理/時系列で取得しています。
その際、下記2点の処理を行いたいです。(いずれが良いかは未決)
1)1秒間隔の連続データが続く間を「1回」とする
2)上記1かつ1バッチの変数に変化(主に減少)があった場合を「1回」とする。

 データ構造

datetime            val
0    2018-10-18T00:00:00    350
1    2018-10-18T00:00:10    350
2    2018-10-18T00:00:11    350
3    2018-10-18T00:00:12    350
4    2018-10-18T00:00:13    350
5    2018-10-18T00:00:14    350
6    2018-10-18T00:00:15    350
7    2018-10-18T00:00:16    350
8    2018-10-18T00:00:17    350
9    2018-10-18T00:00:18    350
10    2018-10-18T00:00:19    350
11    2018-10-18T00:01:00    350
12    2018-10-18T00:01:44    350
13    2018-10-18T00:01:45    350
14    2018-10-18T00:01:46    350
15    2018-10-18T00:01:47    350
16    2018-10-18T00:01:48    350
17    2018-10-18T00:01:49    350
18    2018-10-18T00:01:50    350
19    2018-10-18T00:01:51    350
20    2018-10-18T00:01:52    350
21    2018-10-18T00:01:53    38
22    2018-10-18T00:02:00    38
23    2018-10-18T00:03:00    38
24    2018-10-18T00:03:14    38
25    2018-10-18T00:03:15    38
26    2018-10-18T00:03:16    38
27    2018-10-18T00:03:17    38
28    2018-10-18T00:03:18    38
29    2018-10-18T00:03:19    38
30    2018-10-18T00:03:20    38
31    2018-10-18T00:03:21    38
32    2018-10-18T00:03:22    38
33    2018-10-18T00:03:23    0

 目的からのデータ詳細説明

1)1秒間隔の連続データが続く間を「1回」とする。
1行目から10行目を「1」、12行目から21行目までを「2」、24行目から33行目までを「3」としたい。

2)上記1かつ1バッチの変数に変化(主に減少)があった場合を「1回」とする。
※1バッチ間で変数初値と終値に差があることが前提となります。
1行目から10行目は対象外、12行目から21行目までを「1」、24行目から33行目までを「2」としたい。

 環境

windows10
python:3.6

 試行してみたこと

mapを使い、手動で回数を振ることも考えましたが膨大なデータセットでは必ずミスをします。
何とかプログラミングで解決したいと考えていますのでご教授いただけると幸甚です。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

とりあえずこんな感じで書けます
グループID を1からふるのが意外と面倒くさいです

import pandas as pd
import io

data="""
,datetime,val
0,2018-10-18T00:00:00,350
1,2018-10-18T00:00:10,350
2,2018-10-18T00:00:11,350
3,2018-10-18T00:00:12,350
4,2018-10-18T00:00:13,350
5,2018-10-18T00:00:14,350
6,2018-10-18T00:00:15,350
7,2018-10-18T00:00:16,350
8,2018-10-18T00:00:17,350
9,2018-10-18T00:00:18,350
10,2018-10-18T00:00:19,350
11,2018-10-18T00:01:00,350
12,2018-10-18T00:01:44,350
13,2018-10-18T00:01:45,350
14,2018-10-18T00:01:46,350
15,2018-10-18T00:01:47,350
16,2018-10-18T00:01:48,350
17,2018-10-18T00:01:49,350
18,2018-10-18T00:01:50,350
19,2018-10-18T00:01:51,350
20,2018-10-18T00:01:52,350
21,2018-10-18T00:01:53,38
22,2018-10-18T00:02:00,38
23,2018-10-18T00:03:00,38
24,2018-10-18T00:03:14,38
25,2018-10-18T00:03:15,38
26,2018-10-18T00:03:16,38
27,2018-10-18T00:03:17,38
28,2018-10-18T00:03:18,38
29,2018-10-18T00:03:19,38
30,2018-10-18T00:03:20,38
31,2018-10-18T00:03:21,38
32,2018-10-18T00:03:22,38
33,2018-10-18T00:03:23,0
"""

df = pd.read_csv(io.StringIO(data),index_col=0,parse_dates=['datetime'])
# 1秒より大きく間隔が開いている箇所でグループ分け
df['grp'] = (df.datetime.diff() > pd.Timedelta('1 sec')).cumsum()
# 条件1:グループのサイズが1より大きい
cond1 = (df.groupby('grp').size() > 1)
# 条件2:条件1に加えグループないで値に変動がある
tmp = df.groupby('grp')['val'].apply(lambda d: d.max() != d.min())
cond2 = pd.concat([cond1,tmp],axis=1).all(axis=1)
# 条件1用のグループIDをふる
grp_id1 = df[df.grp.map(cond1)].groupby('grp').ngroup().rename('grp1') + 1
# 条件2用のグループIDをふる
grp_id2 = df[df.grp.map(cond2)].groupby('grp').ngroup().rename('grp2') + 1
# 作成したグループIDを元のデータと
print(pd.concat([df,grp1,grp2], axis=1))
#              datetime  val  grp  grp1  grp2
#0  2018-10-18 00:00:00  350    0   NaN   NaN
#1  2018-10-18 00:00:10  350    1   1.0   NaN
#2  2018-10-18 00:00:11  350    1   1.0   NaN
#3  2018-10-18 00:00:12  350    1   1.0   NaN
#4  2018-10-18 00:00:13  350    1   1.0   NaN
#5  2018-10-18 00:00:14  350    1   1.0   NaN
#6  2018-10-18 00:00:15  350    1   1.0   NaN
#7  2018-10-18 00:00:16  350    1   1.0   NaN
#8  2018-10-18 00:00:17  350    1   1.0   NaN
#9  2018-10-18 00:00:18  350    1   1.0   NaN
#10 2018-10-18 00:00:19  350    1   1.0   NaN
#11 2018-10-18 00:01:00  350    2   NaN   NaN
#12 2018-10-18 00:01:44  350    3   2.0   1.0
#13 2018-10-18 00:01:45  350    3   2.0   1.0
#14 2018-10-18 00:01:46  350    3   2.0   1.0
#15 2018-10-18 00:01:47  350    3   2.0   1.0
#16 2018-10-18 00:01:48  350    3   2.0   1.0
#17 2018-10-18 00:01:49  350    3   2.0   1.0
#18 2018-10-18 00:01:50  350    3   2.0   1.0
#19 2018-10-18 00:01:51  350    3   2.0   1.0
#20 2018-10-18 00:01:52  350    3   2.0   1.0
#21 2018-10-18 00:01:53   38    3   2.0   1.0
#22 2018-10-18 00:02:00   38    4   NaN   NaN
#23 2018-10-18 00:03:00   38    5   NaN   NaN
#24 2018-10-18 00:03:14   38    6   3.0   2.0
#25 2018-10-18 00:03:15   38    6   3.0   2.0
#26 2018-10-18 00:03:16   38    6   3.0   2.0
#27 2018-10-18 00:03:17   38    6   3.0   2.0
#28 2018-10-18 00:03:18   38    6   3.0   2.0
#29 2018-10-18 00:03:19   38    6   3.0   2.0
#30 2018-10-18 00:03:20   38    6   3.0   2.0
#31 2018-10-18 00:03:21   38    6   3.0   2.0
#32 2018-10-18 00:03:22   38    6   3.0   2.0
#33 2018-10-18 00:03:23    0    6   3.0   2.0

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/26 11:48

    夜分遅くのご回答、大変ありがとうございました!とても参考になります。

    ここから、様々な条件(va_1.min=0ならgrpを再度1から降りなおす、日付が変わったらgrpを再度1から降りなおすなど)でグループ分けに挑戦しようと思います。
    スタックした際は、改めて質問をアップさせていただきます。

    本当にありがとうございました!

    キャンセル

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

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

関連した質問

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