问题描述
我在一个文件夹中总共有 28 个 excel 文件。它们中的每一个都包含 72 列(71 个变量和 1 个目标)。使用下面的代码,我尝试预测 1 个 excel 文件的目标值,最终结果应该是 A、B、C 和 D。
如何使用glob,让代码读取所有excel文件,做预测过程,最后将每个excel文件的最终结果(A、B、C、D)放到新数据框的一行中(row1=excel1,row2=excel2 和...)
import numpy as np
import pandas as pd
import glob
for file in list(glob.glob('*.xlsx')):
data = pd.read_excel(file)
X = data.drop(['HWD'],1)
Y = data['HWD']
# Split DataSet to Train & Test
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size=0.2,random_state=0)
# Prediction 1
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
ABR = AdaBoostRegressor()
ABR.fit(X_train,y_train)
ABRtest=ABR.predict(X_test)
# Calculate metrics 1
from sklearn.metrics import mean_squared_error
import math
from scipy.stats import variation
from sklearn.metrics import mean_poisson_deviance
df_list = []
a = pd.DataFrame({'Obs':(y_test),'Pre':(ABRtest)})
df_list.append(a)
column_1 = a["Obs"]
column_2 = a["Pre"]
A = column_1.corr(column_2)
MSE = mean_squared_error(column_1,column_2)
B = math.sqrt(MSE)
C = variation(column_2,axis = 0)
D = mean_poisson_deviance(column_1,column_2)
e 下面是每个 excel 的最后一行,我需要一个代码来构建一个包含每个文件结果的 28 行数据框。
df_list = []
e = pd.DataFrame({'CC':[A],'RMSE':[B],'RSD':[C],'MPD':[D]})
df_list.append(e)
解决方法
您可以使用 df.append()
在现有 df 下方添加行
e = pd.DataFrame() #initiate an empty df
for i in range(28):
A,B,C,D = i,i,i #assume you have the results here
e = e.append(pd.DataFrame({'CC':[A],'RMSE':[B],'RSD':[C],'MPD':[D]}))
e.reset_index(drop=True,inplace=True)
这是您想要的输出吗?
CC RMSE RSD MPD
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
...
25 25 25 25 25
26 26 26 26 26
27 27 27 27 27
插入代码:
import glob
e = pd.DataFrame({'CC':[],'RMSE':[],'RSD':[],'MPD':[]},dtype='object') #<--insert here,initiate an empty df
for file in list(glob.glob('*.xlsx')):
data = pd.read_excel(file)
...
C = variation(column_2,axis = 0)
D = mean_poisson_deviance(column_1,column_2)
e = e.append(pd.DataFrame({'CC':[str(A)],'RMSE':[str(B)],'RSD':[str(C)],'MPD':[str(D)]})) #<--insert here
e.reset_index(drop=True,inplace=True) #<--insert this line outside for-loop