LINUX.ORG.RU

Python типизация с DataFrame

 ,


0

1

Функция возвращает pandas.DataFrame. Как указать тип возвращаемого значения?

FrameDTO = {'x': pd.Series(dtype='int'),
            'y': pd.Series(dtype='str')}
	
DataFrameDTO = pd.DataFrame(FrameDTO) \
                 .astype('datetime64[ns]')	


def make_df() -> type(DataFrameDTO): # error: Invalid type comment or annotation
                                     #  note: Suggestion: use type[...] instead of type(...)
	x = pd.Series([1, 2, 3])
	y = pd.Series(['a', 'b', 'c'])
	df = pd.DataFrame({'x': x, 'y': y})
	df.index = pd.date_range(start='1/1/2021', end='1/3/2021')
	return df

P.S. mypy 0.812

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

def make_df() -> pd.core.frame.DataFrame:



Последнее исправление: scientistpython (всего исправлений: 4)

Мной многостолетний опыт в питоне подсказывает мне use type[…] instead of type(…).

scientistpython

Докатились, уже у питона есть свои саентисты.

OTEU_APUCTOKJ7UU
()

похожу что-то такое нужно делать, но нужно добить:

class DataFrameDTO(pd.DataFrame):
    x: "pd.Series['int']"
    y: pd.Series(dtype=str) # error: Invalid type comment or annotation
                            # note: Suggestion: use pd.Series[...] instead of pd.Series(...)
def make_df() -> DataFrameDTO:
    d = DataFrameDTO
    d.x = pd.Series([1, 2, 3], dtype=int) # error: Unexpected keyword argument "dtype" for "Series"
    d.y = pd.Series(['a', 'b', 'c'], dtype=str) # error: Unexpected keyword argument "dtype" for "Series"
    df.index = pd.date_range(start='1/1/2021', end='1/3/2021') # error: Module has no attribute "date_range"
    return df
scientistpython
() автор топика
Последнее исправление: scientistpython (всего исправлений: 1)
Ответ на: комментарий от OTEU_APUCTOKJ7UU

Докатились, уже у питона есть свои саентисты.

просто два слова для логина, никакого смысла

scientistpython
() автор топика
Ответ на: комментарий от scientistpython

Ты что-то странное хочешь. Тип в mypy тот, который может быть гарантирован на этапе компиляции.

То есть либо

def make_df() -> datetime64[ns]

если ты точно знаешь, что

DataFrameDTO = pd.DataFrame(FrameDTO) \
                 .astype('datetime64[ns]')

Либо

def make_df() -> Any
monk ★★★★★
()
Ответ на: комментарий от monk

Я хочу, чтобы make_df() гарантированно возвращал pd.DataFrame с колонками: x типа int и y типа str, и индексами типа np.datetime64. Это, вообще, возможно? Если возможно, то как?

scientistpython
() автор топика
Ответ на: комментарий от monk

Хотя, отмечу более глобальную цель. Мне нужно проработать Data transfer Object в виде pd.DataFrame для передачи данных между модулями. Чтобы не путаться … Может ДатаФрейм конвертировать в словари на выходе из функции, а принимающая сторона будет из словаря собирать ДатаФрейм - но это конечно потеря по времени …

scientistpython
() автор топика
Ответ на: комментарий от scientistpython

Я хочу, чтобы make_df() гарантированно возвращал pd.DataFrame с колонками: x типа int и y типа str

Типом является pd.DataFrame. Либо надо переписывать библиотеку в виде обобщённого класса. Либо максимум можно сделать что-то вроде

class DataFrameDTO(pd.DataFrame):
    r: pd.DataFrame
    def __init__(self, arg):
      r = arg
    def get_x(n) -> int:
      # получить значение элемента колонки x
    def get_y(n) -> str:
      # получить значение элемента колонки y


def make_df() -> DataFrameDTO:
  x = pd.Series([1, 2, 3])
  y = pd.Series(['a', 'b', 'c'])
  return DataFrameDTO(pd.DataFrame({'x': x, 'y': y}))

monk ★★★★★
()
Ответ на: комментарий от scientistpython

Мне нужно проработать Data transfer Object в виде pd.DataFrame для передачи данных между модулями.

Так и передавай просто pd.DataFrame. Без ограничений на его значения.

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.