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

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

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

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

Python

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

pandas

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

Q&A

解決済

2回答

1540閲覧

時系列データで、直前の値を参照して計算する方法

poppop

総合スコア2

Python 3.x

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

Python

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

pandas

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

0グッド

2クリップ

投稿2020/05/27 10:31

編集2020/05/27 10:34

前提・実現したいこと

Python初心者です。
下記のようなデータがあったとして、cを用いてdを計算したいと考えております。
cは事前に与えられているもの、dが計算結果です。
各行のdは直前のdも参照して計算しています。
具体的には、c_iとd_iをインデックスiのデータとした場合、d_1 = max(min(sum(d_0, c_1*0.1), 1), 0.5)。
ただし、一番初めのレコードについてはdは1となる。

cd
01.351
1-1.370.86
2-1.120.75
31.670.92
40.921
5-1.890.81
61.570.97
71.961
8-0.140.99
9-0.50.94
import numpy as np import pandas as pd df=pd.DataFrame({'c': [1.35,-1.37,-1.12,1.67,0.92,-1.89,1.57,1.96,-0.14,-0.5]})

試したこと

下記のコードをベースに何かしようと思ったのですが、直前のdの結果を用いる方法が全く見当がつかず、困っています。
アドバイスいただけると助かります。

shift().rolling(1).apply(lambda x: x)

補足情報

Python 3.7.7
Numpy 1.18.1
Pandas 1.0.3

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

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

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

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

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

guest

回答2

0

前の行の 'd' が確定しない限り、次の行の 'd' の計算ができないのですから、あまり難しい事を考えずに素直にループで実装すると良いのではないでしょうか。

Python

1import numpy as np 2import pandas as pd 3df = pd.DataFrame({'c': [1.35,-1.37,-1.12,1.67,0.92,-1.89,1.57,1.96,-0.14,-0.5]}) 4df['d'] = 1 5for idx, row in df.iloc[1:].iterrows(): 6 df.loc[idx, 'd'] = max(min(df.shift(1).loc[idx, 'd'] + row['c'] * 0.1, 1), 0.5) 7# c d 8#0 1.35 1.000 9#1 -1.37 0.863 10#2 -1.12 0.751 11#3 1.67 0.918 12#4 0.92 1.000 13#5 -1.89 0.811 14#6 1.57 0.968 15#7 1.96 1.000 16#8 -0.14 0.986 17#9 -0.50 0.936

投稿2020/05/27 11:27

magichan

総合スコア15898

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

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

poppop

2020/05/28 01:18

ありがとうございます!stackoverflowで似たような質問があったのですが、ループなしの明確な答えが出てなかったので、やはりループは避けられないのかもしれません。実際のデータは数百MBあるので処理速度が重要なのですが、上記を参考にさせていただき、まずはループの高速化を試してみたいと思います。 https://stackoverflow.com/questions/46421928/pandas-apply-but-access-previously-calculated-value/46423562#46423562
guest

0

ベストアンサー

pandasのメソッドだけでカッコよくやるやり方が思いつきませんでした。

python

1import numpy as np 2import pandas as pd 3df=pd.DataFrame({'c': [1.35,-1.37,-1.12,1.67,0.92,-1.89,1.57,1.96,-0.14,-0.5]}) 4df["d"]=1.0 5for i in range(1,len(df)): 6 df.iat[i,1]=max([min([sum([df.iat[i-1,1], df.iat[i,0]*0.1]), 1]), 0.5]) 7print(df) 8 9 c d 100 1.35 1.000 111 -1.37 0.863 122 -1.12 0.751 133 1.67 0.918 144 0.92 1.000 155 -1.89 0.811 166 1.57 0.968 177 1.96 1.000 188 -0.14 0.986 199 -0.50 0.936

投稿2020/05/27 11:20

x98000

総合スコア1096

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

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

poppop

2020/05/28 01:14

ありがとうございます!ループなしでできるかも、と思ったのですがやはり難しそうですね。早速参考にさせていただきます。
poppop

2020/05/28 01:20

先にご回答いただいたということで、ベストアンサーにさせていただきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問