Я рассчитываю ежедневные значения количества акций на их годовых максимумах - акций на их годовых минимумах. У меня есть DataFrame с именем stocks
с ценами на акции.
Ниже верно (я думаю), но это ужасно неэффективно.
#get output frame
high_minus_low = pd.DataFrame(columns = ["High minus Low"], index = stocks.index)
no_highs=0
no_lows=0
#assume 260 trading days in the year
for row in range(260):
row = 260 + row
#iterate over stocks in the index
for col in range(len(stocks.columns)):
latest = stocks.iloc[row,col]
high = stocks.iloc[(row-260):row, col].max()
low = stocks.iloc[(row-260):row, col].min()
if latest >= high: no_highs = no_highs +1
if latest <= low: no_lows = no_lows + 1
#write to output
high_minus_low.iloc[row,0] = no_highs - no_lows
no_highs=0
no_lows=0
print(".\n")
Может ли кто-нибудь предложить более эффективную реализацию?
Может ли кто-нибудь предложить реализацию, которая полагается на индекс (выполненный в датах), а не увеличивая / уменьшая координаты, как я делаю?
Заранее спасибо - я очень начинающий программист на Python / Coding .
[править:]
Пример ввода:
Instrument @AMZN U:ABT U:AES @ABMD ... @MNST U:LIN @SBAC @CHTR
Field P P P P ... P P P P
Dates ...
2018-04-27 1572.620 59.56 12.31 301.7400 ... 56.19 153.23 158.95 263.3250
2018-04-30 1566.130 58.13 12.24 300.9500 ... 55.00 152.52 160.23 271.2900
2018-05-01 1582.260 58.82 12.21 310.5000 ... 55.20 153.30 157.50 279.3999
2018-05-02 1569.680 57.85 12.19 302.1399 ... 52.72 151.24 155.85 274.7800
2018-05-03 1572.075 57.93 12.30 335.5701 ... 52.31 152.84 156.16 271.3601
Выход:
Dates
2018-04-27 NaN
2018-04-30 NaN
2018-05-01 NaN
2018-05-02 NaN
2018-05-03 NaN
...
2020-04-07 0
2020-04-08 3
2020-04-09 6
2020-04-10 6
2020-04-13 4
Выход просто означает, что: на 13-й акции на максимуме - акции на минимуме были 4.