如何用适用于不同数据集的变量替换硬编码索引?

How to replace hard-coded indexes with variables that work with different datasets?

提问人:Marisa Acevedo 提问时间:10/21/2023 最后编辑:Marisa Acevedo 更新时间:10/23/2023 访问量:72

问:

我很想得到一些关于我如何遵守规则的建议,即我的代码必须适用于任何数据。我尝试使用索引来查找以下问题的最大损失日期,但没有奏效。我最终只是将日期硬编码到“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
Python Pandas 日期时间 序列

评论

0赞 Mark 10/21/2023
嗨,乔乔!欢迎来到 Stack Overflow!很抱歉听到你过得很糟糕。请不要因为编码而让自己筋疲力尽/给自己带来精神问题,如果你正在为一个问题而苦苦挣扎,这不是世界末日。请先照顾好自己
0赞 Mark 10/21/2023
你能编辑你的问题以添加代码进行复制吗?stock
0赞 Mark 10/21/2023
还有现在有什么帮助?提示,指导,答案直接上来?如果你对这个问题感到厌倦和厌倦,我只想得到一个答案,我可以理解(尽管,一般来说,在这里,我们尽量不要只给人们家庭作业问题的答案,因为家庭作业(和教育)的全部意义在于学生学习
0赞 user19077881 10/21/2023
首先需要将逻辑过程问题与编码问题分开。使用一些示例数据和纸/笔,考虑如何手动计算出所需的结果。然后在代码中捕获此逻辑过程,以便它适用于任何大小的数据集。如果代码给出错误消息或没有产生与您的纸张工作相匹配的预期结果,请探索出了什么问题。
0赞 Marisa Acevedo 10/22/2023
@Mark更新!在这一点上,绝对是答案。我尝试了我的技能,我尝试了课堂上教的一切。在这一点上,我只是在燃烧时间,这些时间应该用于学习我其他班级的期中考试。答案会帮助我看看我可以做些什么不同的事情。我理解当人们没有尝试所有事情时不给他们家庭作业问题的答案的意义,但此时我不知所措,筋疲力尽,没有时间进一步研究这个问题。我想答案是一些我不知道如何使用的命令组合。谢谢。

答:

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%。