Почему я получаю NaN после левого соединения?

Прохожу курс Udacity ML. После df_final.join(df_temp, how = "left") получаем NaN, но в ходе venv все отлично работает. Где может быть проблема?

P.S.: Я также попробовал df_temp.index = pd.to_datetime(df_temp.index, utc=True) для каждого, похоже, никакого эффекта.

Здесь мы загружаем данные.

import yfinance as yf

tickets = ["AAPL", "AMD", "GOOG", "GLD"]

def download_tickets(tickets):
    for ticket in tickets:      
        df = yf.Ticker(ticket)
        df = df.history(period = "max")
        df.to_csv(symbol_to_path(ticket))

Здесь мы создаем путь к csv из символа.

def symbol_to_path(symbol, base_dir = "data"):
    if not os.path.exists(base_dir):
        os.mkdir(base_dir)
    return os.path.join(base_dir, "{}.csv".format(str(symbol)))

Здесь мы объединяем данные.

    # Create empty df with specified dates. 
    start_date = "2022-01-01"
    end_date = "2023-01-01"
    dates = pd.date_range(start_date, end_date)
    df_final = pd.DataFrame(index=dates)
    df_final.index = pd.to_datetime(df_final.index, utc=True)
    
    # Combine all with df_final
    for ticket in tickets:
        file_path = symbol_to_path(symbol)
        df_temp = pd.read_csv(file_path, parse_dates=True, index_col = "Date",
                              usecols=["Date", "Close"], na_values=["nan"])
        df_temp = df_temp.rename(columns = {"Close": symbol})
        df_final = df_final.join(df_temp, how = "left")
        print(df_temp.head())
        print(df_final.head())

    return df_final

Выход:

Как видите, float преобразуется в NaN для левого соединения

Для правильного соединения мы получаем данные, но не для диапазона 2022-01-01/2023-01-01

Внутреннее соединение

Внешнее соединение

Спасибо.

UPD: Данные после 2021 года

Никто, кроме вас, не видит данные, которые вы используете, так как мы можем сказать вам, почему результат такой Nan?

Luuk 14.01.2023 16:54

наверное хочешь how = "inner"? он будет присоединяться только к пересекающимся индексам

Artyom Akselrod 14.01.2023 17:13

@Luuk, я прикрепил фотографию вывода. Не отображается?

Blob 14.01.2023 18:30

@Артём Аксельрод, пробовал левый, правый, внутренний, внешний, крест. Нужно ли прикреплять все результаты?

Blob 14.01.2023 18:32

Вы можете прочитать все эти значения и проверить значения NaN, назначить что-то, что вы хотите, прежде чем пытаться напечатать это ....

Luuk 14.01.2023 19:01

@Luuk, как видите, есть 2 отпечатка: первый для df_temp и второй для df_final. В первом выводе мы видим значения с плавающей запятой, такие как 0,99874, поэтому в df_temp нет значений NaN. Или я упустил момент?

Blob 14.01.2023 20:28

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

Luuk 15.01.2023 10:34

@Luuk, спасибо за терпение, как мне это сделать? Я уже сделал head() для каждого символа. Данные находятся в файлах csv, сайт не позволяет их загружать :( В любом случае, если это может помочь, я отредактирую вопрос с полным кодом, чтобы показать, как их получить.

Blob 15.01.2023 12:57

кажется, что у вас нет истории ваших билетов после 2004 года, можете ли вы показать нам фрейм данных одного билета? специально для 2022 года

Artyom Akselrod 16.01.2023 11:50

@ArtyomAkselrod, конечно, ты здесь! Проверьте УПД.

Blob 16.01.2023 18:30
0
10
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в часовых поясах. Данные о билетах находятся в -05:00 (я предполагаю, что в Нью-Йорке), пока вы генерируете df_final в UTC +00:00, когда вы присоединяетесь, pandas не может найти пересечение в индексах.

Самым простым решением для меня было изменить часовой пояс df_final (tz), т.е. сгенерировать с правильным tz

# Create empty df with specified dates. 
start_date = "2022-01-01"
end_date = "2023-01-01"
dates = pd.date_range(start_date, end_date, tz='-05:00') # change here
df_final = pd.DataFrame(index=dates)
#     df_final.index = pd.to_datetime(df_final.index, utc=True) # NOT needed anymore
 

Это было так очевидно... :( Большое спасибо!

Blob 18.01.2023 17:13

Другие вопросы по теме