AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78876041
Accepted
bigjdawg43
bigjdawg43
Asked: 2024-08-16 00:34:45 +0800 CST2024-08-16 00:34:45 +0800 CST 2024-08-16 00:34:45 +0800 CST

Referenciando linhas anteriores e múltiplas colunas em um cálculo

  • 772

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?

python
  • 1 1 respostas
  • 45 Views

1 respostas

  • Voted
  1. Best Answer
    e-motta
    2024-08-16T03:02:38+08:002024-08-16T03:02:38+08:00

    Primeiro, você pode simplificar seu código existente de duas maneiras:

    • você não precisa duplicar 'Index Value'como 'SMA'primeira etapa, você pode simplesmente trabalhar com os valores de 'Index Value';
    • você pode usar diffem vez de df[col] - df[col].shift().
    df["Index Value"].shift() + df["ER"] * df["Index Value"].diff()
    

    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:

    # 1. use `at` and exclude the first value when creating the new column
    df.at[1:, "SMA"] = df["Index Value"].shift() + df["ER"] * df["Index Value"].diff()
    
    # 2. create the column and use `at` and `iloc` to replace the first value
    df["SMA"] = df["Index Value"].shift() + df["ER"] * df["Index Value"].diff()
    df.at[0, "SMA"] = df.iloc[0]["Index Value"]
    
    # 3. create the column and use `fillna` to replace the first value
    df["SMA"] = df["Index Value"].shift() + df["ER"] * df["Index Value"].diff()
    df["SMA"] = df["SMA"].fillna(df["Index Value"])
    

    Tudo resultará em:

             Date  Index Value        ER          SMA
    0    9/5/2023      4496.83  0.150660  4496.830000
    1    9/6/2023      4465.48  0.157105  4491.904758
    2    9/7/2023      4451.14  0.218561  4462.345835
    3    9/8/2023      4457.49  0.233893  4452.625221
    4   9/11/2023      4487.46  0.233709  4464.494259
    5   9/12/2023      4461.90  0.191352  4482.569043
    6   9/13/2023      4467.44  0.090935  4462.403780
    7   9/14/2023      4505.10  0.398004  4482.428831
    8   9/15/2023      4450.32  0.127833  4498.097308
    9   9/18/2023      4453.53  0.062296  4450.519970
    10  9/19/2023      4443.95  0.198933  4451.624222
    11  9/20/2023      4402.20  0.382776  4427.969102
    12  9/21/2023      4330.00  0.494406  4366.503887
    13  9/22/2023      4320.06  0.541878  4324.613733
    14  9/25/2023      4337.44  0.443230  4327.763337
    15  9/26/2023      4273.53  0.489456  4306.158867
    16  9/27/2023      4274.51  0.466276  4273.986950
    17  9/28/2023      4299.70  0.396806  4284.505543
    18  9/29/2023      4288.05  0.525690  4293.575711
    
    • 1

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve