如何提取股票价格数据的周末和银行假日

时间:2018-06-12 23:34:04

标签: python pandas dataframe

markowitz = pd.read_excel('C:/Users/jordan/Desktop/book2.xlsx')
markowitz = markowitz.set_index('Dates')
markowitz

there are some NaN values in the data,some of them are weekends and some of them are holidays,i have to identify the holidays and set it as previous value

有一种简单的方法可以做到这一点,我用

import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar as calendar

dr = pd.date_range(start='2013-01-01', end='2018-06-12')
df = pd.DataFrame()
df['Date'] = dr

cal = calendar()
holidays = cal.holidays(start=dr.min(), end=dr.max())

df['Holiday'] = df['Date'].isin(holidays)
print (df)
df = df[df['Holiday'] == True]
df

但是我还有很多日期需要复制和粘贴(我可以只显示第二行"日期和#34;)然后将它们设置为前一个交易日价值,是否有更简单的方法做这个 ?非常感谢。

2 个答案:

答案 0 :(得分:0)

如果我知道你想要做什么,可能会有一种更简单的方法。数据帧上的fillna方法允许您转发填充。因此,如果您不想填写周末,但希望填写所有其他时间(即假期),您可以按如下方式排除星期六和星期日:

df.loc[~df['Date'].dt.weekday_name.isin(['Saturday','Sunday'])] = df.loc[~df['Date'].dt.weekday_name.isin(['Saturday','Sunday'])].fillna(method='ffill')

您可以在整个数据框或特定列上使用它。

答案 1 :(得分:0)

我认为您最好的选择是从quandl.com获取API密钥。它是免费的,可让您访问各种时间序列的历史数据。过去曾经可以使用Yahoo Finance和Google Finance,但我认为这两者在一年多以前就已经贬值了。

这是一小段代码示例,肯定可以为您提供帮助。

import quandl
quandl.ApiConfig.api_key = 'your_api_key_goes_here'

# get the table for daily stock prices and,
# filter the table for selected tickers, columns within a time range
# set paginate to True because Quandl limits tables API to 10,000 rows per call

data = quandl.get_table('WIKI/PRICES', ticker = ['AAPL', 'MSFT', 'WMT'], 
                        qopts = { 'columns': ['ticker', 'date', 'adj_close'] }, 
                        date = { 'gte': '2015-12-31', 'lte': '2016-12-31' }, 
                        paginate=True)
print(data)

检查下面的链接,以获取有关如何获取所需数据的信息。

https://blog.quandl.com/api-for-stock-data

此外,请参阅此以获取有关使用Python进行定量金融的更多详细信息。

https://financetrain.com/best-python-librariespackages-finance-financial-data-scientists/

最后,如果这有点偏离主题,我深表歉意,但我认为这可能会在一定程度上有所帮助...考虑这样的事情...

import requests
from bs4 import BeautifulSoup

base_url = 'http://finviz.com/screener.ashx?v=152&s=ta_topgainers&o=price&c=0,1,2,3,4,5,6,7,25,63,64,65,66,67'
html = requests.get(base_url)
soup = BeautifulSoup(html.content, "html.parser")
main_div = soup.find('div', attrs = {'id':'screener-content'})

light_rows = main_div.find_all('tr', class_="table-light-row-cp")
dark_rows = main_div.find_all('tr', class_="table-dark-row-cp")

data = []
for rows_set in (light_rows, dark_rows):
    for row in rows_set:
        row_data = []
        for cell in row.find_all('td'):
            val = cell.a.get_text()
            row_data.append(val)
        data.append(row_data)

#   sort rows to maintain original order
data.sort(key=lambda x: int(x[0]))

import pandas
pandas.DataFrame(data).to_csv("AAA.csv", header=False)

这不是时间序列数据,而是基本数据。我没有在该站点上花费很多时间,但是也许您可以四处寻找并找到适合您需求的东西。只是一个想法。