以下代码为“ tickers”中的代码列表下载收盘价数据。我的目标是获得一个符合我的条件的名为“ valid_tickers”的新列表-在此示例中,条件是一个报价器具有1,323个以上的数据点。
换句话说,我要消除价格历史较短的股票(在此示例中为FTV)。如果我将dropna()应用于整个数据,则所有n / a都将消除,但同时也会缩短具有完整数据的股票的价格历史记录(在此示例中为MSFT)。
这是不可取的。因此,我想仅针对发现报价的股票消除n / a,然后测量其价格历史记录的长度,并仅在其价格超过1,323点时才将其包含在“ valid_tickers”列表中。但是,出于某种原因,dropna()不想对data [ticker]进行操作。我在这里做错了什么?
import yfinance as yf
import pandas as pd
tickers = ['FTV','MSFT']
data = yf.download(tickers, start="2012-04-03", end="2017-07-07")['Close']
data = data.reset_index()
valid_tickers =[]
for ticker in tickers:
data[ticker] = pd.DataFrame(data, columns = [ticker])
data[ticker] = data[ticker].dropna()
if len(data[ticker]) > 1323:
valid_tickers.append(ticker)
print (valid_tickers)
答案 0 :(得分:0)
我认为重复使用名称public string Description { get; set; }
存在问题。如果将data
替换为data[ticker]
会发生什么?
tmp
答案 1 :(得分:0)
您是否只想查找包含超过1323个有效价格观察值的报价器?如果是这样,请使用此:
valid_obs_series = data.notnull().sum() # get total non-na observations per ticker
valid_tickers = list(valid_obs_series[valid_obs_series > 1323].index) # get valid tickers
答案 2 :(得分:0)
您可以使用df.dropna()
轻松地在一行中完成此操作:
# your code:
tickers = ['FTV','MSFT']
import yfinance as yf
data = yf.download(tickers, start="2012-04-03", end="2017-07-07")['Close']
data = data.reset_index()
valid_tickers =[]
# my addition:
valid_tickers.append(data.dropna(thresh=1323, axis=1).columns[1:][0]) # this line here
它将具有> 1323
有效数据点的股票的列名称附加到valid_tickers
列表中。就您而言,只有“ MSFT”。