#python #pandas
#python #pandas
Вопрос:
У меня есть df
вызов фрейма данных, который выглядит так:
A B C
Date
02/02/2007 14.8966 0.289371 0.009984836
05/02/2007 14.8719 0.288368 -0.001659473
06/02/2007 14.9295 0.279869 0.003865595
07/02/2007 15.0035 0.283038 0.004944386
08/02/2007 15.0528 0.277092 0.003280513
09/02/2007 14.7733 0.28663 -0.018742523
12/02/2007 14.6911 0.286458 -0.005579629
13/02/2007 14.996 0.275362 0.020541631
14/02/2007 15.5731 0.253263 0.037761568
У меня есть цикл for, в котором я использую для управления временными рядами. Результатом является вызываемая переменная testValue
, которую я хотел бы добавить df
в новый столбец, вызываемый 'D'
по ссылке на строку endpoint
(конечная точка — это последовательно увеличивающееся целое число).
for i in range(buildRange,len(pair_data)-calcRange 1):
startpoint=i
endpoint = startpoint calcRange
Calc_df=df[startpoint:endpoint].copy()
Calc_df['C']=Calc_df.iloc[-1, Calc_df.columns.get_loc('A')]-Calc_df['B']
testValue= sum(x for x in Calc_df["C"] if x > 0)
df.loc[endpoint, 'D'] = testValue
Таким образом, в течение цикла столбец ‘D’ будет накапливаться со значениями testValue. Можно ли ссылаться на строку в фрейме данных, а не на индекс? На данный момент using df.loc[endpoint, 'D'] = testValue
создает новый столбец 'D'
, но добавляет данные в нижнюю часть фрейма данных, а не в правильную строку. (Я думаю, это потому, что конечная точка является целым числом, а индекс — датой, поэтому он не может найти ссылку, поэтому создает новую в нижней части фрейма данных).
Так, например, если конечная точка начиналась с 4, желаемый результат должен выглядеть так:
A B C D
Date
02/02/2007 14.8966 0.289371 0.009984836
05/02/2007 14.8719 0.288368 -0.001659473
06/02/2007 14.9295 0.279869 0.003865595
07/02/2007 15.0035 0.283038 0.004944386 1.36535
08/02/2007 15.0528 0.277092 0.003280513 0.27821
09/02/2007 14.7733 0.28663 -0.018742523 0.25356
12/02/2007 14.6911 0.286458 -0.005579629 2780435
13/02/2007 14.996 0.275362 0.020541631 0.36635
14/02/2007 15.5731 0.253263 0.037761568 0.25368
: :
31/12/2007 15.9364 0.763263 0.047435768 0.24663
(Значения в столбце 4 приведены только для иллюстрации и будут корректными, если код был запущен).
Комментарии:
1. Похоже на что-то вроде
rolling
. Я не могу точно сказать, что вы пытаетесь сделать без конкретных данных. Одно можно сказать наверняка: ваши данные индексируются,Date
но вы, похоже, обновляете сdf.loc[endpoint, 'D']
помощью whereendpoint
— целое число. Ваш код будет работать не так, как ожидалось.2. Спасибо @QuangHoang — есть ли способ ссылаться на строку, а не на индекс строки в фрейме данных?
3. Краткое напоминание об ожиданиях при переполнении стека для технического написания. Благодарности, благодарности, приветствия, подписи и т. Д. Лучше всего опустить.
Ответ №1:
Трудно проверить, что вы пытаетесь сделать. Из вашего кода я предполагаю, что это:
df['D'] = (df['A'].shift() # correspond to `Calc_df.iloc[-1, Calc_df.columns.get_loc('A')]`
.sub( df['B']) # subtract df['B']
.mul(df['C'].gt(0)) # only look at `df['C']>0`
.rolling(4).sum() # sum the last 4 occurrences
)
Вывод:
A B C D
Date
02/02/2007 14.8966 0.289371 0.009985 NaN
05/02/2007 14.8719 0.288368 -0.001659 NaN
06/02/2007 14.9295 0.279869 0.003866 NaN
07/02/2007 15.0035 0.283038 0.004944 NaN
08/02/2007 15.0528 0.277092 0.003281 43.964901
09/02/2007 14.7733 0.286630 -0.018743 43.964901
12/02/2007 14.6911 0.286458 -0.005580 29.372870
13/02/2007 14.9960 0.275362 0.020542 29.142146
14/02/2007 15.5731 0.253263 0.037762 29.158475