熊猫dropna()对于过滤后的数据不起作用

时间:2019-12-03 21:44:42

标签: python pandas for-loop nan

以下代码为“ 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)

3 个答案:

答案 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”。