Normalize/scale 特定范围内的数据框
Normalize/scale dataframe in a certain range
我有以下数据框:
pd.DataFrame({'DateTime': {0: Timestamp('2022-02-08 00:00:00'),
1: Timestamp('2022-02-08 00:10:00'),
2: Timestamp('2022-02-08 00:20:00'),
3: Timestamp('2022-02-08 00:30:00'),
4: Timestamp('2022-02-08 00:40:00')},
'wind power [W]': {0: 83.9, 1: 57.2, 2: 58.2, 3: 48.0, 4: 69.5}})
DateTime wind power [W]
0 2022-02-08 00:00:00 83.9
1 2022-02-08 00:10:00 57.2
2 2022-02-08 00:20:00 58.2
3 2022-02-08 00:30:00 48.0
4 2022-02-08 00:40:00 69.5
如您所见,83.9 是我第二列中的最大值,48.0 是最小值。我想在 0.6 和 8.4 之间的范围内标准化这些值,这样 83.9 就会变成 8.4,48.0 变成 0.6。其余数字介于两者之间。
到目前为止,我只设法使用代码将列标准化为 0-1 的范围:
df['normalized'] = (df['wind power [W]']-df['wind power [W]'].min())/(df['wind power [W]'].max()-df['wind power [W]'].min())
我不知道如何进一步使这些数字在我想要的范围内。有人可以帮帮我吗?
我们可以使用 MinMaxScaler
来执行特征缩放,MinMaxScaler
支持一个名为 feature_range
的参数,它允许我们指定转换数据的所需范围
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0.6, 8.4))
df['normalized'] = scaler.fit_transform(df['wind power [W]'].values[:, None])
或者,如果您不想使用 MinMaxScaler
,这里有一种方法可以仅在 pandas 中缩放数据:
w = df['wind power [W]'].agg(['min', 'max'])
norm = (df['wind power [W]'] - w['min']) / (w['max'] - w['min'])
df['normalized'] = norm * (8.4 - 0.6) + 0.6
print(df)
DateTime wind power [W] normalized
0 2022-02-08 00:00:00 83.9 8.400000
1 2022-02-08 00:10:00 57.2 2.598886
2 2022-02-08 00:20:00 58.2 2.816156
3 2022-02-08 00:30:00 48.0 0.600000
4 2022-02-08 00:40:00 69.5 5.271309
如果您不想使用 sklearn
,您可以使用 feature scaling 的维基百科定义:
a = 0.6
b = 8.4
x = df['wind power [W]']
df['normalized'] = a + (x - x.min()) * (b - a) / (x.max() - x.min())
print(df)
# Output
DateTime wind power [W] normalized
0 2022-02-08 00:00:00 83.9 8.400000
1 2022-02-08 00:10:00 57.2 2.598886
2 2022-02-08 00:20:00 58.2 2.816156
3 2022-02-08 00:30:00 48.0 0.600000
4 2022-02-08 00:40:00 69.5 5.271309
我有以下数据框:
pd.DataFrame({'DateTime': {0: Timestamp('2022-02-08 00:00:00'),
1: Timestamp('2022-02-08 00:10:00'),
2: Timestamp('2022-02-08 00:20:00'),
3: Timestamp('2022-02-08 00:30:00'),
4: Timestamp('2022-02-08 00:40:00')},
'wind power [W]': {0: 83.9, 1: 57.2, 2: 58.2, 3: 48.0, 4: 69.5}})
DateTime wind power [W]
0 2022-02-08 00:00:00 83.9
1 2022-02-08 00:10:00 57.2
2 2022-02-08 00:20:00 58.2
3 2022-02-08 00:30:00 48.0
4 2022-02-08 00:40:00 69.5
如您所见,83.9 是我第二列中的最大值,48.0 是最小值。我想在 0.6 和 8.4 之间的范围内标准化这些值,这样 83.9 就会变成 8.4,48.0 变成 0.6。其余数字介于两者之间。 到目前为止,我只设法使用代码将列标准化为 0-1 的范围:
df['normalized'] = (df['wind power [W]']-df['wind power [W]'].min())/(df['wind power [W]'].max()-df['wind power [W]'].min())
我不知道如何进一步使这些数字在我想要的范围内。有人可以帮帮我吗?
我们可以使用 MinMaxScaler
来执行特征缩放,MinMaxScaler
支持一个名为 feature_range
的参数,它允许我们指定转换数据的所需范围
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0.6, 8.4))
df['normalized'] = scaler.fit_transform(df['wind power [W]'].values[:, None])
或者,如果您不想使用 MinMaxScaler
,这里有一种方法可以仅在 pandas 中缩放数据:
w = df['wind power [W]'].agg(['min', 'max'])
norm = (df['wind power [W]'] - w['min']) / (w['max'] - w['min'])
df['normalized'] = norm * (8.4 - 0.6) + 0.6
print(df)
DateTime wind power [W] normalized
0 2022-02-08 00:00:00 83.9 8.400000
1 2022-02-08 00:10:00 57.2 2.598886
2 2022-02-08 00:20:00 58.2 2.816156
3 2022-02-08 00:30:00 48.0 0.600000
4 2022-02-08 00:40:00 69.5 5.271309
如果您不想使用 sklearn
,您可以使用 feature scaling 的维基百科定义:
a = 0.6
b = 8.4
x = df['wind power [W]']
df['normalized'] = a + (x - x.min()) * (b - a) / (x.max() - x.min())
print(df)
# Output
DateTime wind power [W] normalized
0 2022-02-08 00:00:00 83.9 8.400000
1 2022-02-08 00:10:00 57.2 2.598886
2 2022-02-08 00:20:00 58.2 2.816156
3 2022-02-08 00:30:00 48.0 0.600000
4 2022-02-08 00:40:00 69.5 5.271309