#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. большое спасибо за ваш ответ, я попробовал то, что вы рекомендовали, и написал функцию вне класса, чтобы создать экземпляр класса обработчика данных, однако я получаю ошибку при добавлении имен функций в предыдущие функции. пожалуйста, ознакомьтесь с обновлением