2017-10-10 166 views
1

我使用statsmodels來進行OLS估計。結果可以在控制檯上使用print(results.summary())進行研究。我想存儲與.png文件相同的表格。下面是一個帶有可重複示例的片段。將statsmodels結果保存爲Python作爲圖像文件

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()) 

enter image description here

我做了使用建議here有些幼稚的嘗試,但我懷疑我遠離目標:

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

到目前爲止,這只是提出了一個很長的錯誤信息。

謝謝你的任何建議!

回答

3

這是一個非常不尋常的任務,你的方法有點瘋狂。您試圖將一個字符串(某些度量空間中沒有位置)與某個圖像(基於位置)組合在一起。

不管你做什麼,你需要一些文本的渲染引擎!

我試圖用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,我假設你已經有了。這個也可以使用。下面是一些方法,這是相當不錯,雖然不是完美的(一些線路的變化,我不知道爲什麼; 編輯: 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') 

輸出:

enter image description here

編輯: OP管理使用等寬的字體以提高matplotlib的方法!我將它結合在這裏,它反映在輸出圖像中。

以此作爲演示並研究python的文本渲染選項。也許matplotlib的方法可以改進,但也許你需要使用像pycairoSome SO-discussion

備註:在我的系統上,您的代碼確實會給出這些警告!

編輯:seems你可以問statsmodels一個乳膠表示。所以我推薦使用這個,可能寫這個文件並使用子進程調用pdflatex或類似的東西(這裏有一些similar approach)。 matplotlib也可以使用乳膠(但我不會測試它,因爲我目前在windows上),但在這種情況下,我們需要以某種方式再次調整文本到窗口的比例(與例如給定一些A5格式的完整乳膠文檔相比) 。

+0

謝謝!正如你所建議的那樣,我會直接進入文本渲染選項,看看我能做些什麼。 – vestland

+2

關於matplotlib的建議在我嘗試使用等間隔字體時做了一些技巧:'plt.text(0.01,0.05,str(results1。summary()),{'fontsize':10},fontproperties ='monospace')'再次感謝! – vestland

+1

啊,非常好。與全乳膠相比,我仍然認爲這種方法低於標準。但誰知道你需要什麼。 matplotlib方法的缺點是像我一樣手動調整。不過謝謝你提到的字體! – sascha