2016-06-29 1 views
2

私はマルチインデックスのデータフレームをpdfのレポートに含めることを試みています。私は素敵なテーブル出力をしたいと思います。 > HTML - - > PDFpandasデータフレームを画像またはpdf文書に保存して素敵なマルチインデックス表示

import pandas as pd 
    from IPython.display import HTML 
    import pdfkit 

    # df generation 
    df = pd.read_csv(path_to_csv, sep =',') 
    groupeddf = df.groupby('Cluster') 
    res = groupeddf.describe([0.05, 0.5, 0.95]) 
    res.index.rename(['Cluster', 'stats'], inplace=True) 

    res['Cluster'] = res.index.get_level_values('Cluster') 
    res['stats'] = res.index.get_level_values('stats') 
    populations = (res.iloc[(res.index.get_level_values('stats') == 'count'), \ 
                  0].values).tolist() 
    res['population'] = [populations[i] for i in res.index.labels[0].values()] 
    total_pop = sum(populations) 
    res['frequency'] =(res['population']/total_pop).round(3) 
    res.set_index(['Cluster', 'population','frequency', 'stats'], inplace=True) 



    res1 = res.iloc[(res.index.get_level_values('stats') == '5%') | 
    (res.index.get_level_values('stats') == 'mean') | 
    (res.index.get_level_values('stats') == '50%') | 
    (res.index.get_level_values('stats') == '95%')] 
    res1 = res1.round(2) 
    # saving the df  
    h = HTML(res1.to_html()) 
    my_file = open('test.html', 'w') 
    my_file.write(h.data) 
    my_file.close() 


    options = { 
     'orientation': 'Landscape' 
     } 
    with open('test.html') as f: 
     pdfkit.from_file(f, 'out.pdf', options=options) 

しかし、これは私たちにそれを困難にするpdfkitへの依存性を持っている

pandas.df:

私はこれらの2の解決策を発見しました。

! LaTeX Error: File `standalone.cls' not found. 

Type X to quit or <RETURN> to proceed, 
or enter a new name. (Default extension: cls) 
: - > TEX - > PDFしかし、私はラテックスに慣れていない、と私はこのエラーを取得する( Export a Pandas dataframe as a table imageで述べたように)

import pandas as pd 
    import os 
    # df generation    
    df = pd.read_csv(path_to_csv, sep =',') 
    groupeddf = df.groupby('Cluster') 
    res = groupeddf.describe([0.05, 0.5, 0.95]) 
    res.index.rename(['Cluster', 'stats'], inplace=True) 

    res['Cluster'] = res.index.get_level_values('Cluster') 
    res['stats'] = res.index.get_level_values('stats') 
    populations = (res.iloc[(res.index.get_level_values('stats') == 'count'), \ 
                  0].values).tolist() 
    res['population'] = [populations[i] for i in res.index.labels[0].values()] 
    total_pop = sum(populations) 
    res['frequency'] =(res['population']/total_pop).round(3) 
    res.set_index(['Cluster', 'population','frequency', 'stats'], inplace=True) 



    res1 = res.iloc[(res.index.get_level_values('stats') == '5%') | 
    (res.index.get_level_values('stats') == 'mean') | 
    (res.index.get_level_values('stats') == '50%') | 
    (res.index.get_level_values('stats') == '95%')] 
    res1 = res1.round(2) 
    res1.rename(columns=lambda x: x.replace('_', ' '), inplace=True)  

    #latex 
    template = r'''\documentclass[preview]{{standalone}} 
    \usepackage{{booktabs}} 
    \begin{{document}} 
    {} 
    \end{{document}} 
    ''' 

    with open("outputfile.tex", "wb") as afile: 
     afile.write(template.format(res1.to_latex())) 
    os.system("pdflatex outputfile.tex") 

私はpandas.dfを使用しようとしています理由です

pandas.df - > pdfを実行する際のエラーまたは標準的な方法についてのご意見はありますか?

答えて

2

私にとってうまくいくソリューション: パンダで> 0.17 私はpdflatexをインストールしました。私はそのようなbooktabs.sty、geography.styとpdflscape.styとしてラテックスパッケージをコピーし

import pandas as pd 
import os 
import math 

def save_summary_table_as_pdf(path_to_csv, path_to_output_folder): 
    pwd = os.getcwd() 
    df = pd.read_csv(path_to_csv, sep =',') 

    #data preparation 
    groupeddf = df.groupby('Cluster') 
    res = groupeddf.describe([0.05, 0.5, 0.95]) 
    res.index.rename(['Cluster', 'Stats'], inplace=True) 

    res['cluster'] = res.index.get_level_values('Cluster') 
    res['stats'] = res.index.get_level_values('Stats') 
    populations = (res.iloc[(res.index.get_level_values('Stats') == 'count'), \ 
                  0].values).tolist() 
    res['population'] = [populations[i] for i in res.index.labels[0].values()] 
    total_pop = sum(populations) 
    res['frequency'] =(res['population']/total_pop).round(3) 
    res.set_index(['cluster', 'population','frequency', 'stats'], inplace=True) 
    res1 = res.iloc[(res.index.get_level_values('stats') == '5%') | 
    (res.index.get_level_values('stats') == 'mean') | 
    (res.index.get_level_values('stats') == '50%') | 
    (res.index.get_level_values('stats') == '95%')] 
    res1 = res1.round(2) 
    res1.rename(columns=lambda x: x.replace('_', ' '), inplace=True) 

    #latex 
    nbpages = int(math.ceil(res1.shape[0]*1.0/40)) 

    templatetop = r'''\documentclass[a3paper, 5pt]{article} 
    \usepackage{booktabs} 
    \usepackage{pdflscape} 
    \usepackage[a4paper,bindingoffset=0.2in,% 
      left=0.25in,right=0.25in,top=1in,bottom=1in,% 
      footskip=.25in]{geometry} 
    \begin{document} 
    \begin{landscape} 
    \pagenumbering{gobble} 
    \oddsidemargin = 0pt 
    \hoffset = -0.25in 
    \topmargin = 1pt 
    \headheight = 0pt 
    \headsep = 0pt 
    ''' 
    templatebottom = ''' 
    \end{landscape} 
    \end{document} 
    ''' 
    output_folder_path_abs = path_to_output_folder 
    output_tex = os.path.join(output_folder_path_abs, 
    "clustering_summary_table.tex") 

    with open(output_tex, "wb") as afile: 
     afile.write(templatetop +'\n') 
     for i in range(0, nbpages): 
      afile.write(res1.iloc[(i*40):((i+1)*40), :].to_latex() +'\n' + 
               """\pagenumbering{gobble}""") 
     afile.write(templatebottom +'\n') 
    os.chdir(output_folder_path_abs) 
    os.system('pdflatex clustering_summary_table.tex') 
    os.chdir(pwd) 
    os.remove(output_tex) 
    os.remove(os.path.join(path_to_output_folder, 
              'clustering_summary_table.aux')) 
    os.remove(os.path.join(path_to_output_folder, 
              'clustering_summary_table.log')) 

if __name__ == "__main__": 
    print 'begin generate pdf table about clustering' 
    import argparse 
    parser = argparse.ArgumentParser() 
    parser.add_argument("path_to_csv") 
    parser.add_argument("outputfolder") 
    args = vars(parser.parse_args()) 
    filedir = os.path.abspath(os.path.dirname(__file__)) 
    output_folder_path_abs = os.path.abspath(args['outputfolder']) 
    input_folder_path_abs = os.path.abspath(args['path_to_csv']) 
    # copy the user package latex to the folder 
    os.system('scp ' 
    +os.path.abspath(os.path.join(filedir, 'userpackagelatex/booktabs.sty'))+ 
    ' ' +output_folder_path_abs) 
    os.system('scp ' 
    +os.path.abspath(os.path.join(filedir, 'userpackagelatex/geography.sty'))+ 
    ' ' +output_folder_path_abs) 
    os.system('scp ' 
    +os.path.abspath(os.path.join(filedir, 'userpackagelatex/pdflscape.sty'))+ 
    ' ' +output_folder_path_abs) 
    save_summary_table_as_pdf(input_folder_path_abs, output_folder_path_abs) 
    os.remove(os.path.join(output_folder_path_abs, 'booktabs.sty')) 
    os.remove(os.path.join(output_folder_path_abs, 'geography.sty')) 
    os.remove(os.path.join(output_folder_path_abs, 'pdflscape.sty')) 
0

もう1つの方法はマークダウンを使用することです。 df.to_html()を使用できます。これは、データフレームをhtmlテーブルに変換します。そこから、生成されたhtmlをマークダウンファイル(.md)に入れ、パッケージを使用してmarkdownをpdfに変換することができます。 https://www.npmjs.com/package/markdown-pdf

これは良い代替手段でしょうか?

+0

私が書いた最初のソリューション(DF - はHTML> - > PDFファイル)私のマシンで作業している、しかし、コードができません私がPDFkitをインストールする権利を持っていない遠方のマシンを走らせてください。私はmakedown-pdfと同じになると思う。だからこそ私は可能な限り依存関係を制限する必要があるのです。 –

+0

markdown-pdfはpdfのサイズを変更できないため、テーブルのみが含まれています – Chaoste

関連する問題