基本上对于给定的行 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 np
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
from pandas_datareader import data as pdr
import matplotlib.pyplot as plt
import datetime
import fix_yahoo_finance as yf
yf.pdr_override() # <== that's all it takes :-)
# Dates for data
start_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.nan
df['Date'] = df.index
local_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
谢谢!
侃侃无极
相关分类