Не могли бы вы помочь мне оптимизировать код, потому что для его работы на фрейме данных 65x2500 требуются годы?Исходный кадр данных имеет пустые ячейки, и не все столбцы содержат информацию о цене.Все столбцы с ценовой информацией начинаются с «PX_LAST» (только столбцы, начинающиеся с «P»), а затем являются названием компании.Если между датами есть пустые места без информации о цене, я рассчитываю изменение на ту, которая имеет цену, и пропускаю пустые места.Не могли бы вы помочь мне с точками для улучшения следующего кода:
import numpy as np
import pandas as pd
#First non-NaN index value
def start_integer(column, dataframe):
start = dataframe[column].first_valid_index()
start_integer = None
if start != None:
start_integer = dataframe.index.get_loc(start)
return start_integer
#Last non-NaN index value
def end_integer(column, dataframe):
end = dataframe[column].last_valid_index()
if end!= None:
end_integer = dataframe.index.get_loc(end)
return end_integer
def get_log_returns(dataframe):
columns = dataframe.columns
log_returns = dataframe.drop(columns, axis = 1)
column_number = - 1
original_column_number = - 1
for col in dataframe.columns:
dataframe[col] = dataframe[col].astype("float64")
original_column_number += 1
if col[:1] == "P":
column_name = col[8:]
column_number += 1
column_length = len(dataframe[col])
log_returns[column_name] = None
row_number = -1
for price in dataframe[col]:
row_number += 1
next_row = row_number + 1
while column_length - 2 > next_row and np.isnan(price) == False and np.isnan(dataframe.iloc[next_row, original_column_number]) == True:
next_row += 1
if row_number != end_integer(col, dataframe) and np.isnan(price) == False:
log_returns.iloc[row_number, column_number] = np.log(price/dataframe.iloc[next_row, original_column_number]).round(5)
elif np.isnan(price) == True and row_number >= start_integer(col, dataframe) and row_number < end_integer(col, dataframe):
log_returns.iloc[row_number, column_number] = 0
else:
log_returns.iloc[row_number, column_number] = np.nan
log_returns['mean'] = log_returns.mean(axis = 1)
return log_returns