Перебор диапазона данных для загрузки данных из API

#python #pandas #dataframe #while-loop #oanda

Вопрос:

Я загружаю данные из API, максимальный период возврата составляет 833 дня, но из моего тестирования я знаю, что у них есть данные, относящиеся к 2002 году. У меня есть функция ниже, которая определяет 833 дня с сегодняшнего дня в два времени даты «конец» и «начало», они вводятся в команду API. Обратите внимание, что они должны быть в строковом формате и отформатированы таким образом, чтобы api мог их принять.

 d=datetime.today()
end = str(d.year)   "-"   str(d.month)   "-"   str(d.day)

lookbook_period = 833

# Take current date and minus the the max time delta of 833 days to get 'start' var
time_delta = timedelta(days=lookbook_period)
now = datetime.now()

#split the answer and format it to the required timestamp type.
start = str(now - time_delta).split(" ")[0]
 

Что я хочу сделать, так это загрузить фреймы данных в 833 дневных разделах, а затем собрать их все вместе в CSV или фрейм данных. У меня есть ниже то, что у меня есть до сих пор, но я не уверен, как создать функцию, которая изменяет даты по ходу дела.

 
def time_machine():
    df_total = pd.DataFrame
    
    start_str = str(2002)   "-0"   str(5)   "-0"   str(1)
    start = datetime(2002,5,1)
    print(start)
    
    # amount of days from 2002-05-01 to now
    rolling_td = timedelta(days=int(str((datetime.today() - start)).split(" ")[0]))
    print(rolling_td, "n")
    
    # API maximum amount of lookbook days
    max_td = timedelta(days=833)
    
    # The function would do something similar to this, and on each pass, calling the API and saving the data to a dataframe or CSV.


    s1 = start   max_td
    print(s1)
    s2 = s1   max_td
    print(s2)
    s3 = s2   max_td
    print(s3)
    
    d=datetime.today()
    end = str(d.year)   "-"   str(d.month)   "-"   str(d.day)
    print(d)
 

Любые предложения или инструменты/библиотеки, на которые стоит обратить внимание, будут высоко оценены. Я тестировал вещи с помощью циклов while, но на этот раз я все еще слепо бегу в темноту.

Это примерный код sudo того, что, по моему мнению, мне нужно, но я все еще не уверен, как перейти к следующему разделу

 while count > 0 and > 833:
        start = 
        end =
        
        
    call the API first to download first set of data. 
    Check date range:
        get most recent date   833 days to it 
            Download next section
                repeat
    
    if count < 833: 
            calulate requied dates for start and end 
 

Ответ №1:

Если вы сначала определите свои диапазоны дат, вы сможете повторять каждый 833-дневный период, чтобы получать данные с помощью API. Затем вам нужно будет добавлять данные во фрейм данных (или csv) для каждой итерации.

 import datetime as dt

# Date range to pull data over
start_date = dt.date(2002,5,1)
end_date = dt.date.today()
delta = dt.timedelta(days=832) # 832 so you have a range of 833 days inclusive

# Iterating from start date, recording date ranges of 833 days
date_ranges = []
temp_start_date = start_date
while temp_start_date < end_date:
    temp_end_date = temp_start_date   delta 
    if temp_end_date > end_date:
        temp_end_date = end_date
    date_ranges.append([temp_start_date, temp_end_date])
    temp_start_date = temp_end_date   dt.timedelta(days=1)

# For each date range, pass dates into API
# Initialise dataframe here
for start_date, end_date in date_ranges:
    start_date_str = start_date.strftime("%Y-%m-%d")
    end_date_str = end_date.strftime("%Y-%m-%d")

    # Input to API with start and end dates in correct string format

    # Process data into dataframe
 

Не должно быть необходимости считать 833 дня, как вы сказали, API принимает даты начала и окончания в качестве аргументов, поэтому вам просто нужно найти их для каждого диапазона дат.

Ответ №2:

Вы можете использовать pandas date_range, чтобы получать свои даты каждые 833 дня и просто повторять. Кроме того, формат вашей даты выглядит как изоформат.

Поместите свой код в цикл for, чтобы получить данные во фрейм данных, а затем выведите их в csv.

 dates_list = pd.date_range(start=datetime.now(), periods=10, freq='-833D')

for i in range(1, len(dates_list)):
    # print(dates_list[i], dates_list[i-1])
    start = dates_list[i].date().isoformat()
    end = dates_list[i-1].date().isoformat()
    print(start, end)

2019-07-15 2021-10-25
2017-04-03 2019-07-15
2014-12-22 2017-04-03
2012-09-10 2014-12-22
2010-05-31 2012-09-10
2008-02-18 2010-05-31
2005-11-07 2008-02-18
2003-07-28 2005-11-07
2001-04-16 2003-07-28