Как оптимизировать скорость Pandas DataFrame? - PullRequest
0 голосов
/ 19 марта 2019

У меня есть этот код панд, но он очень медленный.Как я мог оптимизировать это?Это означает, что когда я запускаю его, это занимает около 4 секунд.Этот код, который я называю здесь, - это то, что я называю снова и снова, и он должен быть настолько быстрым, насколько это возможно, что в настоящее время его нет ... у кого-нибудь есть идея?

    self.dataframe = pd.DataFrame(columns=list(['O' ,'H' ,'L' ,'C' ,'RSI', 'Upper Band', 'Lower Band'])) 

    BinanceHistoricalUrl = "https://api.binance.com/api/v1/klines?"
    BinanceHistoricalPayload = {'symbol' : 'BTCUSDT','interval': '1m','limit': 100}
    HistoricalRequestData = requests.get(url=BinanceHistoricalUrl, params=BinanceHistoricalPayload).json()

    Lenght = len(HistoricalRequestData)

    for i in range(Lenght):

        O = HistoricalRequestData[i][1]
        O = "{:.4f}".format(O)
        O = float(O)

        H = HistoricalRequestData[i][2]
        H = "{:.4f}".format(H)
        H = float(H)

        L = HistoricalRequestData[i][3]
        L = "{:.4f}".format(H)
        L = float(L)

        C = HistoricalRequestData[i][4]
        C = "{:.4f}".format(C)
        C = float(C)

#        Volume = HistoricalRequestData[0]["priceData"][i]['volume']
#        Volume = "{:.4f}".format(Volume)
#        Volume = float(Volume)

        self.dataframe = self.dataframe.append({'O': O, 'H' : H, 'L' : L, 'C' : C}, ignore_index=True)         

    make_RSI(self.dataframe)
    make_bollinger_bands(self.dataframe)
    RSI = self.dataframe['RSI'][99]
    RSI = float(RSI)
    UppBoll = self.dataframe['Upper Band'][99]
    UndBoll = self.dataframe['Lower Band'][99]
    previouscloseprice = self.dataframe['C'][99]
    MA = self.dataframe['20 Day MA'][99]
    DistanceUppBoll = UppBoll - MA
    DistanceUppBoll = float(DistanceUppBoll)
    DistanceUndBoll = UndBoll - MA
    DistanceUndBoll = float(DistanceUndBoll)

    self.dataframe = self.dataframe.iloc[0:0]




def make_RSI(dataframe):
    delta = dataframe['C'].diff()
    dUp, dDown = delta.copy(), delta.copy()
    dUp[dUp < 0] = 0
    dDown[dDown > 0] = 0
    RolUp = dUp.rolling(14).mean()
    RolDown = dDown.rolling(14).mean().abs()

    RS = RolUp / RolDown
    dataframe['RSI'] = 100 - (100/(1+RS))

def make_bollinger_bands(dataframe):
    dataframe['20 Day MA'] = dataframe['C'].rolling(window=20).mean()
    dataframe['20 Day STD'] = dataframe['C'].rolling(window=20).std()
    dataframe['Upper Band'] = dataframe['20 Day MA'] + (dataframe['20 Day STD'] * 2)
    dataframe['Lower Band'] = dataframe['20 Day MA'] - (dataframe['20 Day STD'] * 2)

1 Ответ

0 голосов
/ 19 марта 2019

Ваш код на самом деле не воспроизводим.Давайте сделаем некоторый заказ

# first import libraries
import pandas as pd
import requests

#define functions
def make_RSI(dataframe):
    delta = dataframe['C'].diff()
    dUp, dDown = delta.copy(), delta.copy()
    dUp[dUp < 0] = 0
    dDown[dDown > 0] = 0
    RolUp = dUp.rolling(14).mean()
    RolDown = dDown.rolling(14).mean().abs()

    RS = RolUp / RolDown
    dataframe['RSI'] = 100 - (100/(1+RS))

def make_bollinger_bands(dataframe):
    dataframe['20 Day MA'] = dataframe['C'].rolling(window=20).mean()
    dataframe['20 Day STD'] = dataframe['C'].rolling(window=20).std()
    dataframe['Upper Band'] = dataframe['20 Day MA'] + (dataframe['20 Day STD'] * 2)
    dataframe['Lower Band'] = dataframe['20 Day MA'] - (dataframe['20 Day STD'] * 2)

#############
# your code #
############
BinanceHistoricalUrl = "https://api.binance.com/api/v1/klines?"
BinanceHistoricalPayload = {'symbol' : 'BTCUSDT','interval': '1m','limit': 100}
#get data
HistoricalRequestData = requests.get(url=BinanceHistoricalUrl, 
                                     params=BinanceHistoricalPayload)\
                                .json()

# put on a dataframe
dataframe = pd.DataFrame(HistoricalRequestData)
# consider only columns from 1 to 4(included)
dataframe = dataframe[dataframe.columns[1:5]]
# assign column names
dataframe.columns = ["O", "H", "L", "C"]
# set type float
dataframe = dataframe.astype("float64")
# call functions
make_RSI(dataframe)
make_bollinger_bands(dataframe)

Не совсем ясно, чего вы хотите достичь в конце, но вы просто используете последний ряд вашего dataframe, поэтому вы можете рассмотреть

last = dataframe.iloc[-1]
DistanceUppBoll = last["Upper Band"] - last["20 Day MA"]
DistanceUndBoll = last["Lower Band"] - last["20 Day MA"]

Это заняло 717 ms на моем ноутбуке.Я предполагаю, что это в основном зависит от скорости вашего соединения.

ПРИМЕЧАНИЕ: Суть в том, что вы должны избегать петель, если это возможно.

Обновление: Если вы пытаетесь реализовать торговую стратегию, основанную на базовом техническом анализе, вам следует посмотреть, как вычислить MA в потоковом режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...