我是熊猫新手。我写了一个我想优化的代码,但我不确定如何。我知道这两个事实都适用于'和pandas vectoriztion比'iterrows'更快,但不知道如何使用它们来实现相同的目标。 iterrows对我来说很容易,因为它类似于' for'循环,所以我已经习惯了。 这是我的代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
from scipy.spatial.distance import euclidean
data = pd.read_csv(r'C:\temp\train.txt')
def group_df(df,num):
ln = len(df)
rang = np.arange(ln)
splt = np.array_split(rang,num)
lst = []
finel_lst = []
for i,x in enumerate(splt):
lst.append([i for x in range(len(x))])
for k in lst:
for j in k:
finel_lst.append(j)
df['group'] = finel_lst
return df
def KNN(dafra,folds,K,fi,target):
df = group_df(dafra,folds)
avarge_e = []
for i in range(folds):
train = pd.DataFrame(df.loc[df['group'] != i])
test = pd.DataFrame(df.loc[df['group'] == i])
test.loc[:,'pred_price'] = np.nan
test.loc[:,'rmse'] = np.nan
train.loc[:,'dis'] = np.nan
train = train.reset_index()
test = test.reset_index()
for index,row in test.iterrows():
for index2,row2 in train.iterrows():
train.loc[index2]['dis'] = euclidean(row2[fi],row[fi])
正如您所看到的,有2个嵌套' iterrows'循环。还有一个小的' for'循环在顶部。 这段代码的想法是将每行测试之间的欧氏距离分配给每列火车。但是,由于' for'循环,它最终会加起来所有的原始DataFrame。
以下是数据的开始:
Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape \
0 1 60 RL 65.0 8450 Pave NaN Reg
1 2 20 RL 80.0 9600 Pave NaN Reg
2 3 60 RL 68.0 11250 Pave NaN IR1
LandContour Utilities ... PoolArea PoolQC Fence MiscFeature MiscVal
\
0 Lvl AllPub ... 0 NaN NaN NaN 0
1 Lvl AllPub ... 0 NaN NaN NaN 0
2 Lvl AllPub ... 0 NaN NaN NaN 0
MoSold YrSold SaleType SaleCondition SalePrice
0 2 2008 WD Normal 208500
1 5 2007 WD Normal 181500
2 9 2008 WD Normal 223500
[3行x 81列]
欢迎任何关于优化此代码的想法。谢谢。
答案 0 :(得分:0)
我建议您解决两个问题的可能方法:
- 使用scipys distance_matrix
- 写你自己的numpy功能
scipy解决方案是直截了当的:
ionViewWillLeave() {
document
.getElementById('container')
.appendChild(document.getElementById('windyty'));
}
在numpy中我们可以使用外部ufunc来编写我们自己的函数。 np.subtract.outer将从两个类似于外部点积的向量中给出一个矩阵给出乘法。
<ion-app>
时序:
document.getElementById
编辑: 要保留原始索引,可以将源df的索引传递给新数据帧:
import scipy
import numpy as np
point_vector_1 = np.random.random((10000,2))
point_vector_2 = np.random.random((1000,2))
distance_matrix = scipy.spatial.distance_matrix(point_vector_1, point_vector_2)