4

私はここで答えに従っています:

パンダ: 年間データを重ねてプロットする方法

時系列を取得し、新しいプロットに各日の最後のデータ ポイントをプロットします。プロットの各線は、1 週間分のデータを表します (たとえば、1 週間あたり 5 つのデータ ポイント)。

ここに画像の説明を入力

これを行うには、次のコードを使用しました。

#Chart by last price
daily = ts.groupby(lambda x: x.isocalendar()[1:]).agg(lambda s: s[-1])
daily.index = pd.MultiIndex.from_tuples(daily.index, names=['W', 'D'])
dofw = "Mon Tue Wed Thu Fri Sat Sun".split()
grid = daily.unstack('D').rename(columns=lambda x: dofw[x-1])
grid[-5:].T.plot()

私がやりたいのは、1 日の最後のデータ ポイントで集計する代わりに、1 時間ごとに集計し (1 時間ごとのデータを平均化)、1 週間ごとのデータをグラフ化することです。そのため、グラフはリンクされた画像のものと似ていますが、1 行に 1 日あたり 1 つのデータ ポイントだけでなく、1 行に 1 日あたり 24 個のデータ ポイントがあります。

Pandas DataFrame をこの投稿に貼り付ける方法はありますか? コピーペーストをクリックすると、リストとして貼り付けられます

編集:

チャート化のために最新の週の不完全なデータを考慮した最終的なコード:

# First we read the DataFrame and resample it to get a mean on every hour
df = pd.read_csv(r"MYFILE.csv", header=None,
                 parse_dates=[0], index_col=0).resample('H', how='mean').dropna()
# Then we add a week field so we can filter it by the week
df['week']= df.index.map(lambda x: x.isocalendar()[1])
start_range = list(set(df['week']))[-3]
end_range = list(set(df['week']))[-1]
# Create week labels
weekdays = 'Mon Tue Wed Thu Fri Sat Sun'.split()

# Create the figure
fig, ax = plt.subplots()

# For every week we want to plot
for week in range(start_range,end_range+1):
    # Select out the week
    dfw = df[df['week'] == week].copy()
    # Here we align all the weeks to span over the same time period so they
    # can be shown on the graph one over the other, and not one next to
    # the other.
    dfw['timestamp'] = dfw.index.values - (week * np.timedelta64(1, 'W'))
    dfw = dfw.set_index(['timestamp'])
    # Then we plot our data
    ax.plot(dfw.index, dfw[1], label='week %s' % week)
    # Now to set the x labels. First we resample the timestamp to have
    # a date frequency, and set it to be the xtick values
    if week == end_range:
        resampled = resampled.index + pd.DateOffset(weeks=1)
    else:        
        resampled = dfw.resample('D')
   # newresampled = resampled.index + pd.DateOffset(weeks=1)
    ax.set_xticks(resampled.index.values)
    # But change the xtick labels to be the weekdays.
    ax.set_xticklabels(weekdays)
# Plot the legend
plt.legend()
4

2 に答える 2