-5

これは私にバナナを駆り立てています:)私は月に従ってリストから値を合計しようとしています、私はいくつかのことを試みましたが、ひどくガイダンスが必要です。

私がしようとしていること:1か月目から12か月目。

リスト(EC_PlanData)からPlanWeek(4)の値を繰り返し読み取り、合計

次に、合計値に基づいて平滑化された平均値を計算します。

これが私のコードです:

G_counter = 1
j = i
m = 1
Plantotal = 0
PlanMonth = 0
DFD = []
EC_PlanData = [500,500.... etc] # 52 values

PlanWeek = range(j,j+3)
Month = range(m,13,1)

## Define Variables
ym, xh, xm, N1, Z1, N2, Z2 = 0,0,0,0,0,0,0

for month in Month:      # for each month 1 - 13
    for i,e in enumerate(list_1):      # read through list
        PlanMonth = PlanMonth + i+3    # sum 4 weekly values
        DFD.append(PlanMonth)          # append sum value to DFD list
        if i == 1:                     # if G_counter = 1, which it always is
            IFX.append(PlanMonth)      # also append to IFX list

    Plantotal= Plantotal+PlanMonth     # calculations here on are
    for i,e in enumerate(DFD):         # evaluated after appending above
        y = e

    ym = Plantotal / m                 # These are calculating a smoothing average
    xh = xh + m
    xm = xh / m      
    N1 = (m-xm) * (y-ym)
    Z1 = (m-xm) * (m-xm)
    N2 = N2 + N1
    Z2 = Z2 + Z1

    if Z2 == 0:                        # Decision on FC value
        FC = 0                         # This or
    else:
        FC = ym -(N2/Z2)*xm + (N2/Z2)*(m+1) # This

    J +=4                              # Advances on 4 time periods
    M +=1                              # Advances on 1 Month
    PlanMonth = 0                      # Resets PlanMonth variable
4

1 に答える 1

1

12は52を分割せず、毎月4週間はないことを理解する必要があります。したがって、必要なものを正確に取得するために微調整できる例を示すために、木曜日が属するのと同じ月に属する週を定義しました。これは、その年の最初の週のISO8601定義とうまく一致します。残りの週がある場合は、その週を12月に追加します。

import datetime
from itertools import groupby

def get_week(date):
    return date.isocalendar()[1]

def group_by_month(weeks, year):
    """
    Group a list containing one item per week, starting with week 1, by month.

    If there are too few items to fill a year, stop after last item.
    If there are more items than weeks in the year, stop before new year.
    """
    day = datetime.timedelta(days=1)
    week = datetime.timedelta(days=7)

    # Find first Thursday (it's in week 1 by ISO 8601)
    date = datetime.date(year, 1, 1)
    while date.weekday() != 3:
        date += day

    # Create list of one day from each week
    thursdays = []
    while date.year == year:
        thursdays.append(date)
        date += week

    # Check if the last day is in the last week and if not, 
    # add the week of the last day
    last = tursdays[-1]
    if get_week(last.replace(day=31)) != get_week(last):
        # this will not be a Thursday, but what the hey
        thursdays.append(last.replace(day=31))

    # The thursdays are already sorted by month, so 
    # it's OK to use groupby without sorting first
    for k, g in groupby(zip(weeks, thursdays), key=lambda x: x[1].month):
        yield [x[0] for x in g]

list_1 = [500] * 52

print map(sum, group_by_month(list_1, 2012))

結果:

[2000, 2000, 2500, 2000, 2500, 2000, 2000, 2500, 2000, 2000, 2500, 2000]

また、1年に53週間が含まれる場合があることにも注意する必要があります。その場合は、52項目のリストではなく53項目のリストを指定する必要があります。そうしないと、53週目は単に無視されます。

于 2012-08-14T10:45:15.150 に答える