Eu tenho um dataframe parecido com o abaixo. Você pode ver que, para começar, a coluna SMA é uma duplicata da coluna Valor do índice intencionalmente. Estou tentando ajustar a coluna SMA para que seja o resultado de um cálculo simples, algo parecido com o abaixo, que acredito que exigiria algum tipo de loop:
for i in range(len(df)):
df['SMA'].loc[i,"SMA"]= df['SMA'].loc[i-1,"SMA"] + df['SMA'].loc[i,"ER"] * (df['SMA'].loc[i,"Index Value"] - df['SMA'].loc[i-1,"SMA"])
Em palavras, estou tentando pegar a linha atual de 'SMA' e fazer com que seja a saída da linha anterior de "SMA" + a linha atual de "ER" multiplicada pela diferença entre a linha atual de "Valor de índice " e linha anterior de "SMA"
data = {
'Date': ['9/5/2023', '9/6/2023', '9/7/2023', '9/8/2023', '9/11/2023', '9/12/2023',
'9/13/2023', '9/14/2023', '9/15/2023', '9/18/2023', '9/19/2023', '9/20/2023',
'9/21/2023', '9/22/2023', '9/25/2023', '9/26/2023', '9/27/2023', '9/28/2023',
'9/29/2023'],
'Index Value': [4496.83, 4465.48, 4451.14, 4457.49, 4487.46, 4461.9, 4467.44,
4505.1, 4450.32, 4453.53, 4443.95, 4402.2, 4330, 4320.06,
4337.44, 4273.53, 4274.51, 4299.7, 4288.05],
'ER': [0.15066, 0.157105, 0.218561, 0.233893, 0.233709, 0.191352, 0.090935,
0.398004, 0.127833, 0.062296, 0.198933, 0.382776, 0.494406, 0.541878,
0.44323, 0.489456, 0.466276, 0.396806, 0.52569],
'SMA': [4496.83, 4465.48, 4451.14, 4457.49, 4487.46, 4461.9, 4467.44, 4505.1,
4450.32, 4453.53, 4443.95, 4402.2, 4330, 4320.06, 4337.44, 4273.53,
4274.51, 4299.7, 4288.05]
}
df = pd.DataFrame(data)
Em um esforço para evitar um loop, já que não sou muito bom na construção de loops, tentei algo como o abaixo, que é próximo, mas não é exatamente o que desejo.
df['SMA']=df['SMA'].shift(1) + df['ER'] * (df['Index Value'] - df['SMA'].shift(1))
A razão pela qual não é exatamente o que eu quero é porque quero que o primeiro número da coluna Valor do Índice corresponda ao primeiro valor do SMA e que a fórmula seja aplicada somente após esse ponto (é por isso que parece que um loop seria necessário) .
Tudo isso dito e dado o objetivo, alguém pode aconselhar qual seria a melhor maneira de realizar essa tarefa?
Primeiro, você pode simplificar seu código existente de duas maneiras:
'Index Value'
como'SMA'
primeira etapa, você pode simplesmente trabalhar com os valores de'Index Value'
;diff
em vez dedf[col] - df[col].shift()
.Agora, para responder à sua pergunta, IIUC você deseja manter o primeiro valor da coluna
'Index Value'
(ou seja,4496.83
) e aplicar a fórmula apenas a partir da segunda linha.Existem algumas opções para fazer isso:
Tudo resultará em: