我正在使用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())
我已经使用建议here进行了一些幼稚的尝试,但是我怀疑我已经偏离目标了:
os.chdir('C:/images')
sys.stdout = open("model.png","w")
print(model.summary())
sys.stdout.close()
到目前为止,这只会引发非常长的错误消息。
感谢您的任何建议!
最佳答案
这是一项非常不寻常的任务,您的方法有点疯狂。您正在尝试将字符串(在某些度量空间中没有位置)与某些图像(基于绝对位置;至少对于基于像素的格式-> 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设法通过使用等宽字体来修复了这些问题):
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方法!我将其合并到这里,并反射(reflect)在输出图像中。
以此为演示,并研究python的文本渲染选项。也许可以改进matplotlib方法,但也许您需要使用类似pycairo的方法。 Some SO-discussion。
备注:在我的系统上,您的代码确实发出了这些警告!
编辑:这是seems,您可以向statsmodels询问 latex 表示形式。因此,我建议使用此,可能将其写入文件并使用子进程来调用pdflatex或类似的东西(此处为similar approach)。 matplotlib也可以使用 latex (但是我不会像我目前在Windows上那样对其进行测试),但是在这种情况下,我们再次需要以某种方式调整文本与窗口的比例(例如,与使用某些A5格式的完整 latex 文档相比) 。
关于Python:如何将statsmodels结果保存为图像文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46664082/