如何使用 Pandas select 匹配 Yahoo Finance 上的 date/row 和之前的日期/行?
How to select matching date/row and previous date(s)/row(s) on Yahoo Finance using Pandas?
我的目的是 select CSCO 股票的股票日数据 df 中的股息日期和之前的日期。我能够合并索引和自动收报机上的两个数据集,但是还没有弄清楚如何 select 以前的日期/行。
from yahoo_fin.stock_info import get_data, get_dividends
import numpy as np
import pandas as pd
stock_data = get_data('csco', start_date="10/01/2021", end_date="10/07/2021", index_as_date = True, interval="1d")
div_data = get_dividends('csco', "09/01/2021")
stock_data = stock_data.reset_index()
div_data = div_data.reset_index()
print(stock_data)
print(div_data)
输出:
index open high ... adjclose volume ticker
0 2021-10-01 54.599998 55.410000 ... 54.770000 18338000 CSCO
1 2021-10-04 54.500000 54.680000 ... 54.230000 17084100 CSCO
2 2021-10-05 54.130001 55.029999 ... 54.689999 14135000 CSCO
3 2021-10-06 54.349998 54.380001 ... 53.939999 26339200 CSCO
index dividend ticker
0 2021-10-04 0.37 CSCO
现在,我可以根据索引和代码进行合并:
print(pd.merge(stock_data, div_data, on=['index', 'ticker'], how='inner'))
输出:
index open high low ... adjclose volume ticker dividend
0 2021-10-04 54.5 54.68 53.950001 ... 54.23 17084100 CSCO 0.37
但是,我也想要前一个日期(所以在股息支付日期的前一天,股票没有分红。我想要的输出:
index open high low ... and close volume ticker dividend
0 2021-10-01 54.599998 55.410000 ... 54.770000 18338000 CSCO
0 2021-10-04 54.5 54.68 53.950001 ... 54.23 17084100 CSCO 0.37
关于如何 select 以前的日期以及匹配行的任何建议?
通过检查 stock_data
中也存在于 div_data
中的日期来创建布尔掩码,然后从 stock_data
中删除除当前值和先前值所在的行之外的行在掩码中是 True
。现在您可以执行左合并以获得所需的结果
m = stock_data['index'].isin(div_data['index'])
stock_data[m | m.shift(-1)].merge(div_data, on=['index', 'ticker'], how='left')
index open high low close adjclose volume ticker dividend
0 2021-10-01 54.599998 55.41 54.040001 55.139999 54.77 18338000 CSCO NaN
1 2021-10-04 54.500000 54.68 53.950001 54.230000 54.23 17084100 CSCO 0.37
我的目的是 select CSCO 股票的股票日数据 df 中的股息日期和之前的日期。我能够合并索引和自动收报机上的两个数据集,但是还没有弄清楚如何 select 以前的日期/行。
from yahoo_fin.stock_info import get_data, get_dividends
import numpy as np
import pandas as pd
stock_data = get_data('csco', start_date="10/01/2021", end_date="10/07/2021", index_as_date = True, interval="1d")
div_data = get_dividends('csco', "09/01/2021")
stock_data = stock_data.reset_index()
div_data = div_data.reset_index()
print(stock_data)
print(div_data)
输出:
index open high ... adjclose volume ticker
0 2021-10-01 54.599998 55.410000 ... 54.770000 18338000 CSCO
1 2021-10-04 54.500000 54.680000 ... 54.230000 17084100 CSCO
2 2021-10-05 54.130001 55.029999 ... 54.689999 14135000 CSCO
3 2021-10-06 54.349998 54.380001 ... 53.939999 26339200 CSCO
index dividend ticker
0 2021-10-04 0.37 CSCO
现在,我可以根据索引和代码进行合并:
print(pd.merge(stock_data, div_data, on=['index', 'ticker'], how='inner'))
输出:
index open high low ... adjclose volume ticker dividend
0 2021-10-04 54.5 54.68 53.950001 ... 54.23 17084100 CSCO 0.37
但是,我也想要前一个日期(所以在股息支付日期的前一天,股票没有分红。我想要的输出:
index open high low ... and close volume ticker dividend
0 2021-10-01 54.599998 55.410000 ... 54.770000 18338000 CSCO
0 2021-10-04 54.5 54.68 53.950001 ... 54.23 17084100 CSCO 0.37
关于如何 select 以前的日期以及匹配行的任何建议?
通过检查 stock_data
中也存在于 div_data
中的日期来创建布尔掩码,然后从 stock_data
中删除除当前值和先前值所在的行之外的行在掩码中是 True
。现在您可以执行左合并以获得所需的结果
m = stock_data['index'].isin(div_data['index'])
stock_data[m | m.shift(-1)].merge(div_data, on=['index', 'ticker'], how='left')
index open high low close adjclose volume ticker dividend
0 2021-10-01 54.599998 55.41 54.040001 55.139999 54.77 18338000 CSCO NaN
1 2021-10-04 54.500000 54.68 53.950001 54.230000 54.23 17084100 CSCO 0.37