【问题标题】:Dataframes and looping数据框和循环
【发布时间】:2020-09-02 20:51:22
【问题描述】:

我有一个代码列表 (186),我需要为每个代码获取价格...我正在使用循环进行操作,并且对于每个代码我想要一个新的 df,编号从 0 到 186。

信息:len(tickers_list)=186

for i in range(len(tickers_list)-180):
    try:
        data = pdr.get_data_yahoo(tickers_list[i], start=df['Date'][i], end="2020-08-30")['Adj Close']
        df_new[i]=pd.DataFrame(data)
    except:
        print('Fail')
        continue

我只会失败。如果我删除除了错误消息是 'df_new' 未定义

【问题讨论】:

  • 您在使用[i]“切片”定义它之前调用了df_new
  • @HampusLarsson 不确定您的意思。请问我该如何解决?我试过df_new=pd.DataFrame(data) df_new[i]=df_new 但它也不起作用
  • 如果df_new=pd.DataFrame(data)不起作用,那可能是DataFrame无法处理.get_data_yahoo()返回的结果。您应该提供一个完整的示例并提及您遇到的错误。 @HampusLarsson 已经为您解答了当前的问题。

标签: python dataframe loops for-loop


【解决方案1】:

假设 get_data_yahoo 返回 DataFrame 并且您只选择 'Adj Close' 列,您可以将所有系列收集到字典中,然后将它们连接到数据框中。

data = dict()

for i, (ticker, start_date) in enumerate(zip(tickers_list[:6], df.Date)): # a simpler way to iterate
    data[ticker] = pdr.get_data_yahoo(ticker, start=start_date,
        end='2020-08-30')['Adj Close']

data = pd.concat(data.values(), keys=data.keys(), axis=1)

【讨论】:

  • 非常感谢它运行良好。我还有一个问题,请...是否可以用第一个非 NaN 值开始每一列,然后将列的其余值索引为第一个非 NaN 值的百分比?
  • @Tomas 在 cmets 中很难解决这个问题......我相信如果你构建你的想法,你可以在这里或谷歌中找到答案,如果你不发布一个新问题,但请阅读how to provide a good reproducible example上的帮助部分
猜你喜欢
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2016-10-12
  • 1970-01-01
  • 2019-04-08
相关资源
最近更新 更多