Python 基于每日高低价的一周高低价取数日期

Python 基于每日高低价的一周高低价取数日期,python,pandas,Python,Pandas,首先,我将分享运行python代码的目标 从雅虎那里获得股票的每日高价和低价 将每日高点和低点转换为每周高点/低点、每月低点和年度低点 从每日数据帧获取每周或每月高点低点的确切日期 最后,在获取了每周(或每月)高点和低点的日期之后,我想整理一周中第一次出现的高点或低点的数据。例如,在2020年12月12日结束的一周内,我得到的本周高点是100,本周低点是97(完成步骤2后),以及每日数据帧中的高点日期和低点日期(从步骤3开始),我想按照发生的顺序安排价格。所以如果高点发生在12月9日,低点发生在

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

  • 从雅虎那里获得股票的每日高价和低价
  • 将每日高点和低点转换为每周高点/低点、每月低点和年度低点
  • 从每日数据帧获取每周或每月高点低点的确切日期
  • 最后,在获取了每周(或每月)高点和低点的日期之后,我想整理一周中第一次出现的高点或低点的数据。例如,在2020年12月12日结束的一周内,我得到的本周高点是100,本周低点是97(完成步骤2后),以及每日数据帧中的高点日期和低点日期(从步骤3开始),我想按照发生的顺序安排价格。所以如果高点发生在12月9日,低点发生在12月12日。第1行中的价格将被安排为100,第2行中的价格将被安排为97,该过程将在整个数据帧中重复
  • 我所能做到的。 我已经完成了第一步和第二步。到目前为止,步调一致地挣扎了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)
    
    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()   
    
    第2步由

    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)
    
    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,但无法将每周数据帧与高低数据帧组合。当指定“保持最晚”时,通过执行合并和删除重复操作而增加的每周记录数也无法正常工作


    所以,如果你们都能在第三步和第四步帮助我,我将不胜感激谢谢

    解决了我在上面发布的问题。希望这能帮助别人。谢谢

    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)
    
    将熊猫作为pd导入
    以yf形式导入yf财务
    将日期时间导入为dt
    将numpy作为np导入
    股票代码=“^NSEI”
    df=yf.下载(股票代码,period='max')
    df=df.drop(['Open','Close','Adj Close','Volume',],axis=1)。reset_index()
    #每日3238列供参考
    #添加每周、每月、6个月、每年的列,
    df['WkEnd']=df.Date.dt.to_period('W')。应用(lambda r:r.start_time)+dt.timedelta(天=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解决了我上面发布的查询。希望这对其他人有所帮助。谢谢

    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)
    
    将熊猫作为pd导入
    以yf形式导入yf财务
    将日期时间导入为dt
    将numpy作为np导入
    股票代码=“^NSEI”
    df=yf.下载(股票代码,period='max')
    df=df.drop(['Open','Close','Adj Close','Volume',],axis=1)。reset_index()
    #每日3238列供参考
    #添加每周、每月、6个月、每年的列,
    df['WkEnd']=df.Date.dt.to_period('W')。应用(lambda r:r.start_time)+dt.timedelta(天=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