循环遍历电子表格中的行,在每行中运行函数并将结果输出回同一行的末尾

问题描述 投票:1回答:1

这是一个艰难的,但我已经被困了2个星期,如果有人可以帮助我,我将不胜感激。基本上,我有一个电子表格,其中第一行是这样的(我无法在此处粘贴电子表格并以可理解的方式保持格式化):A1 =材料,B1 = 1月15日,C1 = 2月/ 15 ,...,AW = 12月18日。材料清单(A列)从A2一直到A6442,每一行都有一个零件编号。从B2:B6442开始,每行代表每个部件的数量。因此,行B2:AW2将是从jan / 15到dec / 18的B1部分的消耗。

考虑到上述情况,我想要做的是遍历每一行,应用def(triple_exponential_smoothing)并将系列中的最后6个数字返回到Excel,在AR到AW的单元格上(例如,对于第2行,AR2: AW2)。我将使用前3。5年(B2:AQ2)作为计算一年中剩余6个月的基础(AR2:AW2)。当我使用定义的范围运行它时(如下所示),它可以工作:

series = xw.Range((2,2),(2, 37)).value 

当我运行循环时,我甚至无法从函数中获取输出,更不用说将其写回Excel。到目前为止,我的代码如下:

import os
import xlwings as xw

#Defining folder
os.chdir('G:\...\Reports')

#importing data
wb = xw.Book('sheet.xlsx')
sht = wb.sheets['sheet']
series = [sht.range((i,2),(i, 37)).value for i in range(2, 6443)]

# Holt Winters formula

def initial_trend(series, slen):
     sum = 0.0
     for i in range(slen):
          sum += float(series[i+slen] - series[i]) / slen
    return sum / slen

def initial_seasonal_components(series, slen):
     seasonals = {}
     season_averages = []
    n_seasons = int(len(series)/slen)
    # compute season averages
    for j in range(n_seasons):
         season_averages.append(sum(series[slen*j:slen*j+slen])/float(slen))
# compute initial values
for i in range(slen):
    sum_of_vals_over_avg = 0.0
    for j in range(n_seasons):
        sum_of_vals_over_avg += series[slen*j+i]-season_averages[j]
    seasonals[i] = sum_of_vals_over_avg/n_seasons
return seasonals

def triple_exponential_smoothing(series, slen, alpha, beta, gamma, n_preds):
    result = []
    seasonals = initial_seasonal_components(series, slen)
    for i in range(len(series)+n_preds):
        if i == 0: # initial values
             smooth = series[0]
             trend = initial_trend(series, slen)
             result.append(series[0])
             continue
        if i >= len(series): # we are forecasting
             m = i - len(series) + 1
             result.append((smooth + m*trend) + seasonals[i%slen])
        else:
            val = series[i]
            last_smooth, smooth = smooth, alpha*(val-seasonals[i%slen]) + (1-alpha)*(smooth+trend)
            trend = beta * (smooth-last_smooth) + (1-beta)*trend
            seasonals[i%slen] = gamma*(val-smooth) + (1-gamma)*seasonals[i%slen]
            result.append(smooth+trend+seasonals[i%slen])
    return result

#printing results for the function looped through all rows    

print(triple_exponential_smoothing(series, 12, 0.96970912, 0.07133329, 0, 12))

我错过了什么吗?我愿意接受其他方式,只要我能一次完成所有行。

谢谢大家。

python excel python-3.x xlwings holtwinters
1个回答
0
投票

最简单的方法是创建一行工作的用户定义函数(UDF),然后根据需要将其复制下来。

为了获得更好的性能,您可以将整个数据范围读入Python,遍历每一行,将结果写入列表或Numpy数组,然后在一次操作中将所有结果写回Excel范围。这也可以方便地写成UDF。

© www.soinside.com 2019 - 2024. All rights reserved.