時系列データの補間と年ごとの合計

sum by year and insert missing entries with 0 – StackOverflow

%%writefile file
201703 5
201708 10
201709 20
201710 40
201711 80
201712 100
201802 0
201803 25
201804 50
201805 50
201806 150
201807 300
201808 200
201902 10 

というファイルがあった時,欠けている月のインデックスを補間して欠損値は0埋めしたい.そして,年ごとの合計を求めて,各年の末尾に結果が挿入された形のデータフレームを作成したい.メソッドチェーンを用いると,意外に楽に処理できる(処理するのが楽なのであって,他人がみた時に一見して分かり易いかどうかは分からないけど).

import pandas as pd
import numpy as np
from datetime import datetime


def d_parser(x):  return datetime.strptime(x, '%Y%m')


df = (
    pd.read_csv('file', sep='\s+', header=None, 
                index_col=0, parse_dates=[0], date_parser=d_parser)
    .asfreq('MS', fill_value=0)
    .pipe(lambda df: 
          df.set_index(df.index.strftime('%Y%m'))
            .append(df.groupby(df.index.year.astype(str)+'13').sum())
            .assign(index=lambda res: res.index.str.replace('13', ''))
            .sort_index()
            .set_index('index')
    )
)
df
    1
index   
201703  5
201704  0
201705  0
201706  0
201707  0
201708  10
201709  20
201710  40
201711  80
201712  100
2017    255
201801  0
201802  0
201803  25
201804  50
201805  50
201806  150
201807  300
201808  200
201809  0
201810  0
201811  0
201812  0
2018    775
201901  0
201902  10
2019    10

 
 
Awkの場合:

%%bash
time {
awk '
{a[$1]=$2;yy=substr($1,1,4);mm=substr($1,5,2)+0;sum[yy]+=$2} NR==1{b=yy}
b!=yy{for(m=min;mmm ? mm : min);max=(!max||max<mm ? mm : max)}
END{for(m=1;m<=mm;m++){k=sprintf("%s%02d",b,m);print k,(k in a ? a[k] : 0)}print b,sum[b]}
' file
}
201703 5
201704 0
201705 0
201706 0
201707 0
201708 10
201709 20
201710 40
201711 80
201712 100
2017 255
201801 0
201802 0
201803 25
201804 50
201805 50
201806 150
201807 300
201808 200
201809 0
201810 0
201811 0
201812 0
2018 775
201901 0
201902 10
2019 10

real    0m0.005s
user    0m0.001s
sys 0m0.003s
広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください