w=data.quantile(np.arange(0,1+1.0/k,1.0/k)) data=pd.cut(data,w)
时间: 2024-05-31 22:13:51 浏览: 110
这段代码的作用是将数据进行分箱(binning)处理,将连续的数值型数据离散化成指定数量的区间,常用于特征工程中对连续型变量进行离散化处理,以便更好地挖掘特征。具体来说,代码中首先使用 `quantile()` 函数将数据分成 `k` 份,每份的数据量相等,然后使用 `cut()` 函数将数据按照这些分位数进行分箱,得到的结果是一个 `pandas` 序列,每个元素表示原始数据所在的区间。这个操作可以用于处理连续型变量,将其转化为类别型变量,便于进一步处理。
相关问题
hbin = 10 for i in tqdm(data['WindNumber'].unique()): col = 'WindSpeed' cond = (data.WindNumber==i) & (data.label == 0) temp_df = data[cond] h_bins = pd.cut(temp_df.Power, np.arange(-1000, 3000, hbin)) temp_df['hbins'] = h_bins groups = [] for index,temp in temp_df.groupby("hbins"): if temp.shape[0]==0: continue iqr = temp[col].quantile(0.75) - temp[col].quantile(0.25) t1 = temp[col].quantile(0.25) - 1.5 * iqr t2 = temp[col].quantile(0.75) + 1.5 * iqr temp = temp[((temp[col]<t1) | (temp[col]>t2))] groups.append(temp) groups = pd.concat(groups).reset_index(drop = True) cond = (data.WindNumber==i) & (data.Time.isin(groups.Time)) data.loc[cond,'label'] = 3 cond = (data.WindNumber==1) vis_result_2D(data[cond],data[cond]['label'])详细解释
这段代码是对数据集中的每个风机进行处理,首先根据风机编号筛选数据,然后根据功率值将数据分为若干个区间,每个区间内的数据按照风速进行离群值检测,如果检测出离群值,则将对应的数据标记为异常(标签为3),最后将标记为异常的数据可视化展示。
具体解释如下:
1. `hbin = 10`:将功率值分为10个区间,每个区间的宽度为1000W。
2. `for i in tqdm(data['WindNumber'].unique()):`:循环遍历数据集中的所有风机。
3. `cond = (data.WindNumber==i) & (data.label == 0)`:根据风机编号和标签筛选数据,其中标签为0表示数据未被标记为异常。
4. `temp_df = data[cond]`:将筛选后的数据赋值给临时变量temp_df。
5. `h_bins = pd.cut(temp_df.Power, np.arange(-1000, 3000, hbin))`:根据功率值将数据分为若干个区间,并将区间标签赋值给 h_bins 变量。
6. `temp_df['hbins'] = h_bins`:将区间标签添加到数据集中。
7. `groups = []`:创建一个空列表,用于存储检测出的离群值数据。
8. `for index,temp in temp_df.groupby("hbins"):`:根据区间标签将数据分组,循环遍历每个区间。
9. `if temp.shape[0]==0:`:如果区间内没有数据,则跳过本次循环。
10. `iqr = temp[col].quantile(0.75) - temp[col].quantile(0.25)`:计算数据的四分位距。
11. `t1 = temp[col].quantile(0.25) - 1.5 * iqr`:计算下界阈值。
12. `t2 = temp[col].quantile(0.75) + 1.5 * iqr`:计算上界阈值。
13. `temp = temp[((temp[col]<t1) | (temp[col]>t2))]`:筛选出离群值数据,即风速小于下界阈值或大于上界阈值的数据。
14. `groups.append(temp)`:将检测出的离群值数据添加到 groups 列表中。
15. `groups = pd.concat(groups).reset_index(drop = True)`:将 groups 列表中的数据合并为一个数据集。
16. `cond = (data.WindNumber==i) & (data.Time.isin(groups.Time))`:根据风机编号和时间标记异常数据。
17. `data.loc[cond,'label'] = 3`:将标记为异常的数据标签设置为3。
18. `cond = (data.WindNumber==1)`:根据风机编号筛选数据。
19. `vis_result_2D(data[cond],data[cond]['label'])`:将标记后的数据可视化展示,其中 vis_result_2D 是一个自定义的函数。
写出三个代码用jupyter分别实现prophet、transformer、pytorch-forecasting预测,用于对一个包含5维特征的1400x5的数据集进行预测。代码中包括了数据标准化、绘制数据趋势图、早停、正则化、计算训练损失和验证损失并绘图,以及绘制各列数据的预测图和总体数据的预测图,并计算MAE/MAPE/MSE/RMSE/SMAPE指标。
以下是在Jupyter Notebook中使用Prophet、Transformer和pytorch-forecasting进行预测的示例代码:
## 使用Prophet进行预测
```python
import pandas as pd
from fbprophet import Prophet
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv('data.csv')
# 数据预处理
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
# 将数据转换为Prophet所需的格式
df = pd.DataFrame()
df['ds'] = pd.date_range(start='2000-01-01', periods=len(scaled_data))
for i in range(scaled_data.shape[1]):
df['y{}'.format(i+1)] = scaled_data[:, i]
# 创建并训练Prophet模型
model = Prophet()
for i in range(scaled_data.shape[1]):
model.add_regressor('y{}'.format(i+1))
model.fit(df)
# 预测未来数据
future = model.make_future_dataframe(periods=30) # 预测未来30个时间步
forecast = model.predict(future)
# 绘制数据趋势图
model.plot(forecast)
plt.show()
# 绘制各列数据的预测图和总体数据的预测图
for i in range(scaled_data.shape[1]):
model.plot_components(forecast[['ds', 'y{}'.format(i+1)]])
plt.show()
```
## 使用Transformer进行预测
```python
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, TransformerBlock
from tensorflow.keras.callbacks import EarlyStopping
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv('data.csv')
# 数据预处理
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
# 定义Transformer模型
model = Sequential()
model.add(TransformerBlock(1400, 5)) # 输入维度为1400,输出维度为5
model.add(Dropout(0.2))
model.add(Dense(5))
# 编译模型
model.compile(loss='mse', optimizer='adam')
# 定义早停回调函数
early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
# 训练模型
history = model.fit(scaled_data, scaled_data, validation_split=0.2, epochs=100, batch_size=32, callbacks=[early_stopping])
# 绘制训练损失和验证损失
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Val Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
# 预测未来数据
future = model.predict(scaled_data[-1].reshape(1, -1)) # 预测未来数据,此处假设最后一行为最新数据
future = scaler.inverse_transform(future)
# 绘制各列数据的预测图和总体数据的预测图
for i in range(data.shape[1]):
plt.plot(data.iloc[:, i], label='Actual')
plt.plot(np.arange(data.shape[0], data.shape[0]+future.shape[1]), future[0, :, i], label='Predicted')
plt.xlabel('Time')
plt.ylabel('Feature {}'.format(i+1))
plt.legend()
plt.show()
```
## 使用pytorch-forecasting进行预测
```python
import pandas as pd
from pytorch_forecasting import TimeSeriesDataSet, TemporalFusionTransformer
from pytorch_forecasting.metrics import MAE, MAPE, MSE, RMSE, SMAPE
from pytorch_forecasting.data import NaNLabelEncoder
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv('data.csv')
# 数据预处理
data['time_idx'] = pd.date_range(start='2000-01-01', periods=len(data))
data = data.rename(columns={'target': 'y'})
# 定义时间序列数据集
max_encoder_length = 100 # 编码器的最大长度
max_prediction_length = 10 # 预测器的最大长度
# 编码器和预测器的特征列
target_col = 'y'
encoder_cols = ['feature1', 'feature2', 'feature3', 'feature4', 'feature5']
static_categoricals = []
static_reals = []
time_varying_known_categoricals = []
time_varying_known_reals = []
time_varying_unknown_categoricals = []
time_varying_unknown_reals = encoder_cols
# 创建时间序列数据集
training_cutoff = data['time_idx'].quantile(0.8)
validation_cutoff = data['time_idx'].quantile(0.9)
data['is_val'] = data['time_idx'] > training_cutoff
data['is_test'] = data['time_idx'] > validation_cutoff
data['is_nan'] = data[target_col].isna()
# 标签编码器
label_encoders = {}
for col in static_categoricals + time_varying_known_categoricals + time_varying_unknown_categoricals:
label_encoders[col] = NaNLabelEncoder().fit(data[col])
data[col] = label_encoders[col].transform(data[col])
# 定义时间序列数据集
data = TimeSeriesDataSet(
data=data,
time_idx='time_idx',
target=target_col,
group_ids=['id'],
min_encoder_length=max_encoder_length // 2, # 编码器的最小长度
max_encoder_length=max_encoder_length,
min_prediction_length=1,
max_prediction_length=max_prediction_length,
static_categoricals=static_categoricals,
static_reals=static_reals,
time_varying_known_categoricals=time_varying_known_categoricals,
time_varying_known_reals=time_varying_known_reals,
time_varying_unknown_categoricals=time_varying_unknown_categoricals,
time_varying_unknown_reals=time_varying_unknown_reals,
target_normalizer=NaNLabelEncoder().fit(data[target_col]),
add_relative_time_idx=True,
add_target_scales=True
)
# 创建TemporalFusionTransformer模型
model = TemporalFusionTransformer.from_dataset(
data,
learning_rate=0.03,
hidden_size=16,
attention_head_size=1,
dropout=0.1,
hidden_continuous_size=8
)
# 训练模型
trainer = model.train_dataloader(data, batch_size=32)
model.fit(trainer, epochs=10, early_stopping_patience=5)
# 预测未来数据
future = model.predict(data, num_samples=100)
# 计算指标
mae = MAE()(future, data, mode='raw')
mape = MAPE()(future, data, mode='raw')
mse = MSE()(future, data, mode='raw')
rmse = RMSE()(future, data, mode='raw')
smape = SMAPE()(future, data, mode='raw')
# 绘制各列数据的预测图和总体数据的预测图
for i in range(data.data[target_col].shape[1]):
model.plot_prediction(data.to_pandas()[(data.to_pandas()['time_idx'] > training_cutoff)], future, idx=i)
plt.show()
# 绘制总体数据的预测图
model.plot_prediction(data.to_pandas()[(data.to_pandas()['time_idx'] > training_cutoff)], future)
plt.show()
# 打印指标
print('MAE:', mae)
print('MAPE:', mape)
print('MSE:', mse)
print('RMSE:', rmse)
print('SMAPE:', smape)
```
请注意,根据你的数据集和具体需求,上述代码可能需要进行一些修改和调整。
阅读全文