Добавить фрейм данных

#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, которые вы извлекли из клиента. Возможно, вам это не понадобится, поскольку у вас есть соответствующие индексы и вы хотите объединить столбцы.