将行迭代与成对乘法相结合
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将行迭代与成对乘法相结合相关的知识,希望对你有一定的参考价值。
我有以下数据帧:
in_scenario_USA USA index_in
month year
4 1960 NaN 0
5 1960 NaN 0
6 1960 0.000000 1.0
7 1960 0.000000 1.0
8 1960 0.000000 1.0
9 1960 0.000000 1.0
10 1960 0.000000 1.0
11 1960 0.000000 1.0
12 1960 0.000000 1.0
1 1961 0.000000 1.0
2 1961 0.025536 1.0
3 1961 0.003843 1.0
4 1961 0.019139 1.0
5 1961 0.000000 1.0
第一列是一个月的百分比回报。根据我的场景,它是0或数字。我希望我的第二列将其第一个非空值保持为1,然后可以使用以下公式解释每个后续值:
USA index_in[i] = USA index_in[i-1] * (1 + in_scenario_USA)[i]
所以最后看起来像这样:
in_scenario_USA USA index_in
month year
4 1960 NaN 0
5 1960 NaN 0
6 1960 0.000000 1.0
7 1960 0.000000 1.0
8 1960 0.000000 1.0
9 1960 0.500000 1.5
10 1960 0.500000 2.25
11 1960 0.000000 2.25
12 1960 0.000000 2.25
1 1961 0.000000 2.25
2 1961 -0.200000 1.8
3 1961 0.100000 1.98
4 1961 0.100000 2.178
5 1961 0.000000 2.178
我尝试了很多循环,但我觉得最接近准确的是这一循环,但我最终只得到NaN值。
for i in range(0, len(df_merged[col + ' index_in'])):
if df_merged[col + ' index_in'].iloc[i] == 1 and (df_merged[col + ' index_in'].iloc[-i] == 0):
continue
else:
df_merged[col + ' index_in'].iloc[i] = np.multiply(df_merged[col + ' index_in'].iloc[i-1], df_merged['in_scenario_' + col].iloc[i])
谢谢你的帮助。
答案
我认为你的问题是你的前几行中的NaN
值,它们会成倍增加并导致添加NaN值。试试这个:
newcol = []
firstnonnan = True
for index, row in df.iterrows():
if row['in_scenario_USA'].isnull():
newcol.append(row['USA_index_in'])
elif firstnonnan = True:
newcol.append(1)
firstnonnan = False
else:
newcol.append(newcol[-1]*(1+row['in_scenario_USA']))
df['USA index_in'] = newcol
基本上,您将遍历数据框并构建一个列表以覆盖您的列。如果你有一个NaN
值,你将采用该列中已有的相同值。第一次看到非NaN
时,您将在列表中添加1。之后,您将使用列表中的最后一项作为之前的值。
以上是关于将行迭代与成对乘法相结合的主要内容,如果未能解决你的问题,请参考以下文章
《ServerSuperIO Designer IDE使用教程》- 7.增加机器学习算法,通讯采集数据与算法相结合。发布:4.2.5 版本
jdk8源码Arrays.sort插入排序,居然还可以成对插入
jdk8源码Arrays.sort插入排序,居然还可以成对插入