将statsmodels结果保存在Python中作为图像文件

ves*_*and 3 python statsmodels

我正在使用statsmodels进行OLS估算。可以在控制台中使用来研究结果print(results.summary())。我想将相同的表存储为.png文件。以下是带有可复制示例的代码段。

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())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我在这里使用建议进行了一些幼稚的尝试,但我怀疑我已经偏离目标了:

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

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

感谢您的任何建议!

sas*_*cha 7

这是一项非常不寻常的任务,您的方法有点疯狂。您正在尝试将字符串(在某些度量空间中没有位置)与某些图像(基于位置)组合在一起。

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

我尝试使用枕头,但效果很难看。可能是因为它非常有限,并且后期处理抗锯齿无法节省任何费用。但是也许我做错了。

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')
Run Code Online (Sandbox Code Playgroud)

当您使用statsmodels时,我假设您已经有了matplotlib。这也可以使用。这是一些方法,虽然还不完美,但还算不错(有些换行;我不知道为什么;编辑: OP设法通过使用等宽字体来修复了这些问题):

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')
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明

编辑: OP设法通过使用等宽字体来改进matplotlib方法!我将其合并到此处,并反映在输出图像中。

以此为演示,并研究python的文本呈现选项。也许可以改进matplotlib方法,但也许您需要使用pycairo这样的方法一些SO讨论

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

编辑:似乎你可以问statsmodels的乳胶表示。因此,我建议使用this,可能将其写入文件并使用子进程调用pdflatex或类似方法(此处采用类似方法)。matplotlib也可以使用乳胶(但是我不会像我目前在Windows上那样对其进行测试),但是在这种情况下,我们再次需要以某种方式调整文本与窗口的比例(例如,与使用某些A5格式的完整乳胶文档相比) 。

  • 当我尝试使用等距字体时,关于matplotlib的建议成功了:`plt.text(0.01,0.05,str(results1.summary()),{'fontsize':10},fontproperties ='monospace')`再次感谢! (2认同)