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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

pandas

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

Q&A

1回答

1788閲覧

IndexError: single positional indexer is out-of-bounds エラー と  a[a.index > b.index[i]] の表記方法

yutakao

総合スコア10

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

pandas

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

0グッド

0クリップ

投稿2021/09/04 22:37

お世話になります。

https://qiita.com/blog_UKI/items/f782fb86747e0bae89a9

上記ページを参考に勉強をしているのですが…

何度かのエラーをこちらに質問させていただきユーザー様のお陰で進めてこれたのですが…
再度、エラーが発生して進めなくなりました。。。

eps_df = pd.DataFrame(index=monthly_rt.index, columns=monthly_rt.columns) # 月次リターンと同次元のDF作成 roe_df = pd.DataFrame(index=monthly_rt.index, columns=monthly_rt.columns) for i in range(len(eps_df)): # 各行への代入 eps_df.iloc[i] = eps[eps.index > eps_df.index[i]].iloc[-1] for i in range(len(roe_df)): roe_df.iloc[i] = roe[roe.index > roe_df.index[i]].iloc[-1] per_df = closes/eps_df # PERデータフレームの作成 print(per_df) print(roe_df)

上記を実行すると

--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-44-31586ce5109b> in <module> 3 4 for i in range(len(eps_df)): # 各行への代入 ----> 5 eps_df.iloc[i] = eps[eps.index > eps_df.index[i]].iloc[-1] 6 7 for i in range(len(roe_df)): ~\anaconda3\lib\site-packages\pandas\core\indexing.py in __getitem__(self, key) 893 894 maybe_callable = com.apply_if_callable(key, self.obj) --> 895 return self._getitem_axis(maybe_callable, axis=axis) 896 897 def _is_scalar_access(self, key: Tuple): ~\anaconda3\lib\site-packages\pandas\core\indexing.py in _getitem_axis(self, key, axis) 1499 1500 # validate the location -> 1501 self._validate_integer(key, axis) 1502 1503 return self.obj._ixs(key, axis=axis) ~\anaconda3\lib\site-packages\pandas\core\indexing.py in _validate_integer(self, key, axis) 1442 len_axis = len(self.obj._get_axis(axis)) 1443 if key >= len_axis or key < -len_axis: -> 1444 raise IndexError("single positional indexer is out-of-bounds") 1445 1446 # ------------------------------------------------------------------- IndexError: single positional indexer is out-of-bounds

上記エラーとなります。

ただ、eps_df には途中まで数字が代入されています。

1332.T 1333.T 1414.T 1605.T
Date
2007-09-28 46.449437 109.801567 210.670635 -76.495689
2007-10-31 46.449437 109.801567 210.670635 -76.495689
2007-11-30 46.449437 109.801567 210.670635 -76.495689
2007-12-27 46.449437 109.801567 210.670635 -76.495689
2008-01-31 46.449437 109.801567 210.670635 -76.495689
... ... ... ... ...
2021-05-31 46.449437 109.801567 210.670635 -76.495689
2021-06-30 NaN NaN NaN NaN
2021-07-30 NaN NaN NaN NaN
2021-08-31 NaN NaN NaN NaN
2021-09-03 NaN NaN NaN NaN
169 rows × 4 columns

ちなみに eps は
1332.T 1333.T 1414.T 1605.T
2018-03-31 55.712327 305.992528 NaN 27.641420
2018-06-30 55.712327 305.992528 135.635477 27.641420
2019-03-31 49.428861 317.261536 135.635477 65.817014
2019-06-30 49.428861 317.261536 150.107472 65.817014
2019-12-31 49.428861 317.261536 150.107472 107.557873
2020-03-31 47.465077 238.245455 150.107472 107.557873
2020-06-30 47.465077 238.245455 167.291805 107.557873
2020-12-31 47.465077 238.245455 167.291805 -76.495689
2021-03-31 46.449437 109.801567 167.291805 -76.495689
2021-06-30 46.449437 109.801567 210.670635 -76.495689

になります。

まずエラー元と考えられる

for i in range(len(eps_df)): # 各行への代入 eps_df.iloc[i] = eps[eps.index > eps_df.index[i]].iloc[-1]

は何をしているのでしょうか?for文でループ処理。eps_dfの長さ文(今回は169)の回数処理をしていると思いますが
eps[eps.index > eps_df.index[i]].iloc[-1] は何をしているのでしょうか?

上記のような a[a.index > b.index[i]] の表記方法について調べてみたのですが分かりませんでした。
※文章的には簡単そうなので根本的に探し方を間違っていそうですが…

エラーの原因・対策がわかる方いらっしゃいますでしょうか?
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

a.indexはaというDataFrameのindexです。

エラーの原因は、不等号の向きです。

python

1for i in range(len(eps_df)): # 各行への代入 2 eps_df.iloc[i] = eps[eps.index > eps_df.index[i]].iloc[-1]

ではなく、

python

1for i in range(len(eps_df)): # 各行への代入 2 eps_df.iloc[i] = eps[eps.index < eps_df.index[i]].iloc[-1]

投稿2021/09/05 00:06

ppaul

総合スコア24670

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

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

yutakao

2021/09/05 13:30

ご教示ありがとうございます。 内容試してみましたがエラー結果は変わりませんでした。 eps[eps.index < eps_df.index[i]] の[]内のeps.indexとeps_df.index[i]を不等号にて比較したらどうなるのでしょうか?if分のように条件が合えばiloc[-1]で最後の行をとるなどあるのでしょうか? お手数ですがよろしくお願いいたします。
ppaul

2021/09/06 22:07

本当にエラーメッセージは変わっていませんか? 4 for i in range(len(eps_df)): # 各行への代入 ----> 5 eps_df.iloc[i] = eps[eps.index > eps_df.index[i]].iloc[-1] 6 の部分が変わっているのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問