То, что я пытаюсь сделать, это сравнить значения. Если все утверждения верны, присвойте значение конкретной ячейке в фрейме данных.
Вот мой код:
if pd.isnull(ColValues) or ColValues < TPStartValue or ColValues > CndlHigh or ColValues < CndlLow or ColValues < PrevCndlHigh or ColValues < PrevCndlClose:
ColNum += 1
else:
DynamTPs.loc[TATicketNum,TimeColName] = TADF[DfName]['DateTime'].iloc[RowNum]
Имя моего фрейма данных меняется, поэтому имена фреймов данных хранятся в словаре TADF.
Я проверил каждую переменную с помощью print(type()), и ни одна из них не является массивом, а также уникальна.
Ошибка возникает в строке 4 этого примера кода: «DynamTPs.loc[TATicketNum,TimeColName] = TADF[DfName]['DateTime'].iloc[RowNum]». Я не сравниваю переменные. Я назначаю один. Поэтому я считаю, что ошибка связана не с этой строкой кода, а с переменными, которые отправляются в методы/функции (в Traceback).
Я проверил каждую переменную в этой строке. Все значения являются уникальными и правильными (например, DfName — это одно значение, TATicketNum — в фрейме данных есть только одно значение, значение фрейма данных для ['DateTime'].iloc[RowNum] в фрейме данных есть только одно значение, RowNum правильное , ColNum правильный (как видно из примера ниже) и т. д.
Трассировка:
File "C:\Users\Jonathan\OneDrive - Mazars in Oman\Trading\Systems\FibMatrix\Testing Trade Analysis\Python - RB Code\calculating dynamics v1-3-1.py", line 95, in FindDynamicTPSLs
DynamTPs.loc[TATicketNum,TimeColName] = TADF[DfName]['DateTime'].iloc[RowNum]
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py", line 670, in __setitem__
iloc._setitem_with_indexer(indexer, value)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py", line 1765, in _setitem_with_indexer
isetter(loc, value)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py", line 1676, in isetter
ser = self.obj._ixs(loc, axis=1)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2844, in _ixs
label = self.columns[i]
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\multi.py", line 1902, in __getitem__
if level_codes[key] == -1:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Вот образец TADF[DfName] (RowNum при возникновении ошибки равен 28, а ColNum равен 6, который в этом образце помечен как _1m_21):
DateTime Open High Low Close Vol _1m_21 _1m_34
27 2020-07-01 20:25:00 1.8059 1.806 1.8059 1.806 81 1.806 1.8054
28 2020-07-01 20:26:00 1.806 1.8061 1.8058 1.8059 140 1.8061 1.8055
29 2020-07-01 20:27:00 1.8058 1.8058 1.8056 1.8056 120 1.806 1.8055
Пример для DynamTP, в который я пытаюсь записать, таков (TATicketNum для записи — 5650779; имя столбца — «Dynamic TP-1 lane Time»:
Dynamic TP-1 lane Time Dynamic TP-1 lane Price Dynamic TP-2 lane Time Dynamic TP-2 lane Price
5650779 nan nan nan nan
5659605 nan nan nan nan
Я ценю любую помощь! Заранее спасибо.
Обновлять Когда я печатаю тип «DynamTPs.loc [TATicketNum, TimeColName]», он говорит, что это класс Series. Поскольку это единственное, что относится к серийному типу, я думаю, что это может быть причиной проблемы.
Я не понимаю, почему он возвращает серию. Я загрузил фрейм данных, чтобы преуспеть, и я проверил, что есть только один номер индекса, который соответствует TATicketNum, и только одна метка столбца, которая соответствует «TimeColName». Я напечатал типы каждой из этих переменных, и они являются целочисленными и строковыми. Я также жестко закодировал loc[], чтобы исключить переменные как проблему. Это все еще дает ту же ошибку.
Вы можете видеть выше с образцом фрейма данных, как он выглядит, а не дублирует.
Я также переключился с loc на iat и жестко запрограммировал df.iat[0,0] и df.iat[0,1]. Тогда значения вносятся в DF корректно.
Я также переключился на "DynamTPs.loc[TATicketNum].at['Dynamic TP-1 lane Time']" (жестко закодировал строку), и это тоже не работает. Однако нет сообщения об ошибке.
Когда я пытаюсь
TimeColIndex = DynamTPs.columns.get_loc('Dynamic TP-1 lane Time')
Это должно дать мне целое число, но вместо этого оно дает массив: [ True False False False False False False False] <class 'numpy.ndarray'>






используйте печать после «ColNum += 1», чтобы узнать, в каком « pd.isnull (ColValues) или ColValues» возникает проблема.
напечатайте "TADF[DfName]['DateTime'].iloc[RowNum]" перед строкой 4, чтобы быть уверенным в его типе и значении
Так что проблема не в коде, а в данных. Можете ли вы проверить данные вручную в строке 28? (возможно, используются две вкладки и так далее)
я проверил; это пример данных, включенных в приведенное выше. Нет дубликатов. Ваш комментарий заставил меня понять, что я не делал тип местоположения, я назначаю временную метку «DynamTPs.loc [TATicketNum, TimeColName]». В нем написано print = "Динамическое время полосы движения TP-1 NaN". Type = "Name: 5650779, dtype: object <class 'pandas.core.series.Series'>" Напечатанное значение правильное, класс правильный? или это и есть причина проблемы? Я также попытался изменить его на «DynamTPs [TimeColName].iloc [TATicketNum]», и он выдает ошибку: «только целочисленный скалярный массив может быть преобразован в скалярный индекс». Есть идеи
Является ли строка 28 первой строкой, в которой программа использует функцию «еще»? Название столбца «Время динамической дорожки TP-1» выглядит странно, поскольку вы используете пробелы между именами. каждый пробел представляет собой отдельный столбец. Вы проверили это?
Можете ли вы подробнее объяснить, что вы подразумеваете под именем столбца, это «странно, поскольку вы используете пробел между именами. Каждое пространство представляет собой отдельный столбец. Вы проверяли это»? Я этого не понял.
Распечатайте «DynamTPs» и проверьте, все ли в порядке с этим набором данных. Насколько я понимаю, название первой колонки "Время динамической полосы ТП-1". Может быть, если пробел является разделителем, в коде у вас будет 4 столбца (с названиями «Динамический» и «ТП-1» и «Лейн» и «Время») вместо одного! Но если разделитель определен правильно, то проблем не будет.
Трассировка указывает, что это происходит в методе iloc
TADF[DfName]['DateTime'].iloc[RowNum]
Что вы знаете о RowNum? Как насчет индексов строк кадра (или сейчас это может быть серия)?
В приведенном выше образце данных это данные, когда возникает ошибка. Итак, чтобы ответить на ваш вопрос, RowNum = 28. И есть только один порядковый номер, равный 28. Кроме того, я присвоил переменной «TADF[DfName]['DateTime'].iloc[RowNum]» и напечатал тип. Там написано <class 'pandas._libs.tslibs.timestamps.Timestamp'>. И переменная имеет правильную дату. Так что мне кажется, что это не серия, которая вызывает ошибку.
Я не знаю, почему это работает, когда loc не работает, но использование loc и at вместе сработало.
DynamTPs.loc[TATicketNum].at['Dynamic TP-1 lane Time'] = ColTime
Разве это не из-за пробела между словами, в то время как разделителем python обычно является пробел? Он думает, что программа предполагает, что «Динамическое время полосы движения TP-1» состоит из 4 столбцов (каждое слово представляет собой отдельный столбец), и это является причиной проблемы.
Нет. Сначала это работало раньше, когда я использовал excel (сейчас перешел на sQL). Кроме того, я заменил пробелы на _ и все равно получаю ту же ошибку.
Я сделал это уже. 1. Ошибка возникает, когда значение ColValue равно 28. 2. Правильно печатается "2020-07-01 20:26:00"