# -*- coding: utf-8 -*-
"""
Created on Thu Apr 27 19:09:02 2023
数据类
@author: 林梦珂
"""
import pandas as pd
import numpy as np

class dataStructure():
    def __init__(self):#year是输入的第几年参数，从0开始
        #%%常数设置
        self.name=['xw','nzd']
        #时段index
        self.M=range(12)#一年12月
        # self.T=range(684)#长系列月时段数，57年684
        # self.L_T=range(685)#长系列水位库容
        # self.KK1=np.arange(1,685,1)
        self.T=range(12)#长系列月时段数
        self.L_T=range(13)#长系列水位库容
        self.KK1=np.arange(1,13,1)
        
        self.delta_t=730#月小时数
        self.TC=10000#通道约束
        self.zdl={'xw':1166,'nzd':765}
        self.znl={'xw':1240,'nzd':812}
        self.zfl={'xw':1236,'nzd':804}
        self.qmax={'xw':15666,'nzd':27418}
        self.qmin={'xw':123,'nzd':174}
        #self.qmin={'xw':324,'nzd':233}
        self.qpmax={'xw':2340,'nzd':3537}
        self.qpmin={'xw':0,'nzd':0}
        self.rni={'xw':4200,'nzd':5850}
        # self.rnf={'xw':1000,'nzd':1700}
        self.rnf_system=2500#水风光保证出力
        self.refill_level={'xw':1240,'nzd':812}
        # self.rnf=[800,900,1000,1100,1000,1100,1400,1000,1100,1100,1200,900]#顶峰8小时
        # self.Nmax=[8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000]#模拟提供的梯级最大出力，顶峰8小时
        
        # self.rnf=[600,800,200,200,300,300,600,400,300,300,400,500]#顶峰4小时
        # self.Nmax=[8000,8000,8000,8000,9000,9000,9000,9000,9000,9000,9000,9000]#顶峰4小时
        
        # self.rnf=[600,900,400,400,500,500,900,600,600,500,500,600]#顶峰6小时
        # self.Nmax=[8000,8000,8000,8000,9000,8000,9000,9000,9000,8000,9000,9000]#顶峰6小时
        
        
        # self.rnf=[600,900,600,800,800,900,1200,900,900,800,800,700]#顶峰8小时
        # self.Nmax=[8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000]#顶峰8小时
        
        
        self.rnf=[800,900,1000,1300,1300,1400,1400,1200,1300,1300,1100,1000]#顶峰10小时
        self.Nmax=[8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000]#顶峰10小时
        
        
        # self.rnf=[1000,1000,1400,1800,1900,1900,1800,1600,1700,1400,1400,1300]#顶峰12小时
        # self.Nmax=[8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000,8000]#顶峰12小时
        
        
        self.Q1_dis=[0,1240,2340]##发电流量能力离散
        self.Q2_dis=[0,1800,3537]
        self.head_xw=[159,214,251]
        self.head_nzd=[168,210,254]
        #%%径流、月尺度风光
        # self.wp_data_t=np.array(pd.read_excel('多年入流&风光_训练.xlsx','wp')['风光'])#月尺度新能源电量数据
        # self.runoff_data_xw=np.array(pd.read_excel('多年入流&风光_训练.xlsx','xw')['入流'])
        # self.runoff_data_nzd=np.array(pd.read_excel('多年入流&风光_训练.xlsx','nzd')['入流'])
        self.wp_data_t=np.array(pd.read_excel('G:/Spyder_workspace/2. Operation rules/Basic data/丰平枯典型年径流&风光.xlsx','wet')['wp'])#月尺度新能源电量数据
        self.runoff_data_xw=np.array(pd.read_excel('G:/Spyder_workspace/2. Operation rules/Basic data/丰平枯典型年径流&风光.xlsx','wet')['xw'])
        self.runoff_data_nzd=np.array(pd.read_excel('G:/Spyder_workspace/2. Operation rules/Basic data/丰平枯典型年径流&风光.xlsx','wet')['nzd'])
        #%%各电站特性曲线读取、Epeak
        filename='G:/Spyder_workspace/2. Operation rules/Basic data/HydroStations_info.xlsx'
        #库容、尾水位曲线
        self.z_up1=pd.read_excel(filename,sheet_name='z_v1')['z_up']
        self.v1=pd.read_excel(filename,sheet_name='z_v1')['v']
        self.z_down1=pd.read_excel(filename,sheet_name='z_q1')['z_down']
        self.q1=pd.read_excel(filename,sheet_name='z_q1')['q']
        
        self.z_up2=pd.read_excel(filename,sheet_name='z_v2')['z_up']
        self.v2=pd.read_excel(filename,sheet_name='z_v2')['v']
        self.z_down2=pd.read_excel(filename,sheet_name='z_q2')['z_down']
        self.q2=pd.read_excel(filename,sheet_name='z_q2')['q']
        
        ##水头耗水率曲线
        self.head1=pd.read_excel(filename,sheet_name='head_rate1')['head']
        self.warate1=pd.read_excel(filename,sheet_name='head_rate1')['rate']
        
        self.head2=pd.read_excel(filename,sheet_name='head_rate2')['head']
        self.warate2=pd.read_excel(filename,sheet_name='head_rate2')['rate']
        
        
        #Epeak各月曲线
        filename2='G:/Spyder_workspace/2. Operation rules/Basic data/Epeak_curves_4h.xlsx'
        
        
        N={}
        Epeak={}
        for i in range(12):
            temp_N=np.array(pd.read_excel(filename2,sheet_name='%d月'%(i+1))['N'])
            temp_Epeak=np.array(pd.read_excel(filename2,sheet_name='%d月'%(i+1))['Epeak'])
            N.update({i:temp_N})
            Epeak.update({i:temp_Epeak})
            
        self.N=N
        self.Epeak=Epeak
           
        # #NHQ 数据读取
        self.nhq_data_xw=pd.read_excel(filename,sheet_name='NHQ1')
        self.nhq_data_nzd=pd.read_excel(filename,sheet_name='NHQ2')
        self.nhq_q_xw=dataStructure.nhq_creat(self.nhq_data_xw)[0]
        self.nhq_n_xw=dataStructure.nhq_creat(self.nhq_data_xw)[1]
        self.nhq_q_nzd=dataStructure.nhq_creat(self.nhq_data_nzd)[0]
        self.nhq_n_nzd=dataStructure.nhq_creat(self.nhq_data_nzd)[1]
        
        # #耗水率三维对应N
        self.QP1=[]
        self.Lev1=[]
        self.N1=[]
        self.QP2=[]
        self.Lev2=[]
        self.N2=[]
        
        for i in range(len(self.Q1_dis)-1):
            k=len(self.head1)-1
            for j in range(k):
                
                self.QP1.append([self.Q1_dis[i],self.Q1_dis[i+1],self.Q1_dis[i+1]])
                self.QP1.append([self.Q1_dis[i+1],self.Q1_dis[i],self.Q1_dis[i]])
                self.Lev1.append([self.head1[k-j],self.head1[k-j],self.head1[k-j-1]])
                self.Lev1.append([self.head1[k-j-1],self.head1[k-j-1],self.head1[k-j]])
                self.N1.append([self.Q1_dis[i]/self.warate1[k-j]*3.6,self.Q1_dis[i+1]/self.warate1[k-j]*3.6,self.Q1_dis[i+1]/self.warate1[k-j-1]*3.6])
                self.N1.append([self.Q1_dis[i+1]/self.warate1[k-j-1]*3.6,self.Q1_dis[i]/self.warate1[k-j-1]*3.6,self.Q1_dis[i]/self.warate1[k-j]*3.6])
        
        
        for i in range(len(self.Q2_dis)-1):
            k=len(self.head2)-1
            for j in range(k):
                self.QP2.append([self.Q2_dis[i],self.Q2_dis[i+1],self.Q2_dis[i+1]])
                self.QP2.append([self.Q2_dis[i+1],self.Q2_dis[i],self.Q2_dis[i]])
                self.Lev2.append([self.head2[k-j],self.head2[k-j],self.head2[k-j-1]])
                self.Lev2.append([self.head2[k-j-1],self.head2[k-j-1],self.head2[k-j]])
                self.N2.append([self.Q2_dis[i]/self.warate2[k-j]*3.6,self.Q2_dis[i+1]/self.warate2[k-j]*3.6,self.Q2_dis[i+1]/self.warate2[k-j-1]*3.6])
                self.N2.append([self.Q2_dis[i+1]/self.warate2[k-j-1]*3.6,self.Q2_dis[i]/self.warate2[k-j-1]*3.6,self.Q2_dis[i]/self.warate2[k-j]*3.6])
            
      
 #%%库容曲线及尾水位曲线的index
 

        self.M1=np.arange(1,len(self.z_up1),1)#小湾库水位01变量索引
        self.J1=np.arange(1,len(self.z_down1),1)#小湾尾水位01变量索引

        self.M2=np.arange(1,len(self.z_up2),1)#糯扎渡库水位01变量索引 
        self.J2=np.arange(1,len(self.z_down2),1)#糯扎渡尾水位
        self.W1=np.arange(1,len(self.head1),1)#小湾水头耗水率01变量索引
        # self.U1=np.arange(1,len(self.warate1),1)#小湾耗水率
        self.W2=np.arange(1,len(self.head2),1)#糯扎渡水头耗水率01变量索引
        # self.U2=np.arange(1,len(self.warate2),1)#糯扎渡耗水率
        
        self.C1=np.arange(1,len(self.nhq_q_xw),1)#nhq q离散区间数量
        self.C2=np.arange(1,len(self.nhq_q_nzd),1)#nhq q离散区间数量
        self.B1=np.arange(1,len(self.head_xw),1)#nhq h离散区间个数
        self.B2=np.arange(1,len(self.head_nzd),1)#nhq h离散区间个数
        
        self.EP=np.arange(1,len(self.N[0]),1)#Epeakcurve 01变量索引
        
        self.F1=range((len(self.Q1_dis)-1)*(len(self.warate1)-1)*2)
        self.F2=range((len(self.Q2_dis)-1)*(len(self.warate2)-1)*2)
        self.TR=range(3)#三角形点数，3
        
#%%方法

    #读取场景数据，并赋值给dataclass变量的方法
    def scenarios_dis(data):#length 是场景长度
        res={}#最终场景结果，字典表示    
        for i in range(1,13):
            temp=data[data['月份']==i]
            temp=temp.drop('月份',axis=1)
            res.update({i:np.array(temp)})
        return res
    #给定日电量，按照新能源日内特征曲线进行缩放
    def get_wpi(E,typicalcurves,TC):
        results=np.zeros((4,24))
        k=0
        for curve in typicalcurves:
            curve=np.array(curve)
            output=np.array(E/np.mean(curve)*curve)
            output[output>TC]=TC
            results[k]=output
            k+=1
        return results
    
    def nhq_creat(data):#data是输入的数据，第一列是Q,后面列是不同水头下的出力
        Q=data.iloc[:,0].values
        N=(data.drop('Q',axis=1).values).T
        return Q,N         

if __name__=='__main__':
    
    ds=dataStructure()
     