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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

1000閲覧

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

hidemomo

総合スコア31

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2018/10/25 08:53

実現したいこと

ある変数をバッチ処理/時系列で取得しています。
その際、下記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を使い、手動で回数を振ることも考えましたが膨大なデータセットでは必ずミスをします。
何とかプログラミングで解決したいと考えていますのでご教授いただけると幸甚です。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

Python

1import pandas as pd 2import io 3 4data=""" 5,datetime,val 60,2018-10-18T00:00:00,350 71,2018-10-18T00:00:10,350 82,2018-10-18T00:00:11,350 93,2018-10-18T00:00:12,350 104,2018-10-18T00:00:13,350 115,2018-10-18T00:00:14,350 126,2018-10-18T00:00:15,350 137,2018-10-18T00:00:16,350 148,2018-10-18T00:00:17,350 159,2018-10-18T00:00:18,350 1610,2018-10-18T00:00:19,350 1711,2018-10-18T00:01:00,350 1812,2018-10-18T00:01:44,350 1913,2018-10-18T00:01:45,350 2014,2018-10-18T00:01:46,350 2115,2018-10-18T00:01:47,350 2216,2018-10-18T00:01:48,350 2317,2018-10-18T00:01:49,350 2418,2018-10-18T00:01:50,350 2519,2018-10-18T00:01:51,350 2620,2018-10-18T00:01:52,350 2721,2018-10-18T00:01:53,38 2822,2018-10-18T00:02:00,38 2923,2018-10-18T00:03:00,38 3024,2018-10-18T00:03:14,38 3125,2018-10-18T00:03:15,38 3226,2018-10-18T00:03:16,38 3327,2018-10-18T00:03:17,38 3428,2018-10-18T00:03:18,38 3529,2018-10-18T00:03:19,38 3630,2018-10-18T00:03:20,38 3731,2018-10-18T00:03:21,38 3832,2018-10-18T00:03:22,38 3933,2018-10-18T00:03:23,0 40""" 41 42df = pd.read_csv(io.StringIO(data),index_col=0,parse_dates=['datetime']) 43# 1秒より大きく間隔が開いている箇所でグループ分け 44df['grp'] = (df.datetime.diff() > pd.Timedelta('1 sec')).cumsum() 45# 条件1:グループのサイズが1より大きい 46cond1 = (df.groupby('grp').size() > 1) 47# 条件2:条件1に加えグループないで値に変動がある 48tmp = df.groupby('grp')['val'].apply(lambda d: d.max() != d.min()) 49cond2 = pd.concat([cond1,tmp],axis=1).all(axis=1) 50# 条件1用のグループIDをふる 51grp_id1 = df[df.grp.map(cond1)].groupby('grp').ngroup().rename('grp1') + 1 52# 条件2用のグループIDをふる 53grp_id2 = df[df.grp.map(cond2)].groupby('grp').ngroup().rename('grp2') + 1 54# 作成したグループIDを元のデータと 55print(pd.concat([df,grp1,grp2], axis=1)) 56# datetime val grp grp1 grp2 57#0 2018-10-18 00:00:00 350 0 NaN NaN 58#1 2018-10-18 00:00:10 350 1 1.0 NaN 59#2 2018-10-18 00:00:11 350 1 1.0 NaN 60#3 2018-10-18 00:00:12 350 1 1.0 NaN 61#4 2018-10-18 00:00:13 350 1 1.0 NaN 62#5 2018-10-18 00:00:14 350 1 1.0 NaN 63#6 2018-10-18 00:00:15 350 1 1.0 NaN 64#7 2018-10-18 00:00:16 350 1 1.0 NaN 65#8 2018-10-18 00:00:17 350 1 1.0 NaN 66#9 2018-10-18 00:00:18 350 1 1.0 NaN 67#10 2018-10-18 00:00:19 350 1 1.0 NaN 68#11 2018-10-18 00:01:00 350 2 NaN NaN 69#12 2018-10-18 00:01:44 350 3 2.0 1.0 70#13 2018-10-18 00:01:45 350 3 2.0 1.0 71#14 2018-10-18 00:01:46 350 3 2.0 1.0 72#15 2018-10-18 00:01:47 350 3 2.0 1.0 73#16 2018-10-18 00:01:48 350 3 2.0 1.0 74#17 2018-10-18 00:01:49 350 3 2.0 1.0 75#18 2018-10-18 00:01:50 350 3 2.0 1.0 76#19 2018-10-18 00:01:51 350 3 2.0 1.0 77#20 2018-10-18 00:01:52 350 3 2.0 1.0 78#21 2018-10-18 00:01:53 38 3 2.0 1.0 79#22 2018-10-18 00:02:00 38 4 NaN NaN 80#23 2018-10-18 00:03:00 38 5 NaN NaN 81#24 2018-10-18 00:03:14 38 6 3.0 2.0 82#25 2018-10-18 00:03:15 38 6 3.0 2.0 83#26 2018-10-18 00:03:16 38 6 3.0 2.0 84#27 2018-10-18 00:03:17 38 6 3.0 2.0 85#28 2018-10-18 00:03:18 38 6 3.0 2.0 86#29 2018-10-18 00:03:19 38 6 3.0 2.0 87#30 2018-10-18 00:03:20 38 6 3.0 2.0 88#31 2018-10-18 00:03:21 38 6 3.0 2.0 89#32 2018-10-18 00:03:22 38 6 3.0 2.0 90#33 2018-10-18 00:03:23 0 6 3.0 2.0

投稿2018/10/25 16:47

magichan

総合スコア15898

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

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

hidemomo

2018/10/26 02:48

夜分遅くのご回答、大変ありがとうございました!とても参考になります。 ここから、様々な条件(va_1.min=0ならgrpを再度1から降りなおす、日付が変わったらgrpを再度1から降りなおすなど)でグループ分けに挑戦しようと思います。 スタックした際は、改めて質問をアップさせていただきます。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問