以下に示すように私はdfを持っています。
Date t_factor time_in_days
2020-02-01 5 1
2020-02-06 14 6
2020-02-09 23 9
2020-02-03 23 3
2020-03-11 38 40
2020-02-20 29 20
2020-02-13 30 13
2020-02-29 100 29
2020-03-26 70 55
それから、time_in_daysの値に基づいてt_functionという列を計算する関数を作成します。
t_functionの条件:
if T0 <= time_in_days <T1:
t_function = (a1*time_in_days) + a0
else if T1 < time_in_days <= T2:
t_function = 14
else:
t_function = a2(time_in_days)**2 + (a1*time_in_days) + a0
関数の入力は、データフレーム、time_in_days、T0、T1、T2、a0、a1、a2)です。
予想される出力:
if T0 =1 , T1=4, T2= 35, a0=3, a1=2, a2=1
Date t_factor time_in_days t_function
2020-02-01 5 1 5
2020-02-06 14 6 14
2020-02-09 23 9 14
2020-02-03 23 3 9
2020-03-11 38 40 1683
2020-02-20 29 20 14
2020-02-13 30 13 14
2020-02-29 100 29 14
2020-03-26 70 55 3138
以下のコードを試しました
def t_function_df( df, time_in_days, T0, T1, T2, a0, a1, a2):
df = df.copy()
df['t_function'] = np.select( (df['time_in_days'].ge(T0) & df['time_in_days'].le(T1),
df['time_in_days'].gt(T1) & df['time_in_days'].le(T2)),
(df['time_in_days']*a1+a0, 14),
(a2*df['time_in_days']**2) + df['time_in_days']*a1 + a0)
return df[['Date', 'time_in_days', 't_function']]
np.select
ここで明白な解決策ですが、ここに疑似コードがあるので、なぜそれを実行しないのですか?
if T0 <= time_in_days < T1:
t_function = (a1 * time_in_days) + a0
else if T1 < time_in_days <= T2:
t_function = 14
else:
t_function = (a2 * time_in_days) ** 2 + (a1 * time_in_days) + a0
今になる、
T0 = 1; T1 = 4; T2 = 35; a0 = 3; a1 = 2; a2 = 1
condlist = ["@T0 <= time_in_days < @T1", "@T1 < time_in_days <= @T2"]
choicelist = ["(@a1 * time_in_days) + @a0", "14"]
default = "(@a2 * time_in_days) ** 2 + (@a1 * time_in_days) + @a0"
「@」記号は、メモリ内の実際の変数を検索するために使用されます。次のように、numpyとpandasの力を組み合わせることができます。
np.select(condlist=[df.eval(c) for c in condlist],
choicelist=[df.eval(q) for q in choicelist],
default=df.eval(default))
# array([ 5, 14, 14, 9, 1683, 14, 14, 14, 3138], dtype=int64)
df['t_function_actual'] = np.select(
condlist=[df.eval(c) for c in condlist],
choicelist=[df.eval(q) for q in choicelist],
default=df.eval(default))
df
Date t_factor time_in_days t_function t_function_actual
0 2020-02-01 5 1 5 5
1 2020-02-06 14 6 14 14
2 2020-02-09 23 9 14 14
3 2020-02-03 23 3 9 9
4 2020-03-11 38 40 1683 1683
5 2020-02-20 29 20 14 14
6 2020-02-13 30 13 14 14
7 2020-02-29 100 29 14 14
8 2020-03-26 70 55 3138 3138
詳細についてeval
は、こちらの投稿をご覧ください:pd.eval()を使用したパンダでの動的式評価。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加