Как вернуть несколько латексных или орг-таблиц из исходного блока в режиме орг? - PullRequest
0 голосов
/ 28 августа 2018

Моя конкретная проблема заключается в том, что я часто использую исходные блоки python в режиме org для запуска одного и того же статистического анализа для множества переменных в фрейме данных, а затем представляю их в виде латексных таблиц. Каждый анализ становится очень утомительным, поэтому я хочу использовать цикл for:

#+begin_src python :exports results :session :results latex   
import pandas as pd   
df = pd.DataFrame({'a': [1, 2, 3, 4, 5],
                        'b': [9, 8, 7, 6, 5]})

for var in df.columns:
    df[var].value_counts().to_latex()
#+end_src

Проблема в том, что он возвращает только последнее значение, возвращаемое исходным блоком (последний запуск цикла for.

#+Results:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} &  b \\
\midrule
7 &  1 \\
6 &  1 \\
5 &  1 \\
9 &  1 \\
8 &  1 \\
\bottomrule
\end{tabular}
#+END_LaTeX

Так есть ли способ получить более одной латексной или орг-таблицы из исходного блока?

EDIT: Подумав над ответом @dschwilk, мне нужно вернуть несколько блоков результатов # + (по одному на каждую латексную или орг-таблицу), чтобы я мог добавить текстовые описания между ними. Такие как:

Description for table 1
#+RESULTS:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} &  a \\
\midrule
5 &  1 \\
4 &  1 \\
3 &  1 \\
2 &  1 \\
1 &  1 \\
\bottomrule
\end{tabular}
#+END_LaTeX

Description for table 2    
#+RESULTS:
\begin{tabular}{lr}
\toprule
{} &  b \\
\midrule
7 &  1 \\
6 &  1 \\
5 &  1 \\
9 &  1 \\
8 &  1 \\
\bottomrule
\end{tabular}
#+END_LaTeX

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Вы можете создать список и добавить к нему вывод латекса в каждом цикле:

latex_list=[]
for var in df.columns:
    latex_list.append(df[var].value_counts().to_latex())

Может быть, напечатать так:

for e in latex_list:
    print(e)
0 голосов
/ 29 августа 2018

Мне удалось получить что-то близкое к тому, что я хочу, но мне пришлось запустить несколько блоков src_blocks (которых я действительно хотел избежать).

У меня есть исходный блок, который создает все таблицы и сохраняет их в списке, создает новый src_block для каждой таблицы и возвращает его.

Например:

#+begin_src python :exports results :session :results silent)
  import pandas as pd
  results_tables = []
  d = pd.DataFrame({'a': [1, 2, 3, 4, 5],
                    'b': [9, 8, 7, 6, 5]})

  for var in d.columns:
      results_tables.append(d[var].value_counts().to_latex())
#+end_src

#+RESULTS:
#+begin_src python :exports results :session :results latex
results_tables[0]
#+end_src

#+RESULTS:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} &  a \\
\midrule
5 &  1 \\
4 &  1 \\
3 &  1 \\
2 &  1 \\
1 &  1 \\
\bottomrule
\end{tabular}
#+END_LaTeX

#+begin_src python :exports results :session :results latex
results_tables[1]
#+end_src

#+RESULTS:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} &  b \\
\midrule
7 &  1 \\
6 &  1 \\
5 &  1 \\
9 &  1 \\
8 &  1 \\
\bottomrule
\end{tabular}
#+END_LaTeX
0 голосов
/ 28 августа 2018

Будет ли работать вывод текста, который вы хотите в python? Например, собрать полученный LaTeX и добавить \table{} и \caption:

#+begin_src python :exports results :session :results latex   
import pandas as pd   
df = pd.DataFrame({'a': [1, 2, 3, 4, 5],
                        'b': [9, 8, 7, 6, 5]})

var_dict = {}
for var in df.columns:
    var_dict[var] = df[var].value_counts().to_latex()

res = '\n'.join(['\\begin{table}\n\\caption{Variable: %s} \n\n %s\n\end{table}' % (key, value) for (key, value) in var_dict.items()])
res
#+end_src

#+results:
#+BEGIN_EXPORT latex
\begin{table}
\caption{Variable: a} 

 \begin{tabular}{lr}
\toprule
{} &  a \\
\midrule
5 &  1 \\
4 &  1 \\
3 &  1 \\
2 &  1 \\
1 &  1 \\
\bottomrule
\end{tabular}

\end{table}
\begin{table}
\caption{Variable: b} 

 \begin{tabular}{lr}
\toprule
{} &  b \\
\midrule
7 &  1 \\
6 &  1 \\
5 &  1 \\
9 &  1 \\
8 &  1 \\
\bottomrule
\end{tabular}

\end{table}
#+END_EXPORT
...