python Pandas last返回的数据比它应该返回的多,是Pandas还是我?

3ks5zfa0  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(74)

我使用last来过滤日期数据。但是,它似乎不起作用。无论是时间框架即7D和我相信14D返回更多的数据比他们应该。CAT的7D不应返回任何数据。我也试过1W,结果也一样。是我做错了还是Pandas做错了?
收集数据的方法如下。

# Gets the openinsider information for insider trading of stocks
def get_openinsider_stock_activity(stocks):
    # Format search string from stocks
    # URL gets 500 entries only
    stocks = stocks.upper().replace(' ', '+')  # format the tickers to be lis
    print('Search String: ', stocks)
    url = f'http://openinsider.com/screener?s={stocks}&o=&pl=&ph=&ll=&lh=&fd=1461&fdr=&td=0&tdr=&fdlyl=&fdlyh=&daysago=&xp=1&xs=1&vl=&vh=&ocl=&och=&sic1=-1&sicl=100&sich=9999&grp=0&nfl=&nfh=&nil=&nih=&nol=&noh=&v2l=&v2h=&oc2l=&oc2h=&sortcol=0&cnt=300&page=1'
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'lxml')
    try:
        rows = soup.find('table', {'class': 'tinytable'}).find('tbody').findAll('tr')
    except Exception as e:
        print("Error! Skipping")
        print(f"This URL was not successful: {url}")
        print(e)
        return

    # Get headers first
    header_row = soup.find('table', {'class': 'tinytable'}).find('thead').findAll('tr')
    headers = []
    for row in header_row:
        for col in row:
            for header in col:
                text = col.text.strip()
                if text == '':
                    continue
                headers.append(unicodedata.normalize('NFKD', text))

    body_rows = soup.find('table', {'class': 'tinytable'}).find('tbody').findAll('tr')
    # Iterate over rows of table
    insider_data = []
    for row in body_rows:
        cols = row.findAll('td')
        if not cols:
            continue
        for cell in cols:
            cell_value = cell.find('a').text.strip() if cell.find('a') else cell.text.strip()
        body = {key: cols[index].find('a').text.strip() if cols[index].find('a') else cols[index].text.strip()
                for index, key in enumerate(headers)}
        insider_data.append(body)
    insider_data = pd.DataFrame(insider_data)
    return insider_data

字符串
使用.last()过滤数据的方法如下

data = []
    for stock in ['AAPL', 'BA', 'GME', 'XOM', 'CAT']:
        data.append(get_openinsider_stock_activity(stock))
    data = pd.concat(data)

    for timeframe in ['7D', '14D', '1M']:

        pd.set_option('display.max_columns', 500)
        pd.set_option('display.width', 1000)
        pd.set_option('display.max_rows', None)

        count_data = data.copy()
        count_data['Trade Date'] = pd.to_datetime(count_data['Trade Date'])
        # HERE
        count_data = count_data.sort_values(by='Trade Date', ascending=True).set_index('Trade Date').last(timeframe)
        print(count_data)


如果我们检查CAT here,我们可以设置1周前没有买家,因为没有表显示。然而,我的代码显示有一个卖家,但该记录应该只在2周前。

rsl1atfo

rsl1atfo1#

如果你读了documentation,在最后它特别指出了让你绊倒的行为。
请注意,返回的是最近3个日历日的数据,而不是数据集中最近3个观察日的数据,因此未返回2018-04-11的数据。
你可以在这个例子中看到:

i = pd.date_range('2018-04-09', periods=4, freq='2D')
ts = pd.DataFrame({'A': [1, 2, 3, 4]}, index=i)
ts.last('3D')

字符串
产出

A
2018-04-13  3
2018-04-15  4


您可能需要查找的是相对日期偏移量,例如今天之前的n天:

ts.loc[ts.index >= (pd.to_datetime('today')-pd.Timedelta(days=7))]


返回一个空的数据框,因为在过去的3个日历日内没有记录,并且:

ts.loc[ts.index >= (pd.to_datetime('today')-pd.Timedelta(days=1938))]


按预期只返回两条记录

相关问题