Python:如何优化或简化以下代码?

时间:2019-04-30 11:57:52

标签: python python-3.x optimization logic

我有一个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 个答案:

答案 0 :(得分:1)

您有95%的重复代码。唯一真正不同的是-特定的步骤ID。因此,您可以使用此函数并使用不同的ID多次调用它:

<?php 

$s = $this->input->get('q', FALSE);
echo "<p>You searched for $s</p>"; //this will show '100% 500'

$this->load->helper('security');
$t = xss_clean($s);

echo "<p>You searched for $t</p>"; //this will show '100P0'

您可以将结果存储在某种列表或字典中,以便以后绘制。