使用多个 excel 工作表加速 pandas 迭代
Speed up pandas iteration with multiple excel sheets
我有一个包含 1000 个 sheet 的 excel 文件,每个 sheet 包含一个数据帧。为了向我的模型提供这些数据,我尝试将其转换为 1000 批张量,这是我的代码:
df = pd.read_excel('file.xlsx', sheet_name=None)
file_names = list(df.keys())
columns = ['A','B','C']
features = []
labels = []
for n in file_names:
df = pd.read_excel('file.xlsx', sheet_name=n)
features.append(df[columns].to_numpy())
labels.append(df['D'].to_numpy())
Y = tf.convert_to_tensor(np.stack(labels), dtype=tf.float32)
X = tf.convert_to_tensor(np.stack(features), dtype=tf.float32)
dataset = tf.data.Dataset.from_tensor_slices((X, Y))
我的代码工作正常,但是迭代它需要一个多小时。
我将来会有超过 1000 批数据,所以拥有几千个 csv 文件似乎不是一个好主意。
我怎样才能加快这个过程?
您可以检索一次 file.xlsx
,这会将所有工作表读入数据框字典,然后您可以从该字典中获取工作表:
import tensorflow as tf
import pandas as pd
import numpy as np
from random import sample
### Create data
writer = pd.ExcelWriter('file.xlsx', engine='xlsxwriter')
for i in range(1000):
df = pd.DataFrame({'A': [1, i, 1, 2, 9], 'B': [3, 4, i, 1, 4], 'C': [3, 4, 3, i, 4], 'D': [1, 2, 6, 1, 4], 'E': [0, 1, 1, 0, 1]})
df.to_excel(writer, sheet_name='Sheet'+ str(i))
writer.save()
df = pd.read_excel('file.xlsx', sheet_name=None)
file_names = list(df.keys())
columns = ['A','B','C']
features = []
labels = []
for n in file_names:
temp_df = df[n]
features.append(temp_df[columns].to_numpy())
labels.append(temp_df['D'].to_numpy())
Y = tf.convert_to_tensor(np.stack(labels), dtype=tf.float32)
X = tf.convert_to_tensor(np.stack(features), dtype=tf.float32)
dataset = tf.data.Dataset.from_tensor_slices((X, Y))
此外,您可以尝试创建自己的自定义数据生成器并从您的 Excel 文件中检索随机样本,这也会加快处理速度:
df = pd.read_excel('file.xlsx', sheet_name=None)
file_names = list(df.keys())
columns = ['A','B','C']
def generator_function(samples = 64):
def generator():
for n in sample(file_names, samples):
temp_df = df[n]
x = temp_df[columns].to_numpy()
y = temp_df['D'].to_numpy()
yield x, y
return generator
gen = generator_function()
dataset = tf.data.Dataset.from_generator(
generator=gen,
output_types=(np.float32, np.int32),
output_shapes=((5, 3), (5))
)
batch_size = 16
dataset = dataset.batch(batch_size, drop_remainder=True)
dataset = dataset.prefetch(tf.data.AUTOTUNE)
我有一个包含 1000 个 sheet 的 excel 文件,每个 sheet 包含一个数据帧。为了向我的模型提供这些数据,我尝试将其转换为 1000 批张量,这是我的代码:
df = pd.read_excel('file.xlsx', sheet_name=None)
file_names = list(df.keys())
columns = ['A','B','C']
features = []
labels = []
for n in file_names:
df = pd.read_excel('file.xlsx', sheet_name=n)
features.append(df[columns].to_numpy())
labels.append(df['D'].to_numpy())
Y = tf.convert_to_tensor(np.stack(labels), dtype=tf.float32)
X = tf.convert_to_tensor(np.stack(features), dtype=tf.float32)
dataset = tf.data.Dataset.from_tensor_slices((X, Y))
我的代码工作正常,但是迭代它需要一个多小时。 我将来会有超过 1000 批数据,所以拥有几千个 csv 文件似乎不是一个好主意。 我怎样才能加快这个过程?
您可以检索一次 file.xlsx
,这会将所有工作表读入数据框字典,然后您可以从该字典中获取工作表:
import tensorflow as tf
import pandas as pd
import numpy as np
from random import sample
### Create data
writer = pd.ExcelWriter('file.xlsx', engine='xlsxwriter')
for i in range(1000):
df = pd.DataFrame({'A': [1, i, 1, 2, 9], 'B': [3, 4, i, 1, 4], 'C': [3, 4, 3, i, 4], 'D': [1, 2, 6, 1, 4], 'E': [0, 1, 1, 0, 1]})
df.to_excel(writer, sheet_name='Sheet'+ str(i))
writer.save()
df = pd.read_excel('file.xlsx', sheet_name=None)
file_names = list(df.keys())
columns = ['A','B','C']
features = []
labels = []
for n in file_names:
temp_df = df[n]
features.append(temp_df[columns].to_numpy())
labels.append(temp_df['D'].to_numpy())
Y = tf.convert_to_tensor(np.stack(labels), dtype=tf.float32)
X = tf.convert_to_tensor(np.stack(features), dtype=tf.float32)
dataset = tf.data.Dataset.from_tensor_slices((X, Y))
此外,您可以尝试创建自己的自定义数据生成器并从您的 Excel 文件中检索随机样本,这也会加快处理速度:
df = pd.read_excel('file.xlsx', sheet_name=None)
file_names = list(df.keys())
columns = ['A','B','C']
def generator_function(samples = 64):
def generator():
for n in sample(file_names, samples):
temp_df = df[n]
x = temp_df[columns].to_numpy()
y = temp_df['D'].to_numpy()
yield x, y
return generator
gen = generator_function()
dataset = tf.data.Dataset.from_generator(
generator=gen,
output_types=(np.float32, np.int32),
output_shapes=((5, 3), (5))
)
batch_size = 16
dataset = dataset.batch(batch_size, drop_remainder=True)
dataset = dataset.prefetch(tf.data.AUTOTUNE)