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

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

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

dateは、date型や日付に関する関数や処理についてのタグです

Python

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

Q&A

解決済

3回答

838閲覧

DataFrame の行を跨ぐ条件設定の方法について

kumatakun

総合スコア7

date

dateは、date型や日付に関する関数や処理についてのタグです

Python

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

0グッド

0クリップ

投稿2021/02/19 06:57

python 初心者です。
pythonで株価分析をしたいと考えております。

CSVで日時、株価(安値)を取り込み、下記の2条件を満たす日時を特定したいと考えております。
(条件1)「前日の株価>当日の株価」
(条件2)「当日の株価<翌日の株価」

下記の例ですと 2月2日、2月4日の抽出をしたいと考えております。

書籍で調べたのですがどのようにすればよいかわからずご質問させてもらいました。
よろしくお願いいたします。

```ここに言語を入力 low

date
2021-01-29 2,771.00
2021-02-01 2,775.00
2021-02-02 2,757.00
2021-02-03 2,794.00
2021-02-04 2,786.00
2021-02-05 2,791.00
2021-02-08 2,810.00
2021-02-09 2,823.00
2021-02-10 2,819.00
2021-02-12 2,806.00

`

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

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

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

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

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

guest

回答3

0

ベストアンサー

shiftを使うと前行および次行の値が取れるので、それらの値をqueryで比較すればよいです。

Python

1import pandas as pd 2from io import StringIO 3 4s = """date,low 52021-01-29,2771.00 62021-02-01,2775.00 72021-02-02,2757.00 82021-02-03,2794.00 92021-02-04,2786.00 102021-02-05,2791.00 112021-02-08,2810.00 122021-02-09,2823.00 132021-02-10,2819.00 142021-02-12,2806.00""" 15df = pd.read_csv(StringIO(s), parse_dates=['date'], index_col=0) 16df['prev'] = df.shift(1)['low'] 17df['next'] = df.shift(-1)['low'] 18 19df2 = df.query('prev > low and low < next') 20print(df2) 21# low prev next 22#date 23#2021-02-02 2757.0 2775.0 2794.0 24#2021-02-04 2786.0 2794.0 2791.0

投稿2021/02/19 07:27

can110

総合スコア38266

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

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

kumatakun

2021/02/19 11:35

大変ありがとうございます。shiftを使用したコードをかけないかと試行錯誤していましたが、queryと組み合わせればよいことがわからなかったです。 大変助かりました。またよろしくお願いいたします。
guest

0

diffとapplyで解いてました。

python

1import pandas as pd 2import io 3 4indata = '''date low 52021-01-29 2771.00 62021-02-01 2775.00 72021-02-02 2757.00 82021-02-03 2794.00 92021-02-04 2786.00 102021-02-05 2791.00 112021-02-08 2810.00 122021-02-09 2823.00 132021-02-10 2819.00 142021-02-12 2806.00''' 15 16with io.StringIO(indata) as f: 17 df = pd.read_csv(f, sep=' +', engine='python', parse_dates=[0], index_col=0) 18 19df2 = df.diff() 20df2['PM'] = df2.apply(lambda x: int(x['low']>0)-int(x['low']<0), axis=1) 21df3 = df2.diff(-1) 22df4 = df[df3['PM']==-2] 23print(df4)

実行結果

python

1>>> print(df4) 2 low 3date 42021-02-02 2757.0 52021-02-04 2786.0

投稿2021/02/19 07:47

編集2021/02/19 08:56
ppaul

総合スコア24666

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

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

kumatakun

2021/02/19 11:33

大変ありがとうございます。diff でこんなに綺麗なコードができることに感動しました。 大変助かりました。また、よろしくお願いいたします。
guest

0

いろいろ手段はあると思いますが、手っ取り早くscipyの極小値取得関数を利用しました。

python3

1import io 2import pandas as pd 3from scipy import signal 4data = """date low 52021-01-29 2,771.00 62021-02-01 2,775.00 72021-02-02 2,757.00 82021-02-03 2,794.00 92021-02-04 2,786.00 102021-02-05 2,791.00 112021-02-08 2,810.00 122021-02-09 2,823.00 132021-02-10 2,819.00 142021-02-12 2,806.00 15""" 16df = pd.read_table(io.StringIO(data), delimiter="\s+") 17# ここまでテストデータの作成、ここから本処理 18 19# 極小値のインデックスを取得 20min_idx = signal.argrelmin(df["low"].to_numpy()) 21print(min_idx) 22# (array([2, 4], dtype=int64),) 23 24for idx in min_idx[0]: 25 print(df.loc[idx]) 26# date 2021-02-02 27# low 2,757.00 28# Name: 2, dtype: object 29# date 2021-02-04 30# low 2,786.00 31# Name: 4, dtype: object

投稿2021/02/19 07:18

jeanbiego

総合スコア3966

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

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

kumatakun

2021/02/19 11:28

大変ありがとうございます。scipy の極小値を理解していなかったため大変助かりました。 また、よろしくお願いいたします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問