提问人:Marisa Acevedo 提问时间:10/21/2023 最后编辑:Marisa Acevedo 更新时间:10/23/2023 访问量:72
如何用适用于不同数据集的变量替换硬编码索引?
How to replace hard-coded indexes with variables that work with different datasets?
问:
我很想得到一些关于我如何遵守规则的建议,即我的代码必须适用于任何数据。我尝试使用索引来查找以下问题的最大损失日期,但没有奏效。我最终只是将日期硬编码到“losshigh”变量中,但我认为这还不够。我们也不能使用 for 循环。
我们正在使用的“stock”数据集是一个具有 DateTime 索引和浮点值的 pandas 系列。
“找到最糟糕的买入和卖出日期组合,又名。买入 X 和卖出 Y 时损失的百分比(X 之后是 Y)的两天最大化。提示:使用 cummax() 方法或 cummin() 方法。
这是我到目前为止所拥有的。
====
#Reproducing stock.
import pandas as pd
import numpy as np
data = pd.read_csv('NVDA.csv',index_col=0, parse_dates=True)
stock = data['Close']
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
pd.set_option('display.float_format', lambda x: '%.2f' % x)
pd.set_option('display.max_columns', None)
====
#Find the highest index of x that comes before the lowest index of y
#The worst ratio of high stock in the past to whatever stock price is now.
bigloss=stock.cummax()/stock
biggestloss=bigloss.nlargest(1)
#Defining y.
y=stock.loc[biggestloss.index]
#The highest stock up to the biggest loss date.
losshigh=stock.loc['1999-01-22':'2002-10-09'].max()
#Defining x.
x=stock[stock==losshigh]
#The worst percentage.
percentage=(x[0]-y[0]/x[0])*100
答:
0赞
Mark
10/22/2023
#1
好的,所以首先免责声明:我将其解释为您在一天买入和另一天卖出的最大总损失是多少。导师可能会要求每天买卖的最大损失,或最大百分比损失,或每天最大百分比损失,但这些都是不同的问题。
但无论如何:
# first, we import pandas
import pandas as pd
# second, create sample data
stock = pd.Series([100, 120, 90, 30, 70, 150, 110, 100, 80, 90], index=pd.date_range(start='2023-01-01', periods=10, freq='D'), name='Stock_Price')
# cummax() finds the minimum value in the data *so far*
>>> stock.cummax()
2023-01-01 100
2023-01-02 120
2023-01-03 120
2023-01-04 120
2023-01-05 120
2023-01-06 150
2023-01-07 150
2023-01-08 150
2023-01-09 150
2023-01-10 150
所以基本上,这个想法是这样的:如果在某一天,cummax和当天的股票价格之间的差异很大,这意味着我们过去可以以更高的价格买入它,然后今天卖出。如果今天的价格低于这个最高价格,那么我们将赔钱。以下是我们数据集的结果:
>>> stock - stock.cummax()
2023-01-01 0
2023-01-02 0
2023-01-03 -30
2023-01-04 -90
2023-01-05 -50
2023-01-06 0
2023-01-07 -40
2023-01-08 -50
2023-01-09 -70
2023-01-10 -60
现在,我们只看一眼,最糟糕的一天是 2023-01-04。我们可以通过使用 idxmin() 来获取该值:
>>> sell_day = (stock - stock.cummax()).idxmin()
Timestamp('2023-01-04 00:00:00')
现在要获取从开始到卖出日的数据点,然后找到这些日子内的最高价格,这必须是我们的买入日:
>>> stock[:sell_day]
2023-01-01 100
2023-01-02 120
2023-01-03 90
2023-01-04 30
>>> buy_day = stock.loc[:sell_day].idxmax()
Timestamp('2023-01-02 00:00:00')
最后,为了得到损失,我们可以使用简单的算术来计算:
>>> 100 * (stock[sell_day] - stock[buy_day]) / stock[sell_day]
-300.0
在示例数据集中,您在 2023-01-02 以 120 美元的价格买入,并在 2023-01-04 以 30 美元的价格卖出,将损失 300%。
评论
stock