簡體   English   中英

根據數據框中的目標日期輸入正值和負值

[英]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的表示形式:

  1. 創建一個稱為“天”的列
  2. 在目標日期(例如,1988年12月16日)-在“天”列中輸入“ 0”
  3. 在“日期”列中-在目標日期之前輸入-1至-n(日期之前df的長度)
  4. 在“天”列中-在目標日期之后輸入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM