我的数据框类型:
Date AAPL NFLX INTC
0 2008-01-02 27.834286 3.764286 25.350000
1 2008-01-03 27.847143 3.724286 24.670000
2 2008-01-04 25.721428 3.515714 22.670000
3 2008-01-07 25.377142 3.554286 22.879999
4 2008-01-08 24.464285 3.328571 22.260000
我想对每列中的每一只股票运行.pct_change(1),并将3列追加到df的末尾。
我已经知道该列的名称,例如AAPL,我知道该怎么做。有了这些先验知识,我就可以执行df ['AAPL_Ret'] = df.AAPL.pct_change(1)
但是最终,我的文件中将有100支股票,目标是自动进行计算,而不必在代码中单独键入每个股票行情记录。因此,我将不得不遍历所有列,然后以某种方式运行.pct_change。
有什么想法吗?非常感谢。
答案 0 :(得分:3)
在pct_change
上调用DataFrame
,然后使用concat
可以很容易地将结果加回去。
df = df.set_index('Date')
pd.concat([df, df.pct_change(1).add_suffix('_Ret')], axis=1)
AAPL NFLX INTC AAPL_Ret NFLX_Ret INTC_Ret
Date
2008-01-02 27.834286 3.764286 25.350000 NaN NaN NaN
2008-01-03 27.847143 3.724286 24.670000 0.000462 -0.010626 -0.026824
2008-01-04 25.721428 3.515714 22.670000 -0.076335 -0.056003 -0.081070
2008-01-07 25.377142 3.554286 22.879999 -0.013385 0.010971 0.009263
2008-01-08 24.464285 3.328571 22.260000 -0.035972 -0.063505 -0.027098
需要注意的唯一一件事(您可能已经知道了这一点)是pct_change
在具有非数字列的情况下将不起作用。
因此,另一个(更好)的选择是
pd.concat([df, df.select_dtypes(exclude=[object]).pct_change(1)], 1)
Date AAPL NFLX INTC AAPL NFLX INTC
0 2008-01-02 27.834286 3.764286 25.350000 NaN NaN NaN
1 2008-01-03 27.847143 3.724286 24.670000 0.000462 -0.010626 -0.026824
2 2008-01-04 25.721428 3.515714 22.670000 -0.076335 -0.056003 -0.081070
3 2008-01-07 25.377142 3.554286 22.879999 -0.013385 0.010971 0.009263
4 2008-01-08 24.464285 3.328571 22.260000 -0.035972 -0.063505 -0.027098
当您拥有许多非数字列时,它们会优雅地处理它们。
OTOH,我建议您事先将Date设置为索引(并使用选项1),因为通常这是处理库存数据时要执行的操作。并非总是如此。
答案 1 :(得分:3)
请注意,period
的{{1}}参数默认为pct_change
,可以省略。
1
drop
列'Date'
df.join(df.drop('Date', 1).pct_change().add_suffix('_Ret'))
Date AAPL NFLX INTC AAPL_Ret NFLX_Ret INTC_Ret
0 2008-01-02 27.834286 3.764286 25.350000 NaN NaN NaN
1 2008-01-03 27.847143 3.724286 24.670000 0.000462 -0.010626 -0.026824
2 2008-01-04 25.721428 3.515714 22.670000 -0.076335 -0.056003 -0.081070
3 2008-01-07 25.377142 3.554286 22.879999 -0.013385 0.010971 0.009263
4 2008-01-08 24.464285 3.328571 22.260000 -0.035972 -0.063505 -0.027098
set_index
答案 2 :(得分:-1)
您可以做的一件事是
for col in df.columns:
if not isstock(col):
continue
df["{}_Ret".format(col)] = df[col].pct_change(1)
我之所以包含isstock()
部分,是因为您将日期作为列而不是索引,并且您不希望采用日期的百分比变化(我想)。您可以在其他地方定义isstock()
,也可以在您的代码中将其替换为所需的任何条件。