self.columns = [[] for _ in range(8)]
时间: 2023-07-24 08:48:10 浏览: 41
这是一行Python代码,它创建了一个包含8个空列表的列表,并将其赋值给对象的`columns`属性。具体来说,这个代码会执行以下操作:
1. 创建一个包含8个元素的列表,每个元素都是一个空列表。
2. 使用列表推导式将这8个元素组成的列表赋值给对象的`columns`属性。
这样做的目的可能是为了在后续的代码中使用这个`columns`属性来存储某些数据,每个空列表都代表一个列。例如,可以将数据按列存储,而不是按行存储,以便在需要时更方便地操作列数据。
相关问题
class KnnRegressorCV: def __init__(self, ks=list(range(1, 21)), cv=LFold(5)): self.ks = ks self.cv = cv # YOUR CODE HERE def fit(self, x, y): df = pd.DataFrame(columns=["KValue", "LFoldID", "MSE_train", "MSE_test"]) count = 0 for k in self.ks: for index, each in enumerate(self.cv.split(x, y)): mse_train, mse_test = runknn(k, each[0], each[1], each[2].reshape(-1), each[3].reshape(-1)) df.at[count, "KValue"] = k df.at[count, "LFoldID"] = index df.at[count, "MSE_train"] = mse_train df.at[count, "MSE_test"] = mse_test count += 1 self.bestK = find_best_k(df, self.ks) self.y_train_ = y self.x_train_kdtree_ = KDTree(x) print("bestK internal:", self.bestK) return self # YOUR CODE HERE def predict(self, x): _, neighbours = self.x_train_kdtree_.query(x, k=self.bestK) neighbours = neighbours.reshape(len(x), self.k) neighbour_labels = self.y_train_[neighbours] pred = np.mean(neighbour_labels, axis=1) return pred给这段代码加注释
```
# 导入需要的库
import pandas as pd
from sklearn.neighbors import KDTree
# 定义 KNN 回归交叉验证类
class KnnRegressorCV:
def __init__(self, ks=list(range(1, 21)), cv=LFold(5)): # 初始化方法,参数包括 k 值列表和交叉验证方法
self.ks = ks # k 值列表
self.cv = cv # 交叉验证方法
def fit(self, x, y): # 模型训练方法,参数包括自变量和因变量
# 定义空的数据框用于存储模型评估结果
df = pd.DataFrame(columns=["KValue", "LFoldID", "MSE_train", "MSE_test"])
count = 0 # 定义计数器
for k in self.ks: # 遍历 k 值列表
for index, each in enumerate(self.cv.split(x, y)): # 遍历交叉验证的训练集和测试集
# 调用 runknn 函数进行模型评估,返回训练集和测试集的 MSE
mse_train, mse_test = runknn(k, each[0], each[1], each[2].reshape(-1), each[3].reshape(-1))
# 将评估结果存入数据框
df.at[count, "KValue"] = k
df.at[count, "LFoldID"] = index
df.at[count, "MSE_train"] = mse_train
df.at[count, "MSE_test"] = mse_test
count += 1 # 计数器加 1
# 调用 find_best_k 函数找到 MSE 最小的 k 值
self.bestK = find_best_k(df, self.ks)
self.y_train_ = y # 存储因变量
self.x_train_kdtree_ = KDTree(x) # 存储自变量的 KDTree
print("bestK internal:", self.bestK) # 打印最优的 k 值
return self # 返回模型自身
def predict(self, x): # 预测方法,参数为自变量
_, neighbours = self.x_train_kdtree_.query(x, k=self.bestK) # 找到最近的 k 个邻居
neighbours = neighbours.reshape(len(x), self.k) # 将邻居的索引转为二维数组
neighbour_labels = self.y_train_[neighbours] # 找到邻居的因变量值
pred = np.mean(neighbour_labels, axis=1) # 对邻居因变量值求平均,作为预测值
return pred # 返回预测值
```
优化代码 def module_split(self, save_on=True): """ split module data :param save_on: :return: """ for ms in range(self.mod_num): m_sn = self.module_list[ms] module_path = os.path.join(self.result_path_down, m_sn) cols_obj = ChuNengPackMustCols(ms, self.mod_cell_num, self.mod_cell_num) # 传入当前的module序号(如0,1,2,3,4),电芯电压个数,温度NTC个数。 aim_cols = [i for i in cols_obj.total_cols if i in self.df.columns] print(m_sn, aim_cols) self.modules[m_sn] = rename_cols_normal(self.df.loc[:, aim_cols], ms, self.mod_cell_num) print("after change cols name:", ms, m_sn, self.modules[m_sn].columns.tolist()) self.modules[m_sn].dropna(axis=0, how='any', subset=['soc'], inplace=True) volt_col = [f'volt{i}' for i in range(self.mod_cell_num)] temp_col = [f'temp{i}' for i in range(self.mod_cell_num)] self.modules[m_sn].dropna(axis=0, how='any', subset=volt_col, inplace=True) self.modules[m_sn] = stat(self.modules[m_sn], volt_col, temp_col) self.modules[m_sn].reset_index(drop=True, inplace=True) print(self.modules[m_sn]['discharge_ah'].iloc[-1]) self.module_cap[m_sn] = [self.modules[m_sn]['discharge_ah'].iloc[-1], self.modules[m_sn]['charge_ah'].iloc[-1], self.modules[m_sn]['soh'].iloc[-1]] self.module_peaks[m_sn] = list(quick_report(self.modules[m_sn], module_path, f'quick_report_{m_sn[:8]}')) # check soc status mod_soc = self.modules[m_sn]['soc'] self.module_soc_sig[m_sn] = [np.nanmedian(mod_soc), np.max(mod_soc), np.min(mod_soc)] if save_on: single_variables_plot(mod_soc, module_path, f'{m_sn[:8]}_soc_distribution_box.png', 'box', 'SOC') single_variables_plot(mod_soc, module_path, f'{m_sn[:8]}_soc_distribution_violin.png', 'violin', 'SOC')
以下是代码优化后的版本:
```
def module_split(self, save_on=True):
"""
Split module data
:param save_on:
:return:
"""
for ms in range(self.mod_num):
m_sn = self.module_list[ms]
module_path = os.path.join(self.result_path_down, m_sn)
cols_obj = ChuNengPackMustCols(ms, self.mod_cell_num, self.mod_cell_num)
aim_cols = [i for i in cols_obj.total_cols if i in self.df.columns]
print(m_sn, aim_cols)
self.modules[m_sn] = rename_cols_normal(self.df.loc[:, aim_cols], ms, self.mod_cell_num)
print("after change cols name:", ms, m_sn, self.modules[m_sn].columns.tolist())
# Drop rows with NaN values in 'soc' and voltage columns
volt_col = [f'volt{i}' for i in range(self.mod_cell_num)]
temp_col = [f'temp{i}' for i in range(self.mod_cell_num)]
self.modules[m_sn].dropna(axis=0, how='any', subset=['soc'] + volt_col, inplace=True)
# Compute statistics on remaining data
self.modules[m_sn] = stat(self.modules[m_sn], volt_col, temp_col)
self.modules[m_sn].reset_index(drop=True, inplace=True)
print(self.modules[m_sn]['discharge_ah'].iloc[-1])
self.module_cap[m_sn] = [
self.modules[m_sn]['discharge_ah'].iloc[-1],
self.modules[m_sn]['charge_ah'].iloc[-1],
self.modules[m_sn]['soh'].iloc[-1]
]
self.module_peaks[m_sn] = list(quick_report(self.modules[m_sn], module_path, f'quick_report_{m_sn[:8]}'))
# Compute SOC statistics and save plots
mod_soc = self.modules[m_sn]['soc']
self.module_soc_sig[m_sn] = [
np.nanmedian(mod_soc),
np.max(mod_soc),
np.min(mod_soc)
]
if save_on:
for plot_type in ['box', 'violin']:
single_variables_plot(mod_soc, module_path, f'{m_sn[:8]}_soc_distribution_{plot_type}.png', plot_type, 'SOC')
```
优化后的代码主要做了以下几个方面的改进:
1. 将所有行删除操作合并为一步,同时删除了温度列中的 NaN 值;
2. 统计数据前,只保留了保留了 'soc' 和电压列的非 NaN 行;
3. 在保存 SOC 分布图像时,避免了重复的代码。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)