我正在从数据库中加载包含许多股票行情自动收录器的大型数据框。然后,我需要通过一次将一个数据框的一个子集设为一个报价来计算调整后的收盘价。
以下是执行此操作的最佳方法吗/代码中效率极低的任何操作? (它工作正常,产生正确的答案。)
df['close_adjusted'] = np.zeros(len(df.index))
adjusted_dfs = []
for ticker in tickers:
df_ticker = df.loc[df['ticker'] == ticker]
df_ticker = df_ticker.sort_values(by=['date'], ascending=False)
price_col = df_ticker['close'].values
split_col = 1 / df_ticker['split_factor'].values
dividend_col = df_ticker['dividend'].values
adj_price_col = df_ticker['close_adjusted'].values
adj_price_col[0] = price_col[0] #Set the 1st row in column
for i in range(1, len(price_col)):
adj_price_col[i] = \
round((adj_price_col[i - 1] + adj_price_col[i - 1] *
(((price_col[i] * split_col[i - 1]) -
price_col[i - 1] -
dividend_col[i - 1]) / price_col[i - 1])), 8)
df_ticker['close_adjusted'] = adj_price_col
adjusted_dfs.append(df_ticker)
df = pandas.concat(adjusted_dfs)
FWIW,我尝试使用group_by('ticker')进行此操作,迭代组,在子组上设置'closed_adjusted'列,但是我得到SettingWithCopyWarning(尽管数学是正确的)。相反,只是选择了.loc []来分解df,对较小的数据框进行数学运算,然后将它们重新串联在一起,并且所有工作都没有错误。
只是不知道是否有更好的方法可以实现这一目标,我的熊猫知识是新手还是新手。