前提・実現したいこと
下方偏差を求めようとして、四苦八苦しています。
具体的には、下記data1のvalue列から、coment列の計算式にて、
periodsの期間(今回3)でローリングしながら、want列の値をanswer列にて出力したいです。
識者の方、どうかよろしくお願いします。
発生している問題・エラーメッセージ
2つの問題に直面しています。
0. 機能を実装中に、以下のエラーメッセージが発生し、独力での解決ができません。
0. 上記解消したとして、pandasでのfor文を駆使しないといけませんが、どうやってwant列を実現できるのかイメージがついていない
df1['answer'] = min(df1['value'].shift(periods-1)-df1['value'].shift(periods-1),0)**2 ... ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). P
該当のソースコード
以下実現したいことをサンプルに変換したソースコード全文になります
python
1import pandas as pd 2import numpy as np 3import io 4 5periods=3 6 7data1 = """day,value,want,coment 81,5,, 92,3,, 103,4,5,"← 5 = min(5-5,0)^2 + min(3-5,0)^2 + min(4-5,0)^2" 114,6,0,"← 0 = min(3-3,0)^2 + min(4-3,0)^2 + min(6-3,0)^2" 125,3,1,"← 1 = min(4-4,0)^2 + min(6-4,0)^2 + min(3-4,0)^2" 136,4,13,"← 13 = min(6-6,0)^2 + min(3-6,0)^2 + min(4-6,0)^2" 14""" 15 16df1 = pd.read_csv(io.StringIO(data1)) 17print(df1) 18# day value want coment 19# 0 1 5 NaN NaN 20# 1 2 3 NaN NaN 21# 2 3 4 5.0 ← 5 = min(5-5,0)^2 + min(3-5,0)^2 + min(4-5,0)^2 22# 3 4 6 0.0 ← 0 = min(3-3,0)^2 + min(4-3,0)^2 + min(6-3,0)^2 23# 4 5 3 1.0 ← 1 = min(4-4,0)^2 + min(6-4,0)^2 + min(3-4,0)^2 24# 5 6 4 13.0 ← 13 = min(6-6,0)^2 + min(3-6,0)^2 + min(4-6,0)^2 25 26df1['answer'] = min(df1['value'].shift(periods-1)-df1['value'].shift(periods-1),0)**2 # ValueError発生!!! 27 28print(df1)
試したこと
- 下記のみ単独でprintして値が得られていることは確認
df1['value'].shift(periods-1)-df1['value'].shift(periods-1)
- min(0,0)でエラーは発生しないことを確認
- ()でくくってみたり、.fillna(0)をつけてみたり、色々やったのですが、解決できません
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/18 01:42
2019/10/18 02:17