Tricks to make saving images quicker?
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 20/100
- issue の種類
- 機能追加
- 明瞭さ
- 説明が足りない
- 活発さ
- 停滞
- 技術スタック
- python
調査の方向性
pre_outcome_chart 関数から始め、10k-image ワークロードで pd.read_csv、fplt.plot、plt.savefig にかかる時間を測定します。現在のループと提案されている multiprocessing アプローチを比較し、生成されるチャートを変更せずに、保存にかかる合計時間が測定可能かつ再現可能な形で短縮されることを完了の定義とします。
索引モデルが issue の本文から書いたものです。
説明
I am using a friends script (so I don't know all the details in this script), but I wonder if there are simple tricks I can do here to make it save quicker.
I want to be able to save around 10k images.
I plan to incorporate multiprocessing to make it even quicker.
Thank you.
def pre_outcome_chart(month, save_dir, sample_df, test = True):
if test:
sample_df = sample_df.sample(100)
for index, row in sample_df.iterrows():
ticker = row['ticker']
input_date = row['entry_date']
#nput_date_string = input_date.strftime('%Y-%m-%d')
startDate = pd.to_datetime(input_date).date() - relativedelta(months=month)
endDate = pd.to_datetime(input_date).date() + relativedelta(days =1)
startDateString = startDate.strftime('%Y%m%d')
endDateString = endDate.strftime('%Y%m%d')
filename = os.path.join(DATA_DIR, ticker + '.csv')
df = pd.read_csv(filename, index_col=0, parse_dates=True)
dt_range = pd.date_range(start=startDate, end=endDate)
df = df[df.index.isin(dt_range)]
# Drop any rows with missing data
df.dropna(inplace=True)
# Compute moving averages
df['SMA50'] = df['Close'].rolling(window=50, min_periods=1).mean()
df['SMA100'] = df['Close'].rolling(window=100, min_periods=1).mean()
df['SMA200'] = df['Close'].rolling(window=200, min_periods=1).mean()
# Define addplots
ema10 = fplt.make_addplot(df['Close'].ewm(span=10, min_periods=1).mean(), color='#CBC3E3')
ema20 = fplt.make_addplot(df['Close'].ewm(span=20, min_periods=1).mean(), color='#87CEEB')
sma50 = fplt.make_addplot(df['SMA50'], color='red')
sma100 = fplt.make_addplot(df['SMA100'], color='yellow')
sma200 = fplt.make_addplot(df['SMA200'], color='white')
# Define market colors and style
mc = fplt.make_marketcolors(up='black',down='#f76757',
edge={'up': '#13eda4', 'down': '#f76757'},
wick={'up': '#13eda4', 'down': '#f76757'},
volume={'up': '#13eda4', 'down': '#f76757'},
)
s = fplt.make_mpf_style(marketcolors=mc,facecolor='black',figcolor='black',
gridcolor='gray',
gridstyle='dotted',
rc={'xtick.color':'white',
'ytick.color':'white',
'axes.labelcolor':'white',
'text.color':'white',
'axes.edgecolor': 'gray',
'grid.alpha': 0.7,
'grid.linewidth': 0.5,
})
# Plot the data
fig, axlist = fplt.plot(
df,
type='candle',
addplot=[ema10, ema20, sma50, sma100, sma200],
style=s,
figsize=(12,6),
update_width_config={'candle_linewidth':1.0, 'candle_width':0.525, 'volume_width': 0.525},
tight_layout=True,
volume=True,
ylabel='Price',
xrotation=0,
returnfig=True
)
# Add legend
ax = axlist[0]
legend_handles = [ax.lines[i] for i in range(len(ax.lines))]
legend_labels = ['EMA10', 'EMA20', 'SMA50', 'SMA100', 'SMA200']
ax.legend(legend_handles, legend_labels)
# Get the index of the input_date candle
input_date_index = df.index.get_loc(pd.to_datetime(input_date, format='%Y-%m-%d').floor('D'))
# Get the coordinates of the input_date candle
x_coord = input_date_index
y_coord = df['High'].iloc[input_date_index]
# Calculate the maximum value of the chart
chart_max = max(df['High'].max(), df[['SMA50', 'SMA100', 'SMA200']].max().max())
# Calculate the maximum range of the chart
chart_range = df['High'].max() - df['Low'].min()
# Calculate the desired arrow length as a fraction of the maximum range
arrow_length_fraction = 0.1 # Adjust this value to control the arrow length
arrow_length = arrow_length_fraction * chart_range
# Calculate the desired gap size
gap_size = arrow_length
# Adjust the ylim to create the gap
axlist[0].set_ylim(df['Low'].min(), 1.2 * df['High'].max() + gap_size)
# Annotate the input_date above the input_date candle
axlist[0].annotate('',
xy=(x_coord, y_coord),
xytext=(x_coord, y_coord+arrow_length),
arrowprops=dict(arrowstyle='->', color='yellow', linewidth=3),
color='yellow', ha='center', va='bottom')
# Add the date tag at the top of the chart
ax.annotate(ticker + ' ' + pd.to_datetime(input_date).date().strftime('%Y-%m-%d'),
xy=(x_coord, y_coord),
xytext=(x_coord, chart_max+arrow_length),
color='yellow', ha='center', va='bottom')
# Save chart
plt.savefig(
f"{save_dir}/"
+ f"{ticker}_"
+ input_date
+ 'M_'
+ '.png', dpi=300, bbox_inches='tight')
plt.close(fig)`
- 主要言語
- Python
- スター
- 4.4k
- フォーク
- 678
- PR マージ指標
- 30日以内にマージされた PR はありません
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
matplotlib/mplfinance のほかの issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
matplotlib/mplfinance#672 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 10/100
matplotlib/mplfinance#700 ·
-
enhancement
難易度 5/5 1週間以上 初心者へのやさしさ 30/100
matplotlib/mplfinance#695 ·
-
question
難易度 3/5 1〜2日 初心者へのやさしさ 25/100
matplotlib/mplfinance#691 · コメント 1 件 ·
-
question
難易度 4/5 3〜5日 初心者へのやさしさ 52/100
matplotlib/mplfinance#690 · コメント 5 件 ·
matplotlib/mplfinance の issue をすべて見る
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
stephrobert/dsoxlab#238 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
sublimehq/package_control#1780 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
nwg-piotr/nwg-displays#145 ·