我有一个时间序列数据,并使用fastai.collab
模块在其中添加了一些功能。它添加的功能之一是Dayofweek
。我正在手动尝试添加另一个功能,该功能将称为Weekend
,它将是一个二进制列-如果Dayofweek
的计算结果为false,则为0,否则它将得到1。该过程确实是很简单,但是标准程序要花很多时间(要等待40分钟以上)。我已经尝试过了:
print(data.columns)
Index(['shop_id', 'item_id', 'item_price', 'item_cnt_day', 'item_category_id',
'Year', 'Month', 'Week', 'Day', 'Dayofweek', 'Dayofyear',
'Is_month_end', 'Is_month_start', 'Is_quarter_end', 'Is_quarter_start',
'Is_year_end', 'Is_year_start', 'weekend'],
dtype='object')
data['Weekend'] = 0
for row in range(0, len(data)):
if data['Dayofweek'][row] == 5 or data['Dayofweek'][row] == 6:
data['Weekend'] = 1
else:
data['Weekend'] = 0
关于功能估算的模块很多,但不确定在此使用哪个模块。我可以对这些列进行子集并创建一个新表,然后在新表上再次尝试循环,然后将其粘贴回data
,但是我认为应该有更好的方法。桌子很大(2935849,19),所以这可以解释这里的效率低下。
答案 0 :(得分:3)
尝试坚持使用pandas
自己的方法以提高效率。这是一个建议:
data['Weekend'] = data['Dayofweek'].ge(5).astype(int)
请注意,如果内存效率是一个问题,则最好将其转换为内存效率更高(即更小)的整数类型。您的情况的最佳选择是np.int8
,它只是一个字节:
data['Weekend'] = data['Dayofweek'].ge(5).astype(np.int8)
这占用与boolean相同的内存量。具有1000000行的DataFrame
的示例。首先作为布尔值供参考:
df = pd.DataFrame()
df['Dayofweek'] = np.random.randint(0, 7, 10**6)
df['Dayofweek'].max()
df['Weekend'] = df['Dayofweek'].ge(5)
df['Weekend'].memory_usage()
输出:
1000080
现在为整数:
df['Weekend'] = df['Dayofweek'].ge(5).astype(int)
df['Weekend'].memory_usage()
输出:
4000080
与布尔值情况有很大的不同。
现在np.int8
(字节):
df['Weekend'] = df['Dayofweek'].ge(5).astype(np.int8)
df['Weekend'].memory_usage()
输出:
1000080