Вот этот код, который я пытаюсь преобразовать в python, и у меня есть две проблемы, как показано ниже в запросе.
xATRT := if(
source nz (xATRT [1], 0) и source [1]> nz (xATRT [1], 0), max (nz (xATRT [1]), source / nLoss)
Краткое описание этой функции:
сравнить источник (значение берется из pandas dataframe df ['close']) с предыдущим значением элемента XATRT, т.е. xATRT [1].nz (x, y) → серия
Версия с двумя аргументами: возвращает x, если это действительное (не NaN) число, в противном случае y
Версия с одним аргументом: возвращает x, если этодействительное (не NaN) число, в противном случае 0
Проблема 1:
Условие if не выполняется с предупреждением даже после добавления любого () решения.
исключение произошло Истинное значение Серии неоднозначно.Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().
Проблема 2:
при выполненииОперация pandas для преобразования функции NZ (x, y) в python в первой итерации времени не будет иметь никакого предыдущего значения для xATRT (xATRT [1]), это определенно вызовет ошибку / сбой или операция не удалась.Как это, если код может быть преобразован в код Python без потери его расчета.Есть ли встроенный код oneline для решения этой проблемы, так как я должен сделать такой расчет для многих условий.попробовал np. где-то, но безуспешно.
Любое решение с благодарностью.
df = calc_bgcalc_trail(df)
def calc_bgcalc_trail(df,nATRPeriod=20,nATRMultip=3,source='close',smooth1=1,smooth2=2):
df['xATR'] = ta.ATR(np.asarray(df['high']),
np.asarray(df['low']),
np.asarray(df['close']),
timeperiod=nATRPeriod)
df['nLoss'] = nATRMultip * df['xATR']
df['xATRT'] = 0.0
if df[source] > df['xATRT'].iloc[-1].any() and df[source].iloc[-1] > df['xATRT'].iloc[-1].any() :
df['xATRT'] = max(df['xATRT'].iloc[-1], df[source] / df['nLoss'])
панд для образца
nlose high low close adjusted_close \
date
2002-07-01 5.2397 5.5409 5.2397 5.4127 0.0634
2002-07-02 5.5234 5.5370 5.4214 5.4438 0.0638
2002-07-03 5.5060 5.5458 5.3281 5.4661 0.0640
2002-07-04 5.5011 5.5720 5.4175 5.5283 0.0647
2002-07-05 5.5633 5.6566 5.4749 5.5905 0.0655
2002-07-08 5.5011 5.7187 5.5011 5.6255 0.0659
2002-07-09 5.5905 5.7586 5.5681 5.6167 0.0658
2002-07-10 5.4885 5.4885 5.1465 5.2222 0.0612
2002-07-11 4.9784 5.2135 4.9784 5.1863 0.0607
2002-07-12 5.5011 5.5011 5.2446 5.3194 0.0623
2002-07-15 5.3243 5.4797 5.1912 5.3330 0.0625
2002-07-16 5.1999 5.4389 5.1999 5.3155 0.0623
2002-07-17 4.7024 5.1377 4.6189 5.0445 0.0591
2002-07-18 4.8803 5.1465 4.8356 5.0804 0.0595
2002-07-19 5.0270 5.2038 5.0221 5.1513 0.0603
2002-07-22 5.0804 5.1465 4.9687 4.9735 0.0582
2002-07-23 4.8181 5.0843 4.8181 5.0619 0.0593
2002-07-24 5.0580 5.1290 4.9376 5.0619 0.0593
2002-07-25 5.0580 5.0580 4.7918 4.8492 0.0568