У вас есть исходный файл Orders.xlsx, содержащий данные в следующем формате:
```
Weekday Shop1 Shop_2 Shop_3 Shop4
mon 7 1 7 8
tue 4 2 5
wed 5 2 3
thu 8 8 7
fri 15 11 13 9
sat 21 18 17
sun 25 16 25 17
```
Задачи, которые необходимо решить:
1. Использовать функцию `rename_columns(test_df)` для переименования столбцов в формате `shop_1, shop_2...`.
2. Использовать функцию `fillna_values(test_df, n=0)` для замены пустых значений в исходном файле на 1, при этом `n` - это число, значение по умолчанию 0.
3. Разработать функцию `etl()`, которая соберет итоговые отчеты и сохранит их в форматах 'csv' и 'xlsx' в каталог, где находится исходный файл.
Ниже представлен ваш код:
```python
import pandas as pd
import os
orders_path = './data/Orders.xlsx'
n = 1
def rename_columns(test_df):
test_df.columns = ['Shop_1', 'Shop_2', 'Shop_3', 'Shop_4']
expected_columns = 4
if len(test_df.columns) != expected_columns:
print(f"Ожидалось {expected_columns} столбца, но найдено {len(test_df.columns)}.")
return None
return test_df
test_df = pd.read_excel(orders_path, index_col=0)
if not os.path.exists(orders_path):
print(f"Файл {orders_path} не найден.")
def fillna_values(test_df, n=0):
res = rename_columns(test_df)
return res.fillna(n)
def etl():
res = fillna_values(test_df, n)
res.to_csv('./data/Orders_etl.csv')
res.to_excel('./data/Orders_etl.xlsx')
return 'Файлы успешно сохранены'
result = etl()
print(result)
```
При выполнении кода возникает ошибка:
```
E ValueError: Length mismatch: Expected axis has 3 elements, new values have 4 elements
```
Помимо кода, вам нужно учесть, что тест не проходит из-за несоответствия количества столбцов. Пожалуйста, проверьте количество столбцов в исходном DataFrame перед их переименованием.
Ошибка «length mismatch: expected axis has 3 elements, new values have 4 elements» возникает, когда вы пытаетесь задать новое имя для столбцов DataFrame, и количество имен, которые вы указываете, не соответствует количеству столбцов в DataFrame.
В вашем случае код вызывает функцию `rename_columns(test_df)`, которая пытается изменить имена столбцов на ['Shop_1', 'Shop_2', 'Shop_3', 'Shop_4']. Однако исходный DataFrame, вероятно, содержит 3 столбца, что и приводит к этой ошибке.
**Причины возникновения ошибки:**
1. **Изменение структуры данных:** Возможно, при чтении файла `Orders.xlsx` в DataFrame в исходных данных содержится меньше 4 столбцов. Проверьте количество столбцов исходного DataFrame перед переименованием.
2. **Неправильное восприятие заголовков:** Если в файле нет заголовков, Pandas по умолчанию может интерпретировать первую строку как данные, а не как заголовки столбцов.
## Исправленный код
Вот исправленный код с обработкой ошибок и проверкой количества столбцов:
```python
import pandas as pd
import os
# Путь к файлу
orders_path = './data/Orders.xlsx'
n = 1
# Функция для переименования столбцов
def rename_columns(test_df):
expected_columns = 4
if len(test_df.columns) != expected_columns:
print(f"Ожидалось {expected_columns} столбца, но найдено {len(test_df.columns)}. Переименование невозможно.")
return None
test_df.columns = ['Shop_1', 'Shop_2', 'Shop_3', 'Shop_4']
return test_df
# Проверка существования файла
if not os.path.exists(orders_path):
print(f"Файл {orders_path} не найден.")
else:
test_df = pd.read_excel(orders_path, index_col=0)
# Функция для замены NaN значений
def fillna_values(test_df, n=0):
res = rename_columns(test_df)
if res is not None: # Убедитесь, что переименование прошло успешно
return res.fillna(n)
else:
return None
# Функция ETL для сбора итоговых отчетов
def etl():
res = fillna_values(test_df, n)
if res is not None: # Убедитесь, что заполнение прошло успешно
res.to_csv('./data/Orders_etl.csv', index=True)
res.to_excel('./data/Orders_etl.xlsx', index=True)
return 'Файлы успешно сохранены'
else:
return 'Ошибка при обработке данных'
result = etl()
print(result)
```
### Изменения:
1. **Проверка количества столбцов:** Перед переименованием столбцов добавлена проверка, чтобы убедиться, что количество столбцов соответствует ожидаемому.
2. **Обработка ошибок:** В функции `fillna_values` добавлена проверка, чтобы убедиться, что переименование столбцов прошло успешно перед попыткой заменить NaN значения.
Эти изменения помогут избежать ошибок и обеспечат корректное выполнение вашего кода.
мне вот интересно, это задания с курсов каких то безумных? Никто в реале не будет писать функции rename_columns или fillna_values. Реально, если это с курсов это ну совсем не куда не годится.
Что касается этого безумного кода.
исходный фрейм у тебя имеет 5 колонок а ты пытаешься установить, 4 вот в этой строке
test_df.columns = ['Shop_1', 'Shop_2', 'Shop_3', 'Shop_4']
пример того безумия, что происходит
df = pd.DataFrame({ 'A':[1,2,3], 'B':[4,5,6], 'C':[6,7,8] }) df.columns = ['AA','BB']