我最近偶然发现pgfplotstable
以及处理表格信息和创建新列的能力。为了磨练我的技能,我尝试创建一个脚本,该脚本可以计算不同平滑因子的时间序列的指数平滑预测。
计算和绘图似乎工作得很好,但我无法为表中的每个新列赋予一个新的列名,如果我使用 打印出表格,该列名就会出现\pgfplotstabletypeset
。
总体而言,分配似乎有效(即,列名从其默认值更改,但是,当我打印表格时,所有列最终都具有相同的列名。附件是我的精简案例:
\documentclass{article}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=newest,width=10cm,legend style={font=\footnotesize}}
\usepackage{pgfplotstable}
\begin{document}
% read observed time-series
\pgfplotstableread{
x y
1 4.237485502
2 5.593257216
3 6.101509413
4 5.328536597
5 6.353556834
6 5.84178478
7 5.271878886
8 6.952802431
9 4.579257831
10 7.742456136
}\mytable
% get first x-Value as forecast value for period 1
\pgfplotstablegetelem{0}{y}\of{\mytable}
\pgfmathsetmacro{\finit}{\pgfplotsretval}
% iterate through different levels of \alpha
\pgfplotsforeachungrouped \alph in {10,20,...,50}{
\pgfplotstablecreatecol[
expr accum={ % in the first row, do not calculate forecast as linear combination of actual demand and forecast of last period, but just use initial value
\ifnum\pgfplotstablerow=0
\finit
\else
(1-\alph/100)*\pgfmathaccuma+\alph/100*\prevrow{y}
\fi
}{\finit}
]{\alph}{\mytable}
% set name for column and display style
\pgfplotstableset{columns/\expandafter\alph/.style={column name={$ES_{\alph}$},dec sep align={c}}}
}
% print forecasted values
\begin{table}
\center
\pgfplotstabletypeset[%
header=has colnames
]{\mytable}
\caption{Results of the Exponential Smoothing Excercise (Table)}
\end{table}
% plot observed and forecasted timeseries
\begin{figure}
\center
\begin{tikzpicture}
\begin{axis}[
legend cell align=left,legend pos=north west,
xlabel=$t$,ylabel=$Y$
]
\addplot[only marks] table[y=y,x=x]{\mytable};
\addlegendentry{Original Data};
\pgfplotsinvokeforeach {10,20,...,50}{
\addplot +[mark=none,thin] table[y=#1,x=x]{\mytable};
\addlegendentry{$\alpha=\pgfmathprintnumber{#1}\%$};
}
\end{axis}
\end{tikzpicture}
\caption{Results of the Exponential Smoothing Excercise (Plot)}
\end{figure}
\end{document}
顺便问一下:您知道我如何才能10,20,...,50
仅定义一次 alpha 值(在我的代码中)并重复使用它吗?我知道这是一个不同的问题,但我的第一次尝试没有成功,这些对您来说可能是唾手可得的成果 ;-)
答案1
为了消除此处的威胁:建议的解决方案敲击完美运行!
以下是分配列名的代码行的重要部分\pgfplotsforeachungrouped
:
\pgfplotstableset{columns/\alph/.estyle={column name={$ES_{\alph}$}}}