【问题标题】:Fetching date of high and low prices for week based on daily high low prices根据每日高低价格获取一周的高低价格日期
【发布时间】:2021-03-23 11:13:27
【问题描述】:

首先我将分享运行python代码的目标。

  1. 从雅虎获取股票的每日最高价和最低价。
  2. 将每日最高价和最低价转换为每周最高/最低价、每月最高最低价、每年最高最低价。
  3. 从每日数据框中获取每周或每月最高低点的确切日期
  4. 最后,在获取每周(或每月)高点和低点的日期后,我想整理一周内第一个高点或低点发生的数据。例如。在截至 2020 年 12 月 12 日的一周内,我得到本周最高价为 100,周最低价为 97(在完成第 2 步后)以及每日数据帧中的最高价和最低价(从第 3 步开始),我想将价格安排在发生的顺序。所以如果高位发生在 12 月 9 日,低位发生在 12 月 12 日。价格将在第 1 行排列为 100,然后在第 2 行排列为 97,此过程将针对整个数据框重复。

我能够实现的目标。 我已经完成了第1步和第2步。目前在第3步中挣扎。

已完成第 1 步

import pandas as pd
import yfinance as yf

Ticker = '^NSEI'


f = yf.download(Ticker,period="max")
f = f.drop(['Adj Close'], axis=1)
f = f.drop(['Open'], axis=1)
f = f.drop(['Close'], axis=1)
f = f.drop(['Volume'], axis=1)
f.reset_index(inplace=True)
f.insert(0,'Ticker',Ticker)

第 2 步

fw = f.groupby(['Ticker', pd.Grouper(key='Date', freq='W')])\
    .agg(High=pd.NamedAgg(column='High', aggfunc='max'),
         Low=pd.NamedAgg(column='Low', aggfunc='min'))\
        .reset_index()
fm = f.groupby(['Ticker', pd.Grouper(key='Date', freq='M')])\
    .agg(High=pd.NamedAgg(column='High', aggfunc='max'),
         Low=pd.NamedAgg(column='Low', aggfunc='min'))\
        .reset_index()
fq = f.groupby(['Ticker', pd.Grouper(key='Date', freq='Q')])\
    .agg(High=pd.NamedAgg(column='High', aggfunc='max'),
         Low=pd.NamedAgg(column='Low', aggfunc='min'))\
        .reset_index()
fy = f.groupby(['Ticker', pd.Grouper(key='Date', freq='Y')])\
    .agg(High=pd.NamedAgg(column='High', aggfunc='max'),
         Low=pd.NamedAgg(column='Low', aggfunc='min'))\
        .reset_index()   

在第 3 步中挣扎。使用了 pd.merge、pd.join、pd.concat,但无法将每周数据帧与高点和低点的数据帧结合起来。当指定保持最后时,通过执行合并和删除重复来增加每周记录的数量也不能正常工作。

因此,如果你们都可以在第 3 步和第 4 步中帮助我,将不胜感激。 谢谢

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    解决了我在上面发布的问题。希望这对其他人有帮助。谢谢

    import pandas as pd
    import yfinance as yf
    import datetime as dt
    import numpy as np
    
    
    Ticker = '^NSEI'
    
    df = yf.download(Ticker, period='max')
    df= df.drop(['Open', 'Close', 'Adj Close', 'Volume'], axis = 1).reset_index()
    
    # Daily 3238 columns for reference
    
    #Adding columns for weekly, monthly,6 month,Yearly,
    df['WkEnd'] = df.Date.dt.to_period('W').apply(lambda r: r.start_time) + dt.timedelta(days=6)
    df['MEnd'] = (df.Date.dt.to_period('M').apply(lambda r: r.end_time)).dt.date
    df['6Mend'] = np.where(df.Date.dt.month <= 6,(df.Date.dt.year).astype(str)+'-1H',(df['Date'].dt.year).astype(str)+'-2H')
    df['YEnd'] = (df.Date.dt.to_period('Y').apply(lambda r: r.end_time)).dt.date
    
    
    # key variable for melting
    d = {'Date':['Hidate', 'Lodate'], 'Price':['High','Low']}
    
    #creating weekly neoformat
    dw = df.groupby(['WkEnd']).agg({'High' : 'max','Low' : 'min' }).reset_index()
    dw['Hidate'] = dw[['WkEnd','High']].merge(df,how = 'left').Date
    dw['Lodate'] = dw[['WkEnd','Low']].merge(df,how = 'left').Date
    dw = pd.lreshape(dw,d)
    dw = dw.sort_values(by = ['Date']).reset_index()
    dw = dw.drop(['index'], axis = 1)
    
    #creating Monthly neoformat
    dm = df.groupby(['MEnd']).agg({'High' : 'max','Low' : 'min' }).reset_index()
    dm['Hidate'] = dm[['MEnd','High']].merge(df,how = 'left').Date
    dm['Lodate'] = dm[['MEnd','Low']].merge(df,how = 'left').Date
    dm = pd.lreshape(dm,d)
    dm = dm.sort_values(by = ['Date']).reset_index()
    dm = dm.drop(['index'], axis = 1)
    
    
    #creating 6mth neoformat
    d6m = df.groupby(['6Mend']).agg({'High' : 'max','Low' : 'min' }).reset_index()
    d6m['Hidate'] = d6m[['6Mend','High']].merge(df,how = 'left').Date
    d6m['Lodate'] = d6m[['6Mend','Low']].merge(df,how = 'left').Date
    d6m = pd.lreshape(d6m,d)
    d6m = d6m.sort_values(by = ['Date']).reset_index()
    d6m = d6m.drop(['index'], axis = 1)
    
    #creating Yearly neoformat
    dy = df.groupby(['YEnd']).agg({'High' : 'max','Low' : 'min' }).reset_index()
    dy['Hidate'] = dy[['YEnd','High']].merge(df,how = 'left').Date
    dy['Lodate'] = dy[['YEnd','Low']].merge(df,how = 'left').Date
    dy = pd.lreshape(dy,d)
    dy = dy.sort_values(by = ['Date']).reset_index()
    dy = dy.drop(['index'], axis = 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2023-03-14
      相关资源
      最近更新 更多