Ссылка на предыдущие строки и несколько столбцов в вычислении

У меня есть фрейм данных, который выглядит как показано ниже. Вы можете видеть, что для начала столбец SMA намеренно дублирует столбец значения индекса. Я пытаюсь настроить столбец SMA так, чтобы он был результатом простого расчета, что-то вроде приведенного ниже, что, как я полагаю, потребует какого-то цикла:

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"])

Другими словами, я пытаюсь взять текущую строку «SMA» и сделать ее результатом предыдущей строки «SMA» + текущей строки «ER», умноженной на разницу между текущей строкой «Значение индекса». " и предыдущая строка "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)

Чтобы избежать цикла, поскольку я не очень хорошо разбираюсь в построении циклов, я попробовал что-то вроде приведенного ниже, что близко, но не совсем то, что я хочу.

df['SMA']=df['SMA'].shift(1) + df['ER'] * (df['Index Value'] - df['SMA'].shift(1))

Причина, по которой это не совсем то, что мне нужно, заключается в том, что я хочу, чтобы первое число столбца значения индекса соответствовало первому значению SMA, и чтобы формула применялась только после этой точки (именно поэтому кажется, что цикл будет необходим) .

Учитывая все это и учитывая цель, может ли кто-нибудь посоветовать, как лучше всего выполнить эту задачу?

Возможно, вы получите более точные ответы, если отметите этот вопрос pandas.

John Gordon 15.08.2024 18:39

вы должны предоставить ожидаемый результат

iBeMeltin 15.08.2024 19:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вы можете упростить существующий код двумя способами:

  • вам не нужно дублировать 'Index Value' в 'SMA' в качестве первого шага, вы можете просто работать со значениями из 'Index Value';
  • вы можете использовать diff вместо df[col] - df[col].shift().
df["Index Value"].shift() + df["ER"] * df["Index Value"].diff()

Теперь, чтобы ответить на ваш вопрос, IIUC вы хотите сохранить первое значение столбца 'Index Value' (т. е. 4496.83) и применять формулу только со второй строки и далее.

Есть несколько вариантов сделать это:

# 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"])

Все приведет к:

         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

Спасибо, это идеально! Очень ценю помощь

bigjdawg43 15.08.2024 21:45

Другие вопросы по теме