[英]Convert positive values based on a filter condition in a DataFrame to negative values
[英]enter positive and negative values based on a target date in a dataframe
我有一個包含股票數據的DF,並希望在target_date之前和之后輸入負整數和正整數(描述天數)-根據以下內容:
我所擁有的(日期是索引):
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
以下是我想要的target_date為12/16/1988的表示形式:
- 創建一個稱為“天”的列
- 在目標日期(例如,1988年12月16日)-在“天”列中輸入“ 0”
- 在“日期”列中-在目標日期之前輸入-1至-n(日期之前df的長度)
- 在“天”列中-在目標日期之后輸入1到n(日期之后的df長度)
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
我考慮過采用以下方法(基於SO,但找不到源):
lenDF = (int(len(df) / 2))
df.insert(0, 'day', range(-lenDF, -lenDF + len(df)))
在目標日期之前的df長度可以不同於目標日期之后的df長度之前,這對於我的目的而言並不完全正確。 它與目標日期的“天”列中的“ 0”不匹配。
我還嘗試在目標日期之前和之后截斷df,但與上述解決方案存在相同的問題,它與target_date的“天”列中的“ 0”不匹配。
df_before_target = df.truncate(before=target_date)
df_after_target = df.truncate(after=target_date)
len_b4 = len(df_before_target ) - 1 # substracting 1 to account for double counting of target_date in the truncated dfs.
len_a4 = len(df_after_target )
df.insert(0, 'day', range(-len_b4, -len_a4 + len(df)))
感謝您的任何幫助。
我認為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]
它將對DatetimeIndex
每個pd.Timestamp
對象進行迭代,並從目標日期1988-12-16
計算出差異(從工作日角度來看)。
然后,您可以將數據分配給數據框,如下所示:
df['day'] = days
並按照帖子中顯示的順序對列進行重新排序:
df.reindex(columns=['day', 'symbol', 'open', 'high', 'low', 'close', 'volume'])
我有一個可能很hacky的解決方案,但它應該可以完成工作。
df["day"] = df.index.values - df[df[date] == "TARGET DATE"].index[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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.