基本上對于給定的行 i,我試圖根據 i 在另一列“本地最大字符串”中的值將 i 在列“Adj”中的值分配給某個值。基本上,需要在 DataFrame 的另一列“日期字符串”中搜索“本地最大字符串”中第 i 行的值,然后在包含該值的行 q 中將其值放在“調整關閉”列中第 i 行的“Adj”列的值。對不起,如果這很難理解。下面的 for 循環完成了我想做的事情,但我認為在 Pandas 中應該有更好的方法來做到這一點。我嘗試使用 apply 和 lambda 函數,但它說不可能進行賦值,而且我不確定我的做法是否正確。for 循環也需要很長時間才能完成。這是代碼:for x in range(0, len(df.index)):
df['Adj'][x] = df.loc[df['Date String'] == df['Local Max String'][x]]['Adj Close']這是 DF 的圖片,可以更好地理解我的意思。Adj 列中的值將查找與 Local Max String 中的 Date 相對應的 Adj Close 值。import numpy as npimport pandas as pdpd.core.common.is_list_like = pd.api.types.is_list_likefrom pandas_datareader import data as pdrimport matplotlib.pyplot as pltimport datetimeimport fix_yahoo_finance as yfyf.pdr_override() # <== that's all it takes :-)# Dates for datastart_date = datetime.datetime(2017,11,1)end_date = datetime.datetime(2018,11,1)df = pdr.get_data_yahoo('SPY', start=start_date, end=end_date)df.data = df['Adj Close']df['Most Recent Local Max'] = np.nandf['Date'] = df.indexlocal_maxes = list(df[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)].index)local_maxes.append(df['Date'][0] - datetime.timedelta(days=1))def nearest(items, pivot): return min([d for d in items if d< pivot], key=lambda x: abs(x - pivot))df['Most Recent Local Max'] = df['Date'].apply(lambda x: min([d for d in local_maxes if d < x], key=lambda y: abs(y - x)) )df['Local Max String'] = df['Most Recent Local Max'].apply(lambda x: str(x))df['Date String'] = df['Date'].apply(lambda x: str(x))df.loc[df['Local Max String'] == str(df['Date'][0] - datetime.timedelta(days=1)), 'Local Max String'] = str(df['Date'][0])df['Adj'] = np.nan謝謝!
2 回答

侃侃無極
TA貢獻2051條經驗 獲得超10個贊
這個解決方案仍然有一個 for,但它減少了從df.shape[1]
to的迭代量df['Local Max String'].nunique()
,所以它可能足夠快:
for a_local_max in df['Local Max String'].unique(): df.loc[df['Date String'] == a_local_max, 'Adj'] = df.loc[df['Local Max String'] == a_local_max, 'Adj Close'].iloc[0]
添加回答
舉報
0/150
提交
取消