1

Pandas を使用して、代表的ではあるが架空の臨床試験タイプのデータをいくつか作成し、ReportLab でいくつかのテスト レポートを作成しました。

データには、治療列が「プラセボ」であるブロック (〜 50 行) と、治療が「有効」である同じ量があります。最初のセットには「治療グループ: プラセボ」、2 番目のセットには「治療グループ: 有効」という小見出しを使用してデータをリストしたいだけです。

同様のトピックにはいくつかのヒットがあり、実際に提案された手法の 1 つを使用しました。つまり、partialfromを使用してヘッダー関数の引数を拡張することfunctoolsです。

title1 = "ACME Corp                                                                                                              CONFIDENTIAL"
title2 = "XYZ123 / Anti-Hypertensive                                                                                                    Draft"
title3 = "Protocol XYZ123"

title4 = "Study XYZ123"
title5 = "Listing of Demographic Data by Treatment Arm"
title6 = "All subjects"
def title(canvas, doc, bytext):
    canvas.saveState()
    canvas.setFont(styleN.fontName, styleN.fontSize)
    canvas.drawString(DOCMARGIN, PAGE_HEIGHT*.975, title1)
    canvas.drawString(DOCMARGIN, PAGE_HEIGHT*.950, title2)
    canvas.drawString(DOCMARGIN, PAGE_HEIGHT*.925, title3)
    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT*.900, title4)
    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT*.875, title5)
    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT*.850, title6)
    canvas.drawString(DOCMARGIN, PAGE_HEIGHT*.825, "Treatment Group:" + bytext)
    canvas.restoreState()

これは、次のように呼び出されます。n_groups要約クエリからの 2 の値を持ち、0 は「プラセボ」にマップされ、1 はアクティブにマップされます。

def build_pdf(doc): 
    ptemplates = []
    for armcd in range(n_groups):
        ptemplates.append(PageTemplate(id = 'PT' + str(armcd), frames = [dataFrame,],
                     onPage = partial(title, bytext=t_dict[armcd]),
                     onPageEnd = foot))
    doc.addPageTemplates(ptemplates)

    elements = []
    for armcd in range(n_groups):
        elements.append(NextPageTemplate('PT' + str(armcd)))  
        sublist = [t for t in lista if t[0] == (armcd+1)]
        sublist.insert(0,colheads)
        data_table = Table(sublist, 6*[40*mm], len(sublist)*[DATA_CELL_HEIGHT], repeatRows=1)
        data_table.setStyle(styleC)
        elements.append(data_table)
        elements.append(PageBreak())
    doc.build(elements)

レポートは 6 ページで構成されます。プラセボ データの最初の 3 ページは正しく、アクティブ データのページ 5 と 6 は正しいですが、2 番目の「アクティブ」グループの最初のページであるはずの 4 ページには、サブタイトル「治療グループ: プラセボ」があります。

ステートメントの順序を何度も再編成しましたが、ページ 4 に正しくサブタイトルを付けることができません。ヘルプ、提案、または魔法をいただければ幸いです。

[編集 1: サンプル データ構造] データの「先頭」は次のように始まります。

[
   [1, 'Placebo', '000001-000015', '1976-09-20', 33, 'F', 'Black'],
   [1, 'Placebo', '000001-000030', '1959-04-26', 50, 'M', 'Asian'],
   [1, 'Placebo', '000001-000031', '1946-02-07', 64, 'F', 'Asian'],
   [1, 'Placebo', '000001-000046', '1947-11-08', 62, 'M', 'Asian'],

などを 50 行、次に続行します。

   [2, 'Active', '000001-000002', '1962-02-28', 48, 'F', 'Black'],
   [2, 'Active', '000001-000008', '1975-10-20', 34, 'M', 'Black'],
   [2, 'Active', '000001-000013', '1959-01-19', 51, 'M', 'White'],
   [2, 'Active', '000001-000022', '1962-01-12', 48, 'F', 'Black'],
   [2, 'Active', '000001-000036', '1976-10-17', 33, 'F', 'Asian'],
   [2, 'Active', '000001-000045', '1980-12-31', 29, 'F', 'White'],

さらに50回。

挿入される列ヘッダーは次のとおりです。

['Treatment Arm Code',
        'Treatment Arm',
        'Site ID - Subject ID',
        'Date of Birth',
        'Age (Years)',
        'Gender',
        'Ethnicity'],

[編集 2: 解決策 - を移動しPageBreak()て条件付きにする:]

def build_pdf(doc): 
    ptemplates = []
    for armcd in range(n_groups):
        ptemplates.append(PageTemplate(id = 'PT' + str(armcd), frames = [dataFrame,],
                     onPage = partial(title, bytext=t_dict[armcd]),
                     onPageEnd = foot))
    doc.addPageTemplates(ptemplates)

    elements = []
    for armcd in range(n_groups):     
        elements.append(NextPageTemplate('PT' + str(armcd)))
        if armcd > 0:
            elements.append(PageBreak())
        sublist = [t for t in lista if t[0] == (armcd+1)]
        sublist.insert(0,colheads)
        data_table = Table(sublist, 6*[40*mm], len(sublist)*[DATA_CELL_HEIGHT], repeatRows=1)
        data_table.setStyle(styleC)
        elements.append(data_table)

    doc.build(elements)
4

0 に答える 0