класс python: запускайте функции шаг за шагом и сохраняйте их

#python #pandas #function #class

Вопрос:

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

 from pydantic import BaseModel
from config import DATA_REPO
import pandas as pd
import os

class PandaDataFrame(BaseModel):
data: pd.DataFrame

      class Config:
          arbitrary_types_allowed = True

class Directory(BaseModel):
    data_directory: str

class DataToPandaReader(object):

    def csv_file_reader(self, directory: Directory):
        directory = directory.data_directory
        for file in os.listdir(directory):
            if file.endswith('.csv'):
               return pd.read_csv(os.path.join(directory, file))

class DataProcessor(object):

    def remove_punctuation(self, my_: PandaDataFrame):
        my_data_to_process = my_.data
        for col in my_data_to_process:
            if any(word in col for word in ['example', 'text', 'Answer']):
                my_data_to_process = my_data_to_process[col].str.replace('[^ws]', '', regex=True)
                return add_number_column(my_data_to_process)

    def add_number_column(self, my_: PandaDataFrame):
        my_data_to_process = my_.data
        my_data_to_process['sentence_number'] = range(len(my_data_to_process))
        return save_final_dataframe(my_data_to_process)

    def save_final_dataframe(self, my_:PandaDataFrame):
        my_data_to_process = my_.data
        return my_data_to_process.to_csv('final_data.csv')

def parse_data_process(directory_to_csv_file):
    toprocess = DataProcessor()
    toprocess.save_final_dataframe(directory_to_csv_file)
    toprocess.remove_punctuation(directory_to_csv_file)
    toprocess.add_number_column(directory_to_csv_file)
    return toprocess

if __name__ == '__main__':
    parse_data_process(PandaDataFrame(data= DataToPandaReader().csv_file_reader(Directory(data_directory = os.path.join(DATA_REPO, 'input_data')))))
 

теперь, например, чтобы создать экземпляр первой функции в классе DataProcessor, я бы сделал следующее

 DataProcessor().remove_punctuation(PandaDataFrame(data= DataToPandaReader().csv_file_reader(Directory(data_directory = os.path.join(DATA_REPO, 'input_data')))))
 

но мое намерение состоит в том, чтобы запустить все эти функции в классе обработчика данных шаг за шагом, чтобы функция save_final_dataset сохранила кадр данных, у которого была удалена пунктуация, а также столбец чисел.

Обновить:

следуя данному ответу, я внес эти изменения, но получил ошибку, что функции неизвестны.

 def parse_data_process(directory_to_csv_file):
    toprocess = DataProcessor()
    toprocess.save_final_dataframe(directory_to_csv_file)
    toprocess.remove_punctuation(directory_to_csv_file)
    toprocess.add_number_column(directory_to_csv_file)
    return toprocess

if __name__ == '__main__':
    parse_data_process(PandaDataFrame(data= DataToPandaReader().csv_file_reader(Directory(data_directory = os.path.join(DATA_REPO, 'input_data')))))
 

Комментарии:

1. Нам нужно увидеть ваш полный код, чтобы понять проблему здесь.

2. это полный код, я просто добавил часть в разделе обновления к исходному коду, который я опубликовал здесь

3. def parse_data_process(directory_to_csv_file): toprocess = обработчик данных() возвращает toprocess.remove_punctuation(directory_to_csv_file) Это все, что вам нужно, потому что remove_punctuation вызывает другие функции в правильной последовательности

4. большое спасибо, я изменил процесс def parse_data_процесса, но я все равно получаю ошибку: ошибка имени: имя «add_number_column» не определено

5. Я пропустил тот факт, что вы поместили свои функции в класс (на мой взгляд, ненужный). Поэтому решение состоит в том, чтобы квалифицировать вызов функции с помощью «self».

Ответ №1:

Если я не неправильно понял ваш вариант использования, все, что вам нужно сделать, это заменить

 return my_data_to_process
 

…в функции remove_punctuation с

 return add_number_column(my_data_to_process)
 

…затем замените

 return my_data_to_process
 

…в функции add_number_column с

 return save_final_dataframe(my_data_to_process)
 

Комментарии:

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