Как более логично рассчитать возврат журналов в панде - PullRequest
0 голосов
/ 17 февраля 2019

Не могли бы вы помочь мне оптимизировать код, потому что для его работы на фрейме данных 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
...