【问题标题】:Pandas Dataframe Yahoo Finance Checking if Volume Meets CriteriaPandas Dataframe Yahoo Finance 检查交易量是否符合标准
【发布时间】:2018-08-24 16:42:41
【问题描述】:

下面的程序将数千个股票代码从 .CSV 文件导入到一个列表中,并将代码作为参数传递给一个函数,该函数会拉出该特定股票的“调整后收盘”列并将票证设置为列名。这是我有一个包含数千只股票的数据框,只需使用 df['EnterTickerNameHere'] 即可获得调整后的收盘价。来自雅虎的数据包含一个“交易量”字段,如果交易量大于 100,000,我只想将股票添加到我的 df 中。我不确定如何在保持我的数据框与现在相同的格式的同时做到这一点。感谢您的阅读!

import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
from pandas_datareader import data as pdr
import datetime
import fix_yahoo_finance as yf
yf.pdr_override()
import time

def getTickers():
    today = str(datetime.date.today())
    fourty_days_prior = str(datetime.date.today() - datetime.timedelta(days=40))

    # import the tickers from csv to a python list
    tickers = pd.read_csv('tickers.csv', sep='\n',dtype={'Tickers' : str})
    tickers = tickers.Tickers.tolist()

    data = pdr.get_data_yahoo(tickers, start= fourty_days_prior, end=today)['Adj Close']

【问题讨论】:

  • 您能否在示例输入 df 中添加一个小的 sn-p(20 行左右),然后发布预期的输出?它将让我们更好地了解我们可以如何提供帮助。

标签: python pandas dataframe


【解决方案1】:

您不必下载所有数据两次。

1) 下载每个代码的最新交易量(只需 1 天的数据)

2) 将条件应用于此系列以更新您的代码列表

3) 下载 Adj。关闭此缩减代码列表

def getTickers(min_volume=100000):
    today = str(datetime.date.today())
    fourty_days_prior = str(datetime.date.today() - datetime.timedelta(days=40))

    # import the tickers from csv to a python list
    tickers = pd.read_csv('tickers.csv', sep='\n',dtype={'Tickers' : str})
    tickers = tickers.Tickers.tolist()

    # first import the latest volumes and apply your condition
    volumes = pdr.get_data_yahoo(tickers, start=today, end=today)['Volume'].T
    filtered_tickers = volumes[volumes.iloc[:,0] > min_volume].index.tolist()

    data = pdr.get_data_yahoo(filtered_tickers, start= fourty_days_prior, end=today)['Adj Close']
    return data

【讨论】:

  • 美丽。谢谢你。 .T 是 pandas 相关的函数来返回尾部的最后一项吗?
  • @delhics yes .T 是一种转换数据帧的 pandas 方法。只是让代码更容易索引
【解决方案2】:

首先在df中加载['Adj Close']:

data = pdr.get_data_yahoo(tickers, start= fourty_days_prior, end=today)['Adj Close']

现在为卷创建一个单独的 df:

volume = pdr.get_data_yahoo(tickers, start= fourty_days_prior, end=today)['Volume']

(假设这会获取列名为“Volume”的 df 中的卷)

现在你可以这样做了:

data['volume'] = [value if value > 100000 else 0 for value in volume['Volume']

(如果你不想要零,你可以使用 None)

现在您的 df 中有一个音量列,其中仅包含大于 100000 的音量值

【讨论】:

  • 谢谢吉斯。我很感激你的回答。我希望有一个解决方案,不必从 yahoo 数据中下载 10,000 只股票的数据两次,但我认为这可能是最简单的解决方案,因为 yahoo API 已被弃用。
  • 你不能用类似 [['adj close', 'volume']] 的东西同时下载两列吗?然后,您可以使用与上述相同的列表理解来更改卷。
  • 很遗憾,您不能在列表中放置多个列名。感谢您抽出时间 Gijs,我将拉所有列并稍后删除它们,因为这将是快速方法
  • 感谢您接受我的回答,但我现在意识到我误读了您的问题。首先,您只希望 df 中的交易量 > 100,000 的代码。因此,获取包含两列的代码。然后只需在输出 df 上放置一个掩码: data = data[data['volume'] > 100000] 如果需要,您可以在之后删除卷列: data.drop(columns=['volume'])
  • 你在评论上打败了我。我想你知道你需要做什么:)
猜你喜欢
  • 2023-03-14
  • 2023-01-03
  • 2018-11-22
  • 2018-08-11
  • 2013-11-18
  • 1970-01-01
  • 2017-10-31
  • 2021-09-13
  • 1970-01-01
相关资源
最近更新 更多