2015-07-15 2 views
0

Эти коды выглядят правильно, но для меня это ужасно.Улучшение скорости/оптимизация этого кода

В обоих случаях я имею дело с 78k строк данных. Мне удалось уменьшить столбцы до 2-4, чтобы упростить код. Здесь я оставляю только первую и вторую колонки и пытаюсь заменить третий столбец на производную. Я хотел бы сделать это ежемесячно до изменения projíd, сообщая код

for j in range (1,len(joined)): 
    if joined['ProjID'][j] == joined['ProjID'][j-1]: 
     joined.loc[j]=[joined.ProjID[j], joined.Month[j], (askingrent[j]-askingrent[j-1])/askingrent[j-1]] 
    else: 
     joined.loc[j]=[joined.ProjID[j], joined.Month[j], 0] 

Здесь, я 78k строк снова. Но я пытаюсь просто преобразовать столбец в datetime и удалить время (часы и минуты). Код выглядит достаточно простым; но я ждал 30 минут ~ иш. Является ли скорость, относящаяся к коду или что-то еще?

ageofbuildings['Month']=pd.to_datetime(ageofbuildings['Month']) 
for i in range (0, len(ageofbuildings)): 
    ageofbuildings.Month[i]=ageofbuildings.Month[i].date() 

ответ

3

Для ускорения ввода кода вам необходимо использовать векторизованные операции. Во-первых, столбцы 'Month' и 'ProjID' присваиваются самим себе, является ли предложение if истинным или нет, поэтому это избыточно. Вектор эквивалентно, если п будет

same_as_prev = joined['ProjID'] == joined['ProjID'].shift() 

Чтобы получить значение вектора к югу в вы можете сделать

values = askingrent/askingrent.shift() - 1 

предполагая askingrent является серией панды. Затем вы можете сделать

joined.iloc[:, 2] = np.where(same_as_prev, values, 0) 

Я думаю, что второй блок кода может быть достигнуто за счет

ageofbuildings['Month'] = pd.DatetimeIndex(ageofbuildings['Month']).date 

, но это трудно понять, как вы не дали взглянуть на ваш ввода/вывода.

+0

спасибо! Я закончил преобразование из панд в списки списков и сделал мои вычисления как таковые. –

Смежные вопросы