如果我想对某些负值使用 pct_change 方法,如何分配条件值?
How to assign conditional value if I want to use pct_change method on some negative values?
我有一个包含一些负值和正值的数据框
我使用以下代码获取 pct_change 行值
df_gp1 = df_gp1.pct_change(periods=4, axis=1) * 100
在这里我想分配一些特定的数字,具体取决于值如何从负变为正或反之亦然
例如,如果值从
正转负,return -100
负变正,return100
负对负,return-100,
正对正,普通pct_change
例如,我当前的数据框可能如下所示
DATA
D-4
D-3
D-2
D-1
D-0
A
-20
-15
-13
-10
-5
B
-30
-15
-10
10
25
C
40
25
30
41
30
D
25
25
10
15
-10
我想要一个新的输出(dataframe)让我关注 return
DATA
D-0
A
-100
B
100
C
-25
D
-100
如您所见,第 4 期必须提供 pct_change(即 D-0 / D-4),但如果它保持负值,则 return -100
如果由正转负,还是return-100
如果由负转正,return100,
如果它是从正值到另一个正值的变化,则应用 pct_chg
我的原始数据框大约有 4000 行和 300 列。
因此我想要的输出将有 4000 行和 296 列(因为它消除了数据 D-4、D-3、D-2、D-1
我尝试制作条件列表和选择列表,并使用 np.select 方法,但我只是不知道如何将它应用于整个数据框并创建新的 returns百分比变化。
非常感谢任何帮助。
使用:
#convert column DATA to index if necessary
df = df.set_index('DATA')
#compare for less like 0
m1 = df.lt(0)
#comapre shifted 4 columns less like 0
m2 = df.shift(4, axis=1).lt(0)
#pass to np.select
arr = np.select([m1, ~m1 & m2, ~m1 & ~m2],
[-100, 100, df.pct_change(periods=4, axis=1) * 100])
#create DataFrame, remove first 4 columns
df = pd.DataFrame(arr, index=df.index, columns=df.columns).iloc[:, 4:].reset_index()
print (df)
DATA D-0
0 A -100.0
1 B 100.0
2 C -25.0
3 D -100.0
鉴于:
D-4 D-3 D-2 D-1 D-0
DATA
A -20 -15 -13 -10 -5
B -30 -15 -10 10 25
C 40 25 30 41 30
D 25 25 10 15 -10
正在做:
def stuff(row):
if row['D-0'] < 0:
return -100
elif row['D-4'] < 0:
return 100
else:
return (row.pct_change(periods=4) * 100)['D-0']
print(df.apply(stuff, axis=1))
输出:
A -100.0
B 100.0
C -25.0
D -100.0
dtype: float64
我有一个包含一些负值和正值的数据框
我使用以下代码获取 pct_change 行值
df_gp1 = df_gp1.pct_change(periods=4, axis=1) * 100
在这里我想分配一些特定的数字,具体取决于值如何从负变为正或反之亦然
例如,如果值从 正转负,return -100
负变正,return100
负对负,return-100,
正对正,普通pct_change
例如,我当前的数据框可能如下所示
DATA | D-4 | D-3 | D-2 | D-1 | D-0 |
---|---|---|---|---|---|
A | -20 | -15 | -13 | -10 | -5 |
B | -30 | -15 | -10 | 10 | 25 |
C | 40 | 25 | 30 | 41 | 30 |
D | 25 | 25 | 10 | 15 | -10 |
我想要一个新的输出(dataframe)让我关注 return
DATA | D-0 |
---|---|
A | -100 |
B | 100 |
C | -25 |
D | -100 |
如您所见,第 4 期必须提供 pct_change(即 D-0 / D-4),但如果它保持负值,则 return -100 如果由正转负,还是return-100 如果由负转正,return100, 如果它是从正值到另一个正值的变化,则应用 pct_chg
我的原始数据框大约有 4000 行和 300 列。 因此我想要的输出将有 4000 行和 296 列(因为它消除了数据 D-4、D-3、D-2、D-1
我尝试制作条件列表和选择列表,并使用 np.select 方法,但我只是不知道如何将它应用于整个数据框并创建新的 returns百分比变化。
非常感谢任何帮助。
使用:
#convert column DATA to index if necessary
df = df.set_index('DATA')
#compare for less like 0
m1 = df.lt(0)
#comapre shifted 4 columns less like 0
m2 = df.shift(4, axis=1).lt(0)
#pass to np.select
arr = np.select([m1, ~m1 & m2, ~m1 & ~m2],
[-100, 100, df.pct_change(periods=4, axis=1) * 100])
#create DataFrame, remove first 4 columns
df = pd.DataFrame(arr, index=df.index, columns=df.columns).iloc[:, 4:].reset_index()
print (df)
DATA D-0
0 A -100.0
1 B 100.0
2 C -25.0
3 D -100.0
鉴于:
D-4 D-3 D-2 D-1 D-0
DATA
A -20 -15 -13 -10 -5
B -30 -15 -10 10 25
C 40 25 30 41 30
D 25 25 10 15 -10
正在做:
def stuff(row):
if row['D-0'] < 0:
return -100
elif row['D-4'] < 0:
return 100
else:
return (row.pct_change(periods=4) * 100)['D-0']
print(df.apply(stuff, axis=1))
输出:
A -100.0
B 100.0
C -25.0
D -100.0
dtype: float64