«ОШИБКА — объект «NoneType» не имеет атрибута» оси «» при попытке прочитать файл pickle из объекта s3 байтов

#python-3.x #airflow #pickle #series

Вопрос:

Я запускаю следующий код в среде Apache airflow, чтобы получить файл pickle из s3 и прочитать его в память. Как только я пытаюсь прочитать/распечатать содержимое файла, я получаю сообщение об ошибке:

ERROR - 'NoneType' object has no attribute 'axes'


код

 import boto3
import pickle


# [...Omitted code...]  

s3_session = boto3.Session(
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key
)

s3 = s3_session.resource('s3')
obj = s3.Object(bucket_name, KEY)
pickle_contents = obj.get()['Body'].read()
body = pickle.loads(pickle_contents)

print(body)

# ^-- This is where the error happens, as soon as I try to read it. 
 

Этот код на самом деле, похоже, отлично работает на отдельном экземпляре ноутбука Jupyter, что наводит меня на мысль о проблеме несовместимости версий? Файл pickle выглядит как приведенный ниже словарь, благодаря моей записной книжке Jupyter, позволяющей мне print(body) :

ТЕЛО ФАЙЛА ДЛЯ РАССОЛА:

 {75: 
  'recommendation_diversity_metrics': 
    {'largest_subcategory_group_proportion': 
      {'mean': 0.3369472,
       'sd': 0.1741708739837092,
       'min': 0.05333333333333334,
       'max': 1.0},
     'catalogue_entropy': 3.4412171579585533,
     'subcategory_overweight_frequency': 
        School amp; Office Supplies    0.73020
        Pants                       0.70656
        Bedding                     0.64138
        Sweaters                    0.62616
        Tops                        0.57044
                                     ...   
        Cleanup amp; Odor Control      0.00144
        UNKNOWN                     0.00036
        Body Piercings              0.00034
        Misc Books                  0.00012
        Home Books                  0.00012
        Length: 94, dtype: float64},
  'recommendation_novelty_metrics': {
    'previously_interacted': {'mean': 0.052456533333333326,
      'sd': 0.06291214458333363,
      'min': 0.0,
      'max': 0.6},
    'new_product_frequency': {'mean': 0.016672799999999998,
      'sd': 0.01423356021834222,
      'min': 0.0,
      'max': 0.12}
      }}
 

Я думаю, что ошибка возникает из-за того, что у меня в словаре есть объект серии pandas (см. subcategory_overweight_frequency В словаре выше). Потому что до тех пор, пока я читаю только все элементы словаря, кроме этого конкретного, интерпретатор позволяет моему коду работать нормально. Мне не хватает зависимости для этого, о которой я не знаю?


ПОЛНАЯ ОБРАТНАЯ СВЯЗЬ

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/pandas/core/frame.py", line 655, in __repr__
    show_dimensions=show_dimensions,
  File "/usr/local/lib/python3.7/site-packages/pandas/core/frame.py", line 774, in to_string
    line_width=line_width,
  File "/usr/local/lib/python3.7/site-packages/pandas/io/formats/format.py", line 484, in __init__
    self.max_rows_displayed = min(max_rows or len(self.frame), len(self.frame))
  File "/usr/local/lib/python3.7/site-packages/pandas/core/frame.py", line 996, in __len__
    return len(self.index)
  File "/usr/local/lib/python3.7/site-packages/pandas/core/generic.py", line 5175, in __getattr__
    return object.__getattribute__(self, name)
  File "pandas/_libs/properties.pyx", line 63, in pandas._libs.properties.AxisProperty.__get__
AttributeError: 'NoneType' object has no attribute 'axes'
 

Ответ №1:

Возможно, вы замариновали фрейм данных с более поздней версией Pandas и, возможно, пытаетесь прочитать файл рассола с более ранней версией.

Пожалуйста, проверьте версию, которую вы использовали для маринования фрейма данных, и какую версию Pandas вы используете с Airflow.

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

1. Это совершенно верно. К сожалению, Airflow (Астроном) не позволяет указать любую версию панд, которую вы хотите requirements.txt файл, поэтому мне нужно либо обновить версии Airflow, либо изменить исходные данные для этого элемента на стандартные списки python.

2. Счастлив, что вы нашли преступника. Значит, это не установка apache-airflow из requirements.txt ?

3. У Astronomer есть собственные пакеты python и ОС системного уровня, которые устанавливаются при запуске контейнера, но модули времени выполнения airflow указаны в requirements.txt файл, однако, выдает мне ошибку, когда я пытаюсь установить другую версию pandas в requirements.txt. Потенциально я мог бы попробовать установить нужную мне версию pandas на уровне пользователя (из файла Dockerfile), но сейчас я этого делать не буду, так как я реализовал обходной путь (изменил исходные данные на стандартные списки python).