如何计算熊猫数据框滚动窗口中唯一字符串的数量?
a = pd.DataFrame(['a','b','a','a','b','c','d','e','e','e','e'])
a.rolling(3).apply(lambda x: len(np.unique(x)))
Run Code Online (Sandbox Code Playgroud)
输出,与原始数据帧相同:
0
0 a
1 b
2 a
3 a
4 b
5 c
6 d
7 e
8 e
9 e
10 e
Run Code Online (Sandbox Code Playgroud)
预期的:
0
0 1
1 2
2 2
3 2
4 2
5 3
6 3
7 3
8 2
9 1
10 1
Run Code Online (Sandbox Code Playgroud) 我试图使用fit_generator
自定义生成器来读取对于内存来说太大的数据.我想要训练125万行,所以我一次产生50,000行.fit_generator
有25个steps_per_epoch
,我认为每个时期会带来1.25MM.我添加了一个print语句,以便我可以看到该进程正在做多少偏移,并且当它进入epoch 2时,我发现它超过了max.该文件中总共有175万条记录,并且一次它传递了10个步骤,它在create_feature_matrix
调用中得到一个索引错误(因为它没有引入任何行).
def get_next_data_batch():
import gc
nrows = 50000
skiprows = 0
while True:
d = pd.read_csv(file_loc,skiprows=range(1,skiprows),nrows=nrows,index_col=0)
print(skiprows)
x,y = create_feature_matrix(d)
yield x,y
skiprows = skiprows + nrows
gc.collect()
get_data = get_next_data_batch()
... set up a Keras NN ...
model.fit_generator(get_next_data_batch(), epochs=100,steps_per_epoch=25,verbose=1,workers=4,callbacks=callbacks_list)
Run Code Online (Sandbox Code Playgroud)
我使用fit_generator是错误的还是需要对我的自定义生成器进行一些更改才能使其正常工作?
data['rolling_avg_val'] = 0
future_window = '1h'
for i in range(data.shape[0]):
start_data_idx = data.index[i]
end_data_idx = start_data_idx + pd.Timedelta(future_window)
temp_avg = data['values'][start_data_idx:end_data_idx].mean()
if temp_avg == 0:
continue
data.loc[start_data_idx,'rolling_avg_val'] = temp_avg
Run Code Online (Sandbox Code Playgroud)
该数据框大约有5,000,000行,代表两周内的数据,看起来像这样,其中索引是以毫秒为单位的时间戳:
2017-04-12 12:19:04.987 0
2017-04-12 12:19:05.157 1
2017-04-12 12:19:05.297 0
2017-01-12 12:19:05.330 0
2017-04-12 12:19:05.487 0
2017-04-12 12:19:05.530 1
2017-04-12 12:19:05.640 0
2017-04-12 12:19:05.703 1
Run Code Online (Sandbox Code Playgroud)
如您所见,时间戳记并不是均匀分布的,并且end_data_idx不一定在数据帧中,但是在切片时pandas能够获得适当的范围。我看到的一个常见解决方案是填写缺少的时间间隔,然后移动结果。但是,这会使内存爆炸,因此我尝试避免这种情况。
在我的机器上,它每秒大约可以处理800行。是否有其他方法可以考虑此问题以获得更快的解决方案?
编辑:
预期产量:
rolling_avg
2017-04-12 12:19:04.987 0.375
2017-04-12 12:19:05.157 0.429
2017-04-12 12:19:05.297 0.333
2017-01-12 12:19:05.330 0.4
2017-04-12 12:19:05.487 0.5
2017-04-12 12:19:05.530 0.667
2017-04-12 12:19:05.640 0.5 …
Run Code Online (Sandbox Code Playgroud) 使用 sklearn 在随机森林分类器上运行网格搜索。这运行的时间比我想象的要长,我试图估计这个过程还剩下多少时间。我认为它会做的拟合总数是 3*3*3*3*5 = 405。
clf = RandomForestClassifier(n_jobs=-1, oob_score=True, verbose=1)
param_grid = {'n_estimators':[50,200,500],
'max_depth':[2,3,5],
'min_samples_leaf':[1,2,5],
'max_features': ['auto','log2','sqrt']
}
gscv = GridSearchCV(estimator=clf,param_grid=param_grid,cv=5)
gscv.fit(X.values,y.values.reshape(-1,))
Run Code Online (Sandbox Code Playgroud)
从输出中,我看到它循环执行任务,其中每组都是估计器的数量:
[Parallel(n_jobs=-1)]: Done 34 tasks | elapsed: 1.2min
[Parallel(n_jobs=-1)]: Done 184 tasks | elapsed: 5.3min
[Parallel(n_jobs=-1)]: Done 200 out of 200 tasks | elapsed: 6.2min finished
[Parallel(n_jobs=8)]: Done 34 tasks | elapsed: 0.5s
[Parallel(n_jobs=8)]: Done 184 tasks | elapsed: 3.0s
[Parallel(n_jobs=8)]: Done 200 tasks out of 200 tasks | elapsed: 3.2s finished
[Parallel(n_jobs=-1)]: Done 34 tasks | …
Run Code Online (Sandbox Code Playgroud) python machine-learning random-forest scikit-learn grid-search
我真的想要访问pandas 0.19中的一些更新函数,但Azure ML studio使用pandas 0.18作为Anaconda 4.0软件包的一部分.有没有办法更新"执行Python脚本"组件中使用的版本?
python ×4
pandas ×3
anaconda ×1
azure ×1
azure-machine-learning-studio ×1
generator ×1
grid-search ×1
keras ×1
numpy ×1
python-3.x ×1
scikit-learn ×1