2017-10-10 83 views
1

OLSの見積もりを行うためにstatsmodelsを使用しています。結果は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アプローチを改善することができますが、多分pycairoのようなものを使う必要があります。 Some 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 = 'モノスペース') 'もう一度ありがとう! – vestland

+1

ああ、とても素敵です。私はまだフルラテックスと比較してこのアプローチをサブパルと考えています。しかし、あなたが必要とするものは誰が知っていますか? matplotlibのアプローチの欠点は、私が行ったような手動チューニングです。しかし、フォントのことに言及してくれてありがとう! – sascha

関連する問題