Pandas dropna() 不适用于过滤后的数据
Pandas dropna() would not work for a filtered data
以下代码下载 "tickers" 中代码列表的收盘价数据。我的 objective 是获取一个名为 "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)
我认为名称的重复使用存在问题 data
。如果将 data[ticker]
替换为 tmp
会发生什么情况?
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:
tmp = pd.DataFrame(data, columns = [ticker])
tmp = tmp.dropna()
if len(tmp) > 1323:
valid_tickers.append(ticker)
print (valid_tickers)
您是否只想查找具有超过 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
您可以在一行中轻松完成此操作 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'.
以下代码下载 "tickers" 中代码列表的收盘价数据。我的 objective 是获取一个名为 "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)
我认为名称的重复使用存在问题 data
。如果将 data[ticker]
替换为 tmp
会发生什么情况?
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:
tmp = pd.DataFrame(data, columns = [ticker])
tmp = tmp.dropna()
if len(tmp) > 1323:
valid_tickers.append(ticker)
print (valid_tickers)
您是否只想查找具有超过 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
您可以在一行中轻松完成此操作 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'.