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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

1108閲覧

時系列のデータから高速にデータを取り出して結合するには(SQL, pandas)

akirajyunia

総合スコア2

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/08/13 09:28

編集2021/08/13 12:03

前提・実現したいこと

以下のような時系列のデータ(X)があった際に、先頭フラグ(Y)を基準として、そこから何サンプル毎、というような取り出し方をして新しいデータテーブルを作る際に、一発で変換する方法はありますでしょうか。SQL, pandas問いません。現在、for文を用いてstackをしていますが、処理が遅く困っています。

対象のデータ

X = 256, 250, 240, 230, 240, 244, 250, 260, 255, 264
Y = 1, 0, 0, 0, 1, 0, 0, 1, 0, 0

Y = 1の位置から3つ毎のデータを取得してテーブルにする

実現したい変換先データ

X = 256, 250, 240, 240, 244, 250, 260, 255, 264
L = 1, 1, 1, 2, 2, 2, 3, 3, 3

※Lは新データの番号

###現在のstack思考のコード

python

1import pandas as pd 2 3X = [256, 250, 240, 230, 240, 244, 250, 260, 255, 264] 4Y = [ 1, 0, 0, 0, 1, 0, 0, 1, 0, 0] 5 6data = pd.DataFrame() 7data["X"] = X 8data["Y"] = Y 9 10print(data) 11 12newX = [] 13newL = [] 14for label, index in enumerate(data[data["Y"]==1].index): 15 newX.extend(data["X"][index:index+3].values) 16 for i in range(3): 17 newL.append(label) 18 19newData = pd.DataFrame() 20newData["X"] = newX 21newData["L"] = newL 22print(newData) 23

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

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

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

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

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

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

meg_

2021/08/13 09:46

> 現在、for文を用いてstackをしていますが、処理が遅く困っています。 そちらのコードは掲載できますか?
aokikenichi

2021/08/13 09:50

仕様がよくわかりません 「1の位置から3つ毎のデータ」とはなんでしょうか Y=1の位置とすると256, 240, 260, ... そのから3つ毎とすると 256, 250, 240, 240, 244, 250, 260, 255, 264となるかと思いますが
akirajyunia

2021/08/13 12:06 編集

ご回答ありがとうございます。現状のstack思考のpythonコードを追記しました。 Y=1の地点を見つけ、それを起点に3サンプル抽出し、stackしてく、というコードになっています。
guest

回答3

0

ベストアンサー

ppaulさんと同様にcumsum()でLを計算したあと、Lでグループ化(groupby)して、先頭3行を取り出せば(head(3))いいです。

python

1import pandas as pd 2 3df = pd.DataFrame({ 4 'X': [256, 250, 240, 230, 240, 244, 250, 260, 255, 264], 5 'Y': [ 1, 0, 0, 0, 1, 0, 0, 1, 0, 0]}) 6 7df['L'] = (df['Y'] == 1).cumsum() 8 9df_new = df[df['L'] > 0].groupby('L').head(3)

投稿2021/08/13 12:35

bsdfan

総合スコア4794

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

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

akirajyunia

2021/08/13 13:48

ありがとうございました。cumsum()に加えて、head()を用いれば出来たのですね。 for文を使うことなく書く事が出来ました。処理も早そうです。皆様ありがとうございました。
guest

0

numpyを使用した例です。

Python

1import pandas as pd 2 3X = [256, 250, 240, 230, 240, 244, 250, 260, 255, 264] 4Y = [ 1, 0, 0, 0, 1, 0, 0, 1, 0, 0] 5 6data = pd.DataFrame() 7data["X"] = X 8data["Y"] = Y 9 10print(data) 11# X Y 12#0 256 1 13#1 250 0 14#2 240 0 15#3 230 0 16#4 240 1 17#5 244 0 18#6 250 0 19#7 260 1 20#8 255 0 21#9 264 0 22 23X2 = np.array(X) 24Y2 = np.array(Y) 25newX = np.hstack([X2[i:i+3] for i in np.where(Y2 == 1)[0]]) 26newL = np.hstack([[i]*3 for i in range(len(np.where(Y2 == 1)[0]))]) 27 28newData = pd.DataFrame() 29newData["X"] = newX 30newData["L"] = newL 31print(newData) 32# X L 33#0 256 0 34#1 250 0 35#2 240 0 36#3 240 1 37#4 244 1 38#5 250 1 39#6 260 2 40#7 255 2 41#8 264 2

投稿2021/08/13 12:30

meg_

総合スコア10760

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

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

0

普通、こういうので求められるのは累積和なので、元データを修正してみました。

python

1>>> print(df) 2 X Y L 30 256 1 1 41 250 0 1 52 240 0 1 63 240 1 2 74 255 0 2 85 250 0 2 96 260 1 3 107 255 0 3 118 264 0 3 12>>> df['L'] = df['Y'].cumsum() 13>>> print(df) 14 X Y L 150 256 1 1 161 250 0 1 172 240 0 1 183 240 1 2 194 255 0 2 205 250 0 2 216 260 1 3 227 255 0 3 238 264 0 3

求めるものがこれなら、pandasで累積和・累積積(cumsum, cumprod, cummax, cummin) をお読みください。

投稿2021/08/13 11:28

ppaul

総合スコア24670

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

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

akirajyunia

2021/08/13 12:12

ご回答ありがとうございます。cumsum等、今後使えそうです。 今回の場合ですと、元データ4サンプル目の230が、新しく作成するテーブルに含まれてしまいます。 今後の展開としては、cumsumをして、Lの重複が3個以上の物を排除するとかですかね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問