Python: Как можно оптимизировать или упростить следующий код? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть df следующим образом:

ContextID   EscAct_Curr_A   StepID
7289973 0.122100122           1
7289973 0                     2
7289973 0                     2
7289973 0.122100122           2
7289973 0.122100122           2
7289973 0.122100122           2
7289973 0.122100122           2
7289999 0.244200245           1
7289999 0.244200245           1
7289999 0.244200245           1
7289999 0.244200245           2
7289999 0.366300374           2
7289999 0.366300374           2
7289999 0.366300374           2
7290025 0.122100122           1
7290025 0.122100122           1
7290025 0.122100122           2
7290025 0                     2
7290025 0                     2
7290025 0.122100122           2

Что я хочу сделать, это объединить все значения из разных StepID и создать отдельную df для него.

ДляНапример, все значения StepID 1 должны быть сохранены в один df, скажем, s1, а все значения StepID 2 должны быть сохранены в один df, скажем, s2 и так далее.У меня 24 таких StepID.После того, как это сделано, я хочу построить диаграмму рассеяния после запуска алгоритма машинного обучения.

Что я сделал:

Для StepID 1

s1 = X.loc[X['StepID'] == 1]
s1_array = s1.iloc[:,1].values.astype(float).reshape(-1,1)
min_max_scaler = preprocessing.MinMaxScaler()
scaled_array_s1 = min_max_scaler.fit_transform(s1_array)
s1.iloc[:,1]=scaled_array_s1

ocsvm = OneClassSVM(nu = 0.1, kernel = 'rbf', gamma = 'scale')
s1['y_ocsvm1'] = ocsvm.fit_predict(s1.values[:,[1]])

Для StepID 2

s2 = X.loc[X['StepID'] == 2]
s2_array = s2.iloc[:,1].values.astype(float).reshape(-1,1)
min_max_scaler = preprocessing.MinMaxScaler()
scaled_array_s2 = min_max_scaler.fit_transform(s2_array)
s2.iloc[:,1]=scaled_array_s2

ocsvm = OneClassSVM(nu = 0.1, kernel = 'rbf', gamma = 'scale')
s2['y_ocsvm2'] = ocsvm.fit_predict(s2.values[:,[1]])

Построение диаграммы рассеивания:

fig, ax = plt.subplots()
ax.scatter(s1.values[s1['y_ocsvm1'] == 1, 2], s1.values[s1['y_ocsvm1'] == 1, 1], c = 'green', label = 'Normal')
ax.scatter(s1.values[s1['y_ocsvm1'] == -1, 2], s1.values[s1['y_ocsvm1'] == -1, 1], c = 'red', label = 'Outlier')
ax.scatter(s2.values[s2['y_ocsvm2'] == 1, 2], s2.values[s2['y_ocsvm2'] == 1, 1], c = 'green')
ax.scatter(s2.values[s2['y_ocsvm2'] == -1, 2], s2.values[s2['y_ocsvm2'] == -1, 1], c = 'red')
plt.legend()

Эти коды делаютэто именно то, чего я хочу, но написание таких кодов для 24 различных StepID очень утомительно.Итак, я хотел бы знать, есть ли более компактный способ добиться следующего, возможно, с помощью цикла или функций.

1 Ответ

1 голос
/ 30 апреля 2019

У вас 95% повторного кода.Единственное, что действительно отличается - конкретные идентификаторы шагов.Таким образом, вы можете использовать эту функцию и вызывать ее много раз с разными идентификаторами:

def waka(step_id, X=X)
    s = X.loc[X['StepID'] == step_id]
    s_array = s.iloc[:,1].values.astype(float).reshape(-1,1)
    min_max_scaler = preprocessing.MinMaxScaler()
    scaled_array_s = min_max_scaler.fit_transform(s_array)
    s.iloc[:,1] = scaled_array_s
    ocsvm = OneClassSVM(nu = 0.1, kernel = 'rbf', gamma = 'scale')

    return ocsvm.fit_predict(s.values[:,[1]])
    # OR!
    s['y_ocsvm'] = ocsvm.fit_predict(s.values[:,[1]])
    return s

Вы можете сохранять результаты в каком-то списке или указывать их для рисования позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...