2016-11-04 19 views
0
from sqlalchemy import Column, Integer, String, Boolean, Float, DateTime,   ForeignKey 
from sqlalchemy.orm import relationship, reconstructor 

from app import utils 
import datetime 
import pandas 

from base import Base 
from series import Series 


class ConstantSeries(Series): 
__tablename__ = 'constantseries' 

# ID Primary Key (linked to parent) 
id = Column(Integer, ForeignKey('series.id'), primary_key=True) 

# The value of this series to be returned for all periods. 
value = Column(Float) 

__mapper_args__ = {'polymorphic_identity': 'constantseries'} 

def GetData(self, scenario, periods): 
    """Get data values for the specified periods. 
    """ 
    return pandas.Series(data=[self.value]*len(periods), index=periods) 

我已經被給了上面的代碼,但我想能夠改變它,以便我可以有一個系列具有不同的值,取決於它是哪一天。例如,如果是星期幾,我的值爲100,而週末的值爲200更改系列我已被給

+0

我還是想保持相同的輸出格式 – Ollie

回答

0

您能告訴我您是如何調用上述代碼以及它當前返回的內容嗎?

看來,GetData函數只是返回一個數據結構,即它返回每個週期的列的結構,但沒有實際的數據。 這裏沒有顯示的是如何填充和訪問列中的實際數據。

你可以遍歷你的期間,並根據當天建立系列數據,例如,如果期間包含['星期一','星期二','結婚','星期四','星期五','坐','太陽「]

def GetData(self, scenario, periods): 
    mydata = {} 
    for p in periods: 
     if p in ['sat','sun']: 
      e[p] = 200 
     else: 
      e[p] = 100 

    return pandas.Series(mydata, index=periods) 

然後調用getData應該返回類似 '星期一' 100 '星期二' 100 ... '坐' 200 '太陽' 200

,但是那不是你的結構想要和我不認爲它如何使用Getdata函數。

+0

帽=(ConstantSeries(值= 1647))#2574 * 0.64 高清的GetData(個體經營,場景,週期): RTN = {} 如果timest.weekday_name在['Saturday','Sunday']中: rtn.append(0.72 * val)#0.46 * 2574 else: rtn.append(1.0 * val) cap2 = [rtn] – Ollie

+0

然後我添加在行中。 (我需要它是這種格式) cap2.GetData(base_scenario,utils.enumerate_periods(start,end,'H','CET'))。plot() – Ollie

+0

in ()() ----> 1 cap2.GetData(base_scenario,utils.enumerate_periods(start,end,'H','CET'))。plot() 2#cap2.plot() C:\ (self,name) 2670 if self._info_axis中的名稱: 2671返回self [名稱] - > 2672返回對象.__ getattribute __(自我,名稱)在__getattr __中的Anaconda2 \ lib \ site-packages \ pandas \ core \ generic.pyc ) 2674 def __setattr __(self,name,value): AttributeError:'Serie s'對象沒有屬性'GetData' – Ollie

0
def GetData(self, scenario, periods): 
    rtn = {} 
    for timest, val in cap.GetData(base_scenario,utils.enumerate_periods(start,end,'H','CET')).iteritems(): 
     if timest.weekday_name in ['Saturday', 'Sunday']: 
      rtn[timest.weekday_name] = (0.72 * val) 
      #0.46*2574 
     else: 
      rtn[timest.weekday_name] = (1.0 * val) 
    return [rtn] 
+0

實際上我認爲你可以刪除「自我」的論點,然後你只是做GetData(base_scenario,utils.enumerate_periods(開始,結束,'H','CET')) ).plot() – Trickster

0
#Define ConstantSeries class 
#I have made no changes here, just what you already had 
class ConstantSeries(Series): 
    __tablename__ = 'constantseries' 

    # ID Primary Key (linked to parent) 
    id = Column(Integer, ForeignKey('series.id'), primary_key=True) 

    # The value of this series to be returned for all periods. 
    value = Column(Float) 

    __mapper_args__ = {'polymorphic_identity': 'constantseries'} 

    def GetData(self, scenario, periods): 
     """Get data values for the specified periods. 
     """ 
     return pandas.Series(data=[self.value]*len(periods), index=periods) 
#End of class definition 


#Define new special Cap2Series class 
class Cap2Series(Series): 
    #I'm not sure how tablename is used so be aware, might need to put constantseries as before 
    __tablename__ = 'cap2series' 

    # ID Primary Key (linked to parent) 
    id = Column(Integer, ForeignKey('series.id'), primary_key=True) 

    # The value of this series to be returned for all periods. 
    value = Column(Float) 

    #Same as above, I'm not sure how this is used so be aware, might need to put constantseries as before 
    __mapper_args__ = {'polymorphic_identity': 'cap2series'} 


    #Define GetData method of our new special class 
    def GetData(self, scenario, periods): 

     #instantiate new ConstantSeries instance called cap when you call GetData 
     cap = (ConstantSeries(value=self.value)) 

     rtn = {} 
     for timest, val in cap.GetData(scenario, periods).iteritems(): 
      if timest.weekday_name in ['Saturday', 'Sunday']: 
       rtn[timest.weekday_name] = (0.72 * val) 
       #0.46*2574    
      else: 
       rtn[timest.weekday_name] = (1.0 * val)    
     return pandas.Series(data=rtn, index=periods) 
#End of class definition 


#Instantiate new Cap2Series instance called cap2 
cap2 = Cap2Series(1647) 

#Call GetData method of cap2 instance 
cap2.GetData(base_scenario, utils.enumerate_periods(start,end,'H','CET')).plot() 


#Is this something like what you're trying to do? 
+0

這就是我想要做的,我認爲它幾乎是正確的。問題是它的狀態ConstantSeries是不可迭代的(因爲它已被正確定義不是)我認爲需要有一個系列的另一個定義可以改變(即不是恆定的),但我可以說垃圾... – Ollie

+0

我試過把東西換成東西,但基本上你會遇到2個問題。 1是一個簡單的列表沒有屬性getdata,另一個是常量序列不可迭代。因此你無法通過定義一個或另一個來擺脫陷阱。如果這是有道理的? – Ollie

+0

嗯,這很奇怪,是否說哪一行給出了不可迭代的錯誤?我看不到我們在哪裏迭代ConstantSeries。我們在ConstantSeries的GetData方法的輸出上調用.iteritems(),但該方法的輸出是常規系列。我們是否需要使用ConstantSeries?請注意,很多這些東西都使用了我以前從未見過的特定庫(比如Pandas),所以Series的全部概念對我來說都是新的。 – Trickster