やりたいこと
下記のように、工事一覧と支払い一覧のデータがあります。
- 工事一覧
code | name | complete_date | month_end |
---|---|---|---|
1 | A工事 | 2018/10/2 | 2018/10/31 |
2 | B工事 | 2018/11/2 | 2018/11/30 |
3 | C工事 | 2018/12/2 | 2018/12/31 |
codeは工事番号、nameは工事名、complete_dateは完成日、month_endは完成日の月末です。
- 支払い一覧
|date|code|amount|month_end|
|:--|:--:|--:|
|2018/10/10|1|100000|2018/10/31|
|2018/10/10|2|200000|2018/10/31|
|2018/10/10|3|400000|2018/10/31|
|2018/11/10|1|300000|2018/11/30|
|2018/11/10|2|400000|2018/11/30|
|2018/11/10|3|500000|2018/11/30|
|2018/12/10|1|300000|2018/12/31|
|2018/12/10|2|200000|2018/12/31|
|2018/12/10|3|400000|2018/12/31|
dateは支払日、codeは工事番号、amountは支払金額、month_endは支払日の月末です。
工事が完成するまでは、支払金額は未成工事支出金という勘定科目に記帳します。
月末に、完成した工事について、月末時点の未成工事支出金残高を、完成工事原価に振り替えます。
工事別に、当該月末に振り替えるべき完成工事原価の金額を算出したいです。
今までは、エクセルで管理していたので、sumifs関数を用いて下記のような表を作って集計していました。
表の形は、どうであれ、月毎、工事毎のtransferの金額が分かれば大丈夫です。
- 未成工事支出金一覧
code | name | index | 2018/10/31 | 2018/11/30 | 2018/12/31 |
---|---|---|---|---|---|
1 | A工事 | start | 0 | 0 | 0 |
1 | A工事 | increase | 100000 | 300000 | 300000 |
1 | A工事 | transfer | -100000 | -300000 | -300000 |
1 | A工事 | end | 0 | 0 | 0 |
2 | B工事 | start | 0 | 200000 | 0 |
2 | B工事 | increase | 200000 | 400000 | 200000 |
2 | B工事 | transfer | 0 | -600000 | -200000 |
2 | B工事 | end | 200000 | 0 | 0 |
3 | C工事 | start | 0 | 400000 | 900000 |
3 | C工事 | increase | 400000 | 500000 | 400000 |
3 | C工事 | transfer | 0 | 0 | -1300000 |
3 | C工事 | end | 400000 | 900000 | 0 |
startが月初残高、increaseが当月支払金額、transferが完成工事原価振替金額、endが月末残高です。
コード
下記のように途中までは作っています。
python
1import pandas as pd 2# 工事一覧 3site_list_df = pd.DataFrame([ 4 [1, 'A工事', '2018-10-2'], 5 [2, 'B工事', '2018-11-2'], 6 [3, 'C工事', '2018-12-2'] 7], columns=['code', 'name', 'complete_date']) 8site_list_df['complete_date'] = pd.to_datetime(site_list_df['complete_date']) 9 10#支払い一覧 11cost_list_df = pd.DataFrame([ 12 ['2018/10/10', 1, 100000, '2018/10/31'], 13 ['2018/10/10', 2, 200000, '2018/10/31'], 14 ['2018/10/10', 3, 400000, '2018/10/31'], 15 ['2018/11/10', 1, 3000000, '2018/11/30'], 16 ['2018/11/10', 2, 4000000, '2018/11/30'], 17 ['2018/11/10', 3, 5000000, '2018/11/30'], 18 ['2018/12/10', 1, 3000000, '2018/12/31'], 19 ['2018/12/10', 2, 2000000, '2018/12/31'], 20 ['2018/12/10', 3, 400000, '2018/12/31'], 21], columns=['cost_date', 'code', 'amount', 'month_end']) 22 23# 下記のようにpivot_tableを使えば、月毎、工事毎の支払金額(increase)は集計できました。 24df = pd.pivot_table(cost_list_df, index='code', columns='month_end', aggfunc=np.sum).fillna(0) 25
上記まではやってみたのですが、この後、どのようなコードを書けば集計できるのか分かりません。
pd.MultiIndexを使えば良いのかなど、考えてみたのですが、分かりません。
もし、お分かりの方見えましたら、ご教示頂ければ幸いです。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー