Ошибка при обработке файла данных с помощью приложения Streamlit

Я пытаюсь развернуть приложение, которое обрабатывает файл данных .csv, введенный пользователем, выполняет с его помощью некоторый анализ размеров и создает графики. Репозиторий Github можно найти по адресу 1.

Файл, который я запускаю, называется «streamlitstuff.py», а другой файл в репозитории, в котором есть ошибки, — это файл чтения данных «data_reader.py».

Веб-сайт создается, как и ожидалось, но когда я пытаюсь ввести файл данных .csv в требуемом формате, я получаю следующие сообщения об ошибках. Может ли кто-нибудь посоветовать? Я также приложил изображение того, что можно увидеть на веб-сайте с тем же сообщением.

Хотя появляется сообщение о том, что индекс выходит за пределы допустимого диапазона, я уже использовал этот файл данных с предыдущей версией кода около двух лет назад, поэтому в коде, который был разработан с тех пор, была какая-то ошибка или что-то, что больше не работает. и его необходимо изменить. Глядя на таблицу данных с левой стороны, где есть чередующиеся строки со значением «Нет», кажется, что что-то не так с тем, как выполняется индексация строк.

File “C:\Users\holli\miniconda3\Lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py”,
line 600, in _run_script
exec(code, module.dict)
File “C:\Users\holli\streamlitstuff.py”, line 61, in
data = Data(ds, pandas=True)
^^^^^^^^^^^^^^^^^^^^^
File “C:\Users\holli\data_reader.py”, line 12, in init
self.parameters = self.generate_list_of_parameters()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “C:\Users\holli\data_reader.py”, line 24, in generate_list_of_parameters
units=getattr(Units(), key.split(‘-’)[1]),
~~~~~~~~~~~~~~^^^
IndexError: list index out of range

Обновлено: поскольку ошибка, похоже, связана с вызовом key.split, я добавил полный фрагмент кода этой части из data_reader.py.

  def generate_list_of_parameters(self):
parameters = ListOfParameters([])
for key in self.data:
parameters.append(Parameter(value=[value for value in self.data[key]],
units=getattr(Units(), key.split('-')[1]),
name=key.split('-')[0]))
return parameters

2-е редактирование:

Используя приведенный ниже блок кода, приложение создается, но когда я ввожу файл данных .csv, я получаю сообщение об ошибке.

AttributeError: объект «Данные» не имеет атрибута «generate_list_of_parameters».

Я попытался настроить класс данных следующим образом:

class Data:
def __init__(self, file, pandas=False):
    self.file_location = '' if pandas else file
    self.data = file if pandas else self.read_file(self.file_location)
    self.parameters = self.generate_list_of_parameters()
Почему в 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
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Кажется, появляется сообщение об ошибке IndexError: индекс списка вне диапазона, вероятно, вызвано попыткой доступа к элементу списка с использованием индекса, который не существует. В вашем файле: data_reader.py это происходит в строке, где вызывается key.split('-')[1]. Основная проблема и то, что вы сделали неправильно, заключались в том, что вы предположили, что каждый ключ в данных имеет дефис (-), разделяющий имя параметра и тип единицы измерения, без проверки, последовательно ли соблюдается этот формат. и с единицами измерения вы использовали getattr(Units(), key.split('-')[1]) для динамического получения атрибутов единиц. Если бы тип единицы измерения не существовал в классе Units, это вызвало бы ошибку AttributeError. и в последний раз у тебя было нет обработки ошибок для управления ситуациями, когда тип единицы измерения не найден в классе Units. вот правильный код (надеюсь): импортировать панд как pd из единиц импорта единиц из конвертировать импорт Конвертировать, КонвертироватьТемпературу из параметра импорта параметров, ListOfParameters из buckingham_pi_theorem. Dimensional_anaлиз импортировать DimensionalAnalice

class Data:
def __init__(self, file, pandas=False):
        self.file_location = '' if pandas else 
file
        self.data = file if pandas else 
self.read_file(self.file_location)
        self.parameters = 
self.generate_list_of_parameters()

@staticmethod
def read_file(file_location):
    data = pd.read_csv(file_location)
    return data

def generate_list_of_parameters(self):
    parameters = ListOfParameters([])
    for key in self.data:
        try:
            print(f"Processing key: {key}")  # Debugging statement
            parts = key.split('-')
            if len(parts) > 1 and parts[1]:  # Check if there's a valid second part
                unit_key = parts[1]
                unit = getattr(Units, unit_key, None)
                if unit is not None:
                    parameters.append(Parameter(value=[value for value in self.data[key]],
                                                units=unit,
                                                name=parts[0]))
                else:
                    print(f"Attribute '{unit_key}' not found in Units class")
            else:
                print(f"Key '{key}' does not have a valid second part after hyphen")
        except Exception as e:
            print(f"Error processing key '{key}': {e}")
    return parameters

if __name__ == "__main__":
experiment = Data("C:/Users/truma/Downloads/test - bernoulli_v2.csv")
d = DimensionalAnalysis(experiment.parameters)
d.plot()

values = [80, 20, 9.8, 1, 1, 1]
test = ListOfParameters([])
for i, parameter in enumerate(experiment.parameters[1:]):
    test.append(Parameter(value=values[i], units=parameter.units, name=parameter.name))
print('test', test)

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ, ЧТО ИМПОРТ НЕТ В ЭТОМ КОДЕ И ДОЛЖЕН БЫТЬ ДОБАВЛЕН!

Если вы используете Streamlit и столкнулись с проблемами при импорте класса данных из файла, убедитесь, что структура файла и операторы импорта настроены правильно, например:

import streamlit as st
from data_reader import Data

def main():
    st.title("Dimensional Analysis Tool")
    uploaded_file = st.file_uploader("Choose a CSV file", type = "csv")
if uploaded_file is not None:
    data = Data(uploaded_file, pandas=True)  # Assuming the CSV file is processed as a pandas DataFrame
    st.write(data.data)
    # Perform further analysis and display results

if __name__ == "__main__":
    main()

Я добавил полную часть кода, включающую эту строку. Можете ли вы подсказать, что не так с индексацией?

Tom 06.07.2024 20:12

Я попытался использовать другой файл данных, и сообщение об ошибке было для той же части кода, но теперь говорится, что объект «Unit» не может быть вызван, поэтому не уверен, что происходит.

Tom 07.07.2024 02:31

Я думаю, ошибка возникает, когда вы пытаетесь вызвать объект, который не может быть вызван. это может быть связано с тем, как вы используете класс Units.

thatguy 07.07.2024 11:46

и можете ли вы предоставить код, чтобы я мог увидеть, что происходит не так и где

thatguy 07.07.2024 11:46

Я добавил часть с классом Units внизу своего поста.

Tom 07.07.2024 13:23

Вот ссылка на файл data_reader.py в репозитории GitHub github.com/FluidsLab/fluid_ws/blob/main/data_reader.py

Tom 07.07.2024 13:24

я добавил код сейчас

thatguy 08.07.2024 18:49

Я запустил измененный код, но сообщение об ошибке было добавлено ко второму редактированию исходного сообщения.

Tom 08.07.2024 19:54

Файл «C:\Users\holli\data_reader.py», строка 11 self.data = файл if pandas else ^ SyntaxError: неверный синтаксис

Tom 08.07.2024 20:00

Я изменил self,file в строке 9 на self.file, и там было написано File "C:\Users\holli\data_reader.py", строка 9 def __init__(self.file, pandas=False): ^ SyntaxError: неверный синтаксис

Tom 08.07.2024 20:08

Я попытался изменить часть def_init на исходную часть и получил сообщение об ошибке. Объект «Данные» не имеет атрибута «generate_list_of_parameters».

Tom 08.07.2024 20:15

Возникающая ошибка связана с опечаткой в ​​определении метода конструктора инициализации в классе данных. сигнатура метода должна быть def __init__(self, file, pandas=False):, а не def __init__(self.file, pandas=False):. я добавил исправленную версию вашего кода сейчас

thatguy 08.07.2024 20:15

Итак, я использую ваш первый блок текста и проверяю, правильно ли импортирован класс данных. Он работает, и приложение создается, но когда я ввожу файл данных, он говорит AttributeError: объект «Данные» не имеет атрибута «generate_list_of_parameters».

Tom 08.07.2024 21:45

Сообщение об ошибке AttributeError: объект «Данные» не имеет атрибута «generate_list_of_parameters» предполагает, что методgenerate_list_of_parameters не определен в классе данных. убедитесь, что метод правильно определен в классе Data, а также что отступы и структура кода правильны. я снова обновил код

thatguy 09.07.2024 10:32

Я попробовал вашу часть кода с классом Data, но она не сработала из-за отступов. Я добавил свою собственную версию в исходное сообщение, я не уверен, почему это не сработает для определенияgenerate_list_of_parameters.

Tom 09.07.2024 12:53

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

Tom 09.07.2024 14:42

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