【问题标题】:Python: How to save statsmodels results as image file?Python:如何将 statsmodels 结果保存为图像文件?
【发布时间】:2017-10-10 10:08:47
【问题描述】:

我正在使用 statsmodels 进行 OLS 估计。可以使用print(results.summary()) 在控制台中研究结果。我想将同一张表存储为 .png 文件。下面是一个带有可重现示例的 sn-p。

import pandas as pd
import numpy as np
import matplotlib.dates as mdates
import statsmodels.api as sm

# Dataframe with some random numbers
np.random.seed(123)
rows = 10
df = pd.DataFrame(np.random.randint(90,110,size=(rows, 2)), columns=list('AB'))
datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist()
df['dates'] = datelist 
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)
print(df)

# OLS estimates using statsmodels.api
x = df['A']
y = df['B']

model = sm.OLS(y,sm.add_constant(x)).fit()

# Output
print(model.summary())

我使用建议 here 进行了一些天真的尝试,但我怀疑我偏离了目标:

os.chdir('C:/images')
sys.stdout = open("model.png","w")
print(model.summary())
sys.stdout.close()

到目前为止,这只会引发很长的错误消息。

感谢您的任何建议!

【问题讨论】:

    标签: python statsmodels


    【解决方案1】:

    这是一项非常不寻常的任务,您的方法有点疯狂。您正在尝试将字符串(在某些度量空间中没有位置)与某些图像(基于绝对位置;至少对于基于像素的格式 -> png、jpeg 和 co。)组合。

    无论你做什么,你都需要一些文本渲染引擎!

    我尝试使用pillow,但结果很难看。可能是因为它非常有限,并且后处理抗锯齿并没有节省任何东西。但也许我做错了什么。

    from PIL import Image, ImageDraw, ImageFont
    image = Image.new('RGB', (800, 400))
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype("arial.ttf", 16)
    draw.text((0, 0), str(model.summary()), font=font)
    image = image.convert('1') # bw
    image = image.resize((600, 300), Image.ANTIALIAS)
    image.save('output.png')
    

    当您使用 statsmodels 时,我假设您已经获得了 matplotlib。这个也可以用。这是一些方法,虽然不完美(一些换行;我不知道为什么;编辑: OP 设法通过使用等宽字体修复这些): p>

    import matplotlib.pyplot as plt
    plt.rc('figure', figsize=(12, 7))
    #plt.text(0.01, 0.05, str(model.summary()), {'fontsize': 12}) old approach
    plt.text(0.01, 0.05, str(model.summary()), {'fontsize': 10}, fontproperties = 'monospace') # approach improved by OP -> monospace!
    plt.axis('off')
    plt.tight_layout()
    plt.savefig('output.png')
    

    输出:

    编辑: OP 设法通过使用等宽字体改进了 matplotlib 方法!我在这里合并了它,它反映在输出图像中。

    将此作为演示并研究 python 的文本渲染选项。也许 matplotlib-approach 可以改进,但也许你需要使用类似pycairo 的东西。 Some SO-discussion.

    备注:在我的系统上,您的代码确实会发出这些警告!

    编辑: seems 你可以向 statsmodels 询问乳胶表示。所以我推荐使用这个,可能将它写入一个文件并使用子进程调用 pdflatex 或类似的东西(这里是一些similar approach)。 matplotlib 也可以使用乳胶(但我不会测试它,因为我目前在 Windows 上)但在这种情况下,我们再次需要以某种方式调整文本与窗口的比率(与给定某些 A5 格式的完整乳胶文档相比) .

    【讨论】:

    • 谢谢!正如您所建议的,我将直接研究文本渲染选项,看看我能做些什么。
    • 当我尝试使用等间距字体时,您对 matplotlib 的建议起到了作用:plt.text(0.01, 0.05, str(results1.summary()), {'fontsize': 10}, fontproperties = 'monospace') 再次感谢!
    • 啊,很好。与全乳胶相比,我仍然认为这种方法低于标准。但谁知道你需要什么。 matplotlib 方法的缺点是像我一样手动调整。但是感谢您提到字体!
    • 我正在使用 matplotlib 对一堆变量之间的关系进行可视化。然后我将绘图保存为 png 文件,并将它们放入 PowerPoint 演示文稿中。使用您的 matplotlib 建议,我可以在带有绘图的幻灯片之后对实际模型结果做同样的事情。所以这是对我现有工作流程的一个非常有价值的补充。简单但有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-10-12
    • 2019-01-04
    • 2011-03-01
    相关资源
    最近更新 更多