Не удается найти массив, который вызывает «ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()»

То, что я пытаюсь сделать, это сравнить значения. Если все утверждения верны, присвойте значение конкретной ячейке в фрейме данных.

Вот мой код:

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'>

Почему в 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
0
121
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

  1. используйте печать после «ColNum += 1», чтобы узнать, в каком « pd.isnull (ColValues) или ColValues» возникает проблема.

  2. напечатайте "TADF[DfName]['DateTime'].iloc[RowNum]" перед строкой 4, чтобы быть уверенным в его типе и значении

Я сделал это уже. 1. Ошибка возникает, когда значение ColValue равно 28. 2. Правильно печатается "2020-07-01 20:26:00"

Jonathan Stearns 12.12.2020 09:36

Так что проблема не в коде, а в данных. Можете ли вы проверить данные вручную в строке 28? (возможно, используются две вкладки и так далее)

Reihaneh Kouhi 12.12.2020 09:41

я проверил; это пример данных, включенных в приведенное выше. Нет дубликатов. Ваш комментарий заставил меня понять, что я не делал тип местоположения, я назначаю временную метку «DynamTPs.loc [TATicketNum, TimeColName]». В нем написано print = "Динамическое время полосы движения TP-1 NaN". Type = "Name: 5650779, dtype: object <class 'pandas.core.series.Series'>" Напечатанное значение правильное, класс правильный? или это и есть причина проблемы? Я также попытался изменить его на «DynamTPs [TimeColName].iloc [TATicketNum]», и он выдает ошибку: «только целочисленный скалярный массив может быть преобразован в скалярный индекс». Есть идеи

Jonathan Stearns 12.12.2020 10:31

Является ли строка 28 первой строкой, в которой программа использует функцию «еще»? Название столбца «Время динамической дорожки TP-1» выглядит странно, поскольку вы используете пробелы между именами. каждый пробел представляет собой отдельный столбец. Вы проверили это?

Reihaneh Kouhi 12.12.2020 11:12

Можете ли вы подробнее объяснить, что вы подразумеваете под именем столбца, это «странно, поскольку вы используете пробел между именами. Каждое пространство представляет собой отдельный столбец. Вы проверяли это»? Я этого не понял.

Jonathan Stearns 14.12.2020 05:57

Распечатайте «DynamTPs» и проверьте, все ли в порядке с этим набором данных. Насколько я понимаю, название первой колонки "Время динамической полосы ТП-1". Может быть, если пробел является разделителем, в коде у вас будет 4 столбца (с названиями «Динамический» и «ТП-1» и «Лейн» и «Время») вместо одного! Но если разделитель определен правильно, то проблем не будет.

Reihaneh Kouhi 14.12.2020 06:52

Трассировка указывает, что это происходит в методе iloc

TADF[DfName]['DateTime'].iloc[RowNum]

Что вы знаете о RowNum? Как насчет индексов строк кадра (или сейчас это может быть серия)?

В приведенном выше образце данных это данные, когда возникает ошибка. Итак, чтобы ответить на ваш вопрос, RowNum = 28. И есть только один порядковый номер, равный 28. Кроме того, я присвоил переменной «TADF[DfName]['DateTime'].iloc[RowNum]» и напечатал тип. Там написано <class 'pandas._libs.tslibs.timestamps.Timestamp'>. И переменная имеет правильную дату. Так что мне кажется, что это не серия, которая вызывает ошибку.

Jonathan Stearns 14.12.2020 05:57
Ответ принят как подходящий

Я не знаю, почему это работает, когда loc не работает, но использование loc и at вместе сработало.

DynamTPs.loc[TATicketNum].at['Dynamic TP-1 lane Time'] = ColTime

Разве это не из-за пробела между словами, в то время как разделителем python обычно является пробел? Он думает, что программа предполагает, что «Динамическое время полосы движения TP-1» состоит из 4 столбцов (каждое слово представляет собой отдельный столбец), и это является причиной проблемы.

Reihaneh Kouhi 14.12.2020 09:54

Нет. Сначала это работало раньше, когда я использовал excel (сейчас перешел на sQL). Кроме того, я заменил пробелы на _ и все равно получаю ту же ошибку.

Jonathan Stearns 15.12.2020 07:32

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