作者在应用深度学习解决实际工程问题时遇到了不同样本数据维度不一致的问题导致无法运算的问题,比如股票预测(不同股票上市时间不一致)、电力预测(不同地区电力统计频率不一致)等实际情况会导致数据样本维度不一致。
对此如果单纯的通过时间序列对其的方式来保证维度一致,会造成大量的数据浪费,且随机删除还会影响时序数据的连贯性,对此选择了数据填充的方式来保证维度一致。
在数据填充时要根据数据特征选择不同的数据填充方法,作者在这是部分列选择了取上下两行平均值,其他列则与上一行结果一致
import os
import pandas as pd
# 设置文件夹路径、列名列表和要填充的总行数
folder_path = 'path_to_your_folder' # 替换为你的文件夹路径
average_columns = ['生产日期', '日产油量', '日产液量'] # 替换为你要计算平均值的列名列表
total_rows = 100 # 替换为你想要填充的总行数
# 获取文件夹中所有Excel文件的路径
excel_files = [f for f in os.listdir(folder_path) if f.endswith('.xlsx')]
# 遍历每个Excel文件
for file in excel_files:
file_path = os.path.join(folder_path, file)
# 读取Excel文件
df = pd.read_excel(file_path, engine='openpyxl')
# 获取原始行数
original_rows = len(df)
# 如果原始行数已经达到或超过指定的总行数,则不进行处理
if original_rows >= total_rows:
print(f"Skipping {file} because it already has {original_rows} rows or more.")
continue
# 计算需要填充的行数
rows_to_add = total_rows - original_rows
# 填充数据直到达到指定行数
for _ in range(rows_to_add):
# 如果不是最后一行,则计算平均值并填充新行
if len(df) > 1:
prev_row = df.iloc[-2]
new_row = df.iloc[-1].copy()
# 计算平均值列的新值
for col in average_columns:
new_row[col] = (prev_row[col] + new_row[col]) / 2
else:
# 如果是最后一行且需要填充,则复制最后一行作为新行
new_row = df.iloc[-1].copy()
# 对于其他列,复制上一行的数据
for col in df.columns:
if col not in average_columns:
new_row[col] = df.iloc[-1][col]
# 将新行添加到数据框的末尾
df = df.append(new_row, ignore_index=True)
# 保存修改后的Excel文件,覆盖原文件
df.to_excel(file_path, index=False, engine='openpyxl')
print(f"Filled and overwritten {file} with {len(df)} rows.")
对了版本的pandas会进行'DataFrame' object has no attribute 'append'的报错,这时候可以调整Pandas版本或修改代码为df = df._append(new_row, ignore_index=True)