我有一个包含股票数据的df,想在target_date之前和之后输入负整数和正整数(表示天数)-如下所示:
我所拥有的(日期是索引):
<div *ngIf='username'>
<h1>{{username}}</h1>
</div>
下面是我想要的目标日期是1988年12月16日的图示:
- 创建一个名为“天”的列
- 在目标日期(例如,1988年12月16日)-在“天”列中输入“ 0”
- 在“日期”列中-在目标日期之前输入-1到-n(日期之前的df长度)
- 在“天”列中-在目标日期之后输入1到n(日期之后的df长度)
date symbol open high low close volume
12/9/1988 AAPL 1.4018 1.4107 1.3839 1.3975 11239200
12/12/1988 AAPL 1.4018 1.4107 1.375 1.375 29470000
12/13/1988 AAPL 1.375 1.3839 1.3661 1.3839 30637600
12/14/1988 AAPL 1.375 1.4286 1.375 1.4196 48325200
12/15/1988 AAPL 1.4286 1.4464 1.4018 1.4107 28142800
12/16/1988 AAPL 1.4107 1.4464 1.4018 1.4332 45872400
12/19/1988 AAPL 1.4375 1.4643 1.4286 1.4554 58581600
12/20/1988 AAPL 1.4643 1.4821 1.4511 1.4643 68546800
12/21/1988 AAPL 1.4643 1.5 1.4643 1.4911 60491200
12/22/1988 AAPL 1.4911 1.5 1.4554 1.4643 26507600
12/23/1988 AAPL 1.4643 1.4779 1.4643 1.4689 10239600
12/27/1988 AAPL 1.4643 1.4821 1.4464 1.4464 14996800
12/28/1988 AAPL 1.4464 1.4554 1.4196 1.4375 12885600
我已经考虑采用以下方法(基于SO,但是找不到源):
date day symbol open high low close volume
12/9/1988 -5 AAPL 1.4018 1.4107 1.3839 1.3975 11239200
12/12/1988 -4 AAPL 1.4018 1.4107 1.375 1.375 29470000
12/13/1988 -3 AAPL 1.375 1.3839 1.3661 1.3839 30637600
12/14/1988 -2 AAPL 1.375 1.4286 1.375 1.4196 48325200
12/15/1988 -1 AAPL 1.4286 1.4464 1.4018 1.4107 28142800
12/16/1988 0 AAPL 1.4107 1.4464 1.4018 1.4332 45872400
12/19/1988 1 AAPL 1.4375 1.4643 1.4286 1.4554 58581600
12/20/1988 2 AAPL 1.4643 1.4821 1.4511 1.4643 68546800
12/21/1988 3 AAPL 1.4643 1.5 1.4643 1.4911 60491200
12/22/1988 4 AAPL 1.4911 1.5 1.4554 1.4643 26507600
12/23/1988 5 AAPL 1.4643 1.4779 1.4643 1.4689 10239600
12/27/1988 6 AAPL 1.4643 1.4821 1.4464 1.4464 14996800
12/28/1988 7 AAPL 1.4464 1.4554 1.4196 1.4375 12885600
在目标日期之前的df长度可以与目标日期之后的df长度不同之前,这对我而言并不完全正确。它与目标日期的“天”列中的“ 0”不匹配。
我还尝试了在目标日期之前和之后截断df的问题-但与上述解决方案相同的问题-它与target_date的“天”列中的“ 0”不匹配。
lenDF = (int(len(df) / 2))
df.insert(0, 'day', range(-lenDF, -lenDF + len(df)))
谢谢您的帮助。
答案 0 :(得分:1)
我认为numpy的busday_count()
在这里可以很好地工作。
我更喜欢使用ISO 8601表示法来表示日期。您可以使用熊猫的DatetimeIndex
类:
df.index = pd.DatetimeIndex(df.index)
我们可以按以下方式获取所需列的数据:
days = [np.busday_count('1988-12-16', x.date()) for x in df.index]
迭代pd.Timestamp
中的每个DatetimeIndex
对象,并从工作日的角度计算与目标日期1988-12-16
的差值。
然后您可以按以下方式将此数据分配给您的数据框:
df['day'] = days
并对帖子中显示的列进行重新排序:
df.reindex(columns=['day', 'symbol', 'open', 'high', 'low', 'close', 'volume'])
答案 1 :(得分:0)
我有一个可能很棘手的解决方案,但它应该可以完成工作。
from typing import TypeVar, Generic, List
T = TypeVar('T')
class CircularQueue(Generic[T]):
def __init__(self):
self._front = 0
self._rear = 0
self._array = list()
def mod(self, x): return (x+1) % (len(self._array)+1)
@property
def is_full(self):
return self.mod(self._rear) == self.mod(self._front) + 1
def insert(self, element: T):
if not self.is_full:
self._rear += 1
self._array.append(element)
if __name__ == "__main__":
# I want to Initialize the queue as cQueue = CircularQueue<int>()
# Something that other compiled languauges offer
# Is it possible to do so?
# Or any other method so that I can restrict the type of objects.
cQueue = CircularQueue()
cQueue.insert(10)
# Here I want to raise an error if I insert any other type of Object
cQueue.insert('A')
答案 2 :(得分:0)
这是我计算天数的版本。
dataset=pd.DataFrame(test)
dataset.head()
原始数据的输出:
date symbol high
0 12/9/1988 AAPL 1.4018
1 12/12/1988 AAPL 1.4018
2 12/13/1988 AAPL 1.3750
3 12/14/1988 AAPL 1.3750
4 12/15/1988 AAPL 1.4286
from datetime import datetime
dataset=pd.DataFrame(test)
dataset['date']=pd.to_datetime(dataset['date'])
target_date = datetime.strptime('12/16/1988', "%m/%d/%Y")
dataset['Days']= (dataset['date'] - (target_date)).dt.days
dataset.head()
输出:
date symbol high Days
0 1988-12-09 AAPL 1.4018 -7
1 1988-12-12 AAPL 1.4018 -4
2 1988-12-13 AAPL 1.3750 -3
3 1988-12-14 AAPL 1.3750 -2
4 1988-12-15 AAPL 1.4286 -1