Прохожу курс 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
Спасибо.
наверное хочешь how = "inner"
? он будет присоединяться только к пересекающимся индексам
@Luuk, я прикрепил фотографию вывода. Не отображается?
@Артём Аксельрод, пробовал левый, правый, внутренний, внешний, крест. Нужно ли прикреплять все результаты?
Вы можете прочитать все эти значения и проверить значения NaN, назначить что-то, что вы хотите, прежде чем пытаться напечатать это ....
@Luuk, как видите, есть 2 отпечатка: первый для df_temp и второй для df_final. В первом выводе мы видим значения с плавающей запятой, такие как 0,99874, поэтому в df_temp нет значений NaN. Или я упустил момент?
Нужен минимальный воспроизводимый пример. это должно включать данные, которые используются для ввода (по крайней мере, для одного символа, с которым эта проблема может быть воспроизведена.
@Luuk, спасибо за терпение, как мне это сделать? Я уже сделал head() для каждого символа. Данные находятся в файлах csv, сайт не позволяет их загружать :( В любом случае, если это может помочь, я отредактирую вопрос с полным кодом, чтобы показать, как их получить.
кажется, что у вас нет истории ваших билетов после 2004 года, можете ли вы показать нам фрейм данных одного билета? специально для 2022 года
@ArtyomAkselrod, конечно, ты здесь! Проверьте УПД.
Проблема в часовых поясах. Данные о билетах находятся в -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
Это было так очевидно... :( Большое спасибо!
Никто, кроме вас, не видит данные, которые вы используете, так как мы можем сказать вам, почему результат такой
Nan
?