追加数据框

Append dataframe

我正在尝试从 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

append 方法追加新行。这正是您所看到的结果。您需要加入而不是追加。

试试这个:

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

您可以尝试 pandas 连接方法,而不是使用 pandas DataFrame.append 方法。

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 列表具有 a) 一个公共索引和 b) 除了 AAPLMSFT.

之外没有额外的列

如果需要,您也可以尝试合并:

from functools import reduce
data = reduce(lambda df1,df2: pd.merge(df1,df2,on='id'), dfs)

其中 id 是您从客户端提取的所有 dfs 共有的列。你可能不需要这个,因为你有匹配的索引并且想要连接列。

假设您无法更改生成初始输入的方法,您可以使用 groupby:

修复它
data = data.groupby(level=0).max()