#python #dataframe #append
#python #фрейм данных #добавить
Вопрос:
Я пытаюсь получить цену акций от Tiingo и добавить фреймы данных
data = pd.DataFrame()
lis=[
"AAPL",
"MSFT",
"AMZN",
"GOOGL",
"TSLA",
"GOOG",
"NVDA",
"FB",
"JPM",
"BAC",
"ADBE",
"MA",
"PFE",
"DIS",
"NFLX",
"INTC",
"VZ",
"MO"
]
for i in lis:
data =data.append(client.get_dataframe([i],
frequency='weekly',
metric_name='close',
startDate='2020-03-01',
endDate='2021-12-10'))
однако результат показывает немного другое:
AAPL MFST
2020-03-01 100 NAN
2020-03-02 101 NAN
2020-03-03 103 NAN
... NAN
2021-12-10 120 NAN
2020-03-01 NAN 600
2020-03-02 NAN 400
2020-03-03 NAN 300
... NAN
2021-12-10 NAN 1100
как я могу сделать так, чтобы это выглядело так:
AAPL MFST
2020-03-01 100 600
2020-03-02 101 400
2020-03-03 103 300
...
2021-12-10 120 1100
Ответ №1:
Предполагая, что вы не можете изменить метод для создания начального ввода, вы можете исправить это с помощью groupby
:
data = data.groupby(level=0).max()
Ответ №2:
метод добавления добавляет новые строки. И это именно то, что вы видите в результате. Вам нужно создать соединение, но не добавлять.
попробуйте это:
new_data = client.get_dataframe([i],
frequency='weekly',
metric_name='close',
startDate='2020-03-01',
endDate='2021-12-10')
data.join(new_data)
документы для метода df.join() доступны здесь: https://pandas.pydata.org/docs/reference/api/pandas .DataFrame.join.html
Ответ №3:
Вместо использования DataFrame.append
метода pandas вы можете попробовать метод объединения pandas.
import pandas as pd
dfs = []
for i in lis:
dfs.append(client.get_dataframe([i],
frequency='weekly',
metric_name='close',
startDate='2020-03-01',
endDate='2021-12-10'))
data = pd.concat(dfs, axis=1) # set axis = 1 to concate by columns, not rows!
Обратите внимание, что это предполагает, что ваш список dfs имеет а) общий индекс и б) никаких дополнительных столбцов, кроме, скажем AAPL
, и MSFT
.
При необходимости вы также можете попробовать объединить:
from functools import reduce
data = reduce(lambda df1,df2: pd.merge(df1,df2,on='id'), dfs)
где id
будет столбец, который у вас есть для всех dfs, которые вы извлекли из клиента. Возможно, вам это не понадобится, поскольку у вас есть соответствующие индексы и вы хотите объединить столбцы.