In [1]: # 導(dǎo)入必要的包(pandas是真的好用慕购,我要吹爆)
...: import pandas as pd
...: import calendar
當前經(jīng)濟狀況:
- 從2018年6月畢業(yè)開始工作躬络,不再依賴父母尖奔。
- 目前算半個程序員搭儒,在基因檢測行業(yè)做研發(fā)穷当,主要工作是分析二代測序數(shù)據(jù)。
- 5年內(nèi)幾乎不太可能有買房之類的巨大的花銷淹禾。
消費數(shù)據(jù):
數(shù)據(jù)來自支付寶馁菜,電腦網(wǎng)頁可以導(dǎo)出所有的交易記錄,我導(dǎo)出了2018年5月31號到2019年3月2號的數(shù)據(jù)铃岔。
Notes:
- 支付寶數(shù)據(jù)下載下來是CSV格式的汪疮,里面有些詭異的Tab峭火,這里已經(jīng)提前處理了一下,并刪除了涉及隱私的列智嚷。
- 微信的賬單只能導(dǎo)出最近三個月的并且我沒有導(dǎo)出成功卖丸,況且微信我用得很少,略去盏道。
In [2]: data = pd.read_excel('/Users/andy/Downloads/alipay_record_20190302_1106_1.xlsx')
In [3]: data.head()
Out[3]:
交易號 交易創(chuàng)建時間 金額(元) 收/支 交易狀態(tài)
0 20190302335361374751 2019-03-02 10:29:38 0.21 收入 交易成功
1 2019030122001429751027790925 2019-03-01 18:17:54 20.00 支出 交易成功
2 20190301329976940751 2019-03-01 09:42:23 0.21 收入 交易成功
3 2019022822001429751027668747 2019-02-28 18:29:43 18.00 支出 交易成功
4 20190228326079942751 2019-02-28 06:38:13 0.21 收入 交易成功
計算總支出稍浆。
In [4]: data[data['收/支'] == '支出']['金額(元)'].sum()
Out[4]: 57645.51
計算平均支出。
In [5]: data[data['收/支'] == '支出']['金額(元)'].sum() / (data['交易創(chuàng)建時間'].max() - data['交易創(chuàng)建時間'].min()).days
Out[5]: 209.62003636363636
計算一天過去猜嘱,手里還有多少錢衅枫。
In [6]: def saving(times, expenses_func, income_func, init=0):
...: for date in times:
...: init = init - expenses_func(date) + income_func(date, init)
...: yield init
...:
創(chuàng)建時間序列,為了方便朗伶,這里計算2019-2023這五年時間里的經(jīng)濟情況弦撩。
In [7]: time_goes_by = pd.date_range(start='2019-01-01', end='2023-12-31')
In [8]: time_goes_by
Out[8]:
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
'2019-01-05', '2019-01-06', '2019-01-07', '2019-01-08',
'2019-01-09', '2019-01-10',
...
'2023-12-22', '2023-12-23', '2023-12-24', '2023-12-25',
'2023-12-26', '2023-12-27', '2023-12-28', '2023-12-29',
'2023-12-30', '2023-12-31'],
dtype='datetime64[ns]', length=1826, freq='D')
一、小試牛刀
上面計算了论皆,每天平均支出209+益楼,這里簡單粗暴地計算為每天支出210元。
In [9]: def expenses(date):
...: return 210
...:
因為我是研發(fā)人員点晴,所以每個月的收入基本是固定的偏形,因為五險一金什么的計算比較復(fù)雜就不算了。平時每個月5號發(fā)工資觉鼻,銀行卡到賬都是6000左右俊扭,簡單粗暴按6000處理。
In [10]: def income(date, money):
...: return 6000 if date.day == 5 else 0
...:
算一下每天過去后手上還有多少錢坠陈。
In [11]: money = pd.Series(saving(time_goes_by, expenses, income), index=time_goes_by, name='saving').to_frame()
In [12]: # 看下第一個星期和最后一個星期
...: money.head(7).append(pd.Series(data=['...'], index=['saving'], name='...')).append(money.tail(7))
Out[12]:
saving
2019-01-01 00:00:00 -210
2019-01-02 00:00:00 -420
2019-01-03 00:00:00 -630
2019-01-04 00:00:00 -840
2019-01-05 00:00:00 4950
2019-01-06 00:00:00 4740
2019-01-07 00:00:00 4530
... ...
2023-12-25 00:00:00 -22200
2023-12-26 00:00:00 -22410
2023-12-27 00:00:00 -22620
2023-12-28 00:00:00 -22830
2023-12-29 00:00:00 -23040
2023-12-30 00:00:00 -23250
2023-12-31 00:00:00 -23460
畫一下增長曲線萨惑。
In [13]: # 只畫每個月最后一天的情況
...: money.resample('MS').last().plot(figsize=(16, 10))
當前收入根本無法支撐自己的花銷!3鸱庸蔼!當場破產(chǎn)!贮匕!
二姐仅、年終獎
按上面的算法,我早就破產(chǎn)了刻盐,但是實際上我還活得挺好掏膏,想來想去,原來是沒算年終獎敦锌,按照今年的情況馒疹,年終獎按1W算。
In [14]: def income(date, money):
...: # 每月5號發(fā)工資
...: wage = 6000 if date.day == 5 else 0
...: # 每年2月發(fā)年終獎
...: bonus = 10000 if date.day == 5 and date.month == 2 else 0
...: return wage + bonus
...:
同樣算一下每天過去后手上還有多少錢乙墙。
In [15]: money = pd.Series(saving(time_goes_by, expenses, income), index=time_goes_by, name='saving').to_frame()
In [16]: # 看下第一個星期和最后一個星期
...: money.head(7).append(pd.Series(data=['...'], index=['saving'], name='...')).append(money.tail(7))
Out[16]:
saving
2019-01-01 00:00:00 -210
2019-01-02 00:00:00 -420
2019-01-03 00:00:00 -630
2019-01-04 00:00:00 -840
2019-01-05 00:00:00 4950
2019-01-06 00:00:00 4740
2019-01-07 00:00:00 4530
... ...
2023-12-25 00:00:00 27800
2023-12-26 00:00:00 27590
2023-12-27 00:00:00 27380
2023-12-28 00:00:00 27170
2023-12-29 00:00:00 26960
2023-12-30 00:00:00 26750
2023-12-31 00:00:00 26540
畫一下增長曲線颖变。
In [17]: money.resample('MS').last().plot(figsize=(16, 10))
過日子全靠年終獎吧!腥刹!
二马胧、用發(fā)展的眼光看問題
offer中說,每年至少漲薪10%衔峰,支出也相應(yīng)增長一半吧漓雅,簡單粗暴。
In [18]: def income(date, money):
...: # 每個月5號發(fā)工資
...: wage = 6000 if date.day == 5 else 0
...: # 每年2月發(fā)年終獎
...: bonus = 10000 if date.day == 5 and date.month == 2 else 0
...: # 每年收入增長10%
...: return (wage + bonus) * 1.1 ** (date.year - 2019)
...:
In [19]: def expenses(date):
...: # 每年支出增長5%
...: return 210 * 1.05 ** (date.year - 2019)
...:
再算一下每天過去后手上還有多少錢
In [20]: money = pd.Series(saving(time_goes_by, expenses, income), index=time_goes_by, name='saving').to_frame()
In [21]: # 看下第一個星期和最后一個星期
...: money.head(7).append(pd.Series(data=['...'], index=['saving'], name='...')).append(money.tail(7))
Out[21]:
saving
2019-01-01 00:00:00 -210
2019-01-02 00:00:00 -420
2019-01-03 00:00:00 -630
2019-01-04 00:00:00 -840
2019-01-05 00:00:00 4950
2019-01-06 00:00:00 4740
2019-01-07 00:00:00 4530
... ...
2023-12-25 00:00:00 78389.6
2023-12-26 00:00:00 78134.3
2023-12-27 00:00:00 77879.1
2023-12-28 00:00:00 77623.8
2023-12-29 00:00:00 77368.6
2023-12-30 00:00:00 77113.3
2023-12-31 00:00:00 76858.1
畫一下增長曲線朽色。
In [22]: money.resample('MS').last().plot(figsize=(16, 10))
終于看到希望了邻吞,趕緊漲薪啊:小抱冷!
三、信貸和理財
以下是本人目前的金融操作手段:
- 所有支出梢褐,在可以的情況下都使用花唄或信用卡支付旺遮。
- 所有手里的錢都放在余額寶等可以支持快贖的貨幣基金。
In [23]: def income(date, money):
...: # 簡單粗暴假設(shè)萬份收益0.75盈咳,這個年化利率不到3%耿眉,基本上是余額寶現(xiàn)在的收益
...: interest = money / 10000 * 0.75 * 0.8 if money > 0 else 0
...: # 每個月5號發(fā)工資
...: wage = 6000 if date.day == 5 else 0
...: # 每年2月發(fā)年終獎
...: bonus = 10000 if date.day == 5 and date.month == 2 else 0
...: # 每年收入增長10%
...: return (wage + bonus) * 1.1 ** (date.year - 2019) + interest
...:
In [24]: def expenses(date):
...: if date.day == 10: # 每月10號為花唄還款日,信用卡會更遲一些鱼响,簡單粗暴
...: last_month = date - pd.DateOffset(months=1)
...: # 需要還上個月的賬單
...: return calendar.monthlen(year=last_month.year, month=last_month.month) * 210 * 1.05 ** (date.year - 2019)
...: else:
...: return 0
...:
還是算一下每天過去后手上還有多少錢鸣剪,注意這里算法是有點問題的,因為其實第一個月是不需要還上個月的賬單的丈积,但是因為最后一個月的賬單我們也沒還筐骇,所以……簡單粗暴。
In [25]: money = pd.Series(saving(time_goes_by, expenses, income), index=time_goes_by, name='saving').to_frame()
In [26]: # 看下第一個星期和最后一個星期
...: money.head(7).append(pd.Series(data=['...'], index=['saving'], name='...')).append(money.tail(7))
Out[26]:
saving
2019-01-01 00:00:00 0
2019-01-02 00:00:00 0
2019-01-03 00:00:00 0
2019-01-04 00:00:00 0
2019-01-05 00:00:00 6000
2019-01-06 00:00:00 6000.36
2019-01-07 00:00:00 6000.72
... ...
2023-12-25 00:00:00 80663.6
2023-12-26 00:00:00 80668.4
2023-12-27 00:00:00 80673.3
2023-12-28 00:00:00 80678.1
2023-12-29 00:00:00 80683
2023-12-30 00:00:00 80687.8
2023-12-31 00:00:00 80692.7
畫一下增長曲線江滨。
In [27]: money.resample('MS').last().plot(figsize=(16, 10))
看看房價铛纬,感覺自己前途渺茫!