In [1]: # 导入必要的包(pandas是真的好用,我要吹爆)
...: import pandas as pd
...: import calendar
当前经济状况:
- 从2018年6月毕业开始工作,不再依赖父母。
- 目前算半个程序员,在基因检测行业做研发,主要工作是分析二代测序数据。
- 5年内几乎不太可能有买房之类的巨大的花销。
消费数据:
数据来自支付宝,电脑网页可以导出所有的交易记录,我导出了2018年5月31号到2019年3月2号的数据。
Notes:
- 支付宝数据下载下来是CSV格式的,里面有些诡异的Tab,这里已经提前处理了一下,并删除了涉及隐私的列。
- 微信的账单只能导出最近三个月的并且我没有导出成功,况且微信我用得很少,略去。
In [2]: data = pd.read_excel('/Users/andy/Downloads/alipay_record_20190302_1106_1.xlsx')
In [3]: data.head()
Out[3]:
交易号 交易创建时间 金额(元) 收/支 交易状态
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['交易创建时间'].max() - data['交易创建时间'].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
...:
创建时间序列,为了方便,这里计算2019-2023这五年时间里的经济情况。
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
...:
因为我是研发人员,所以每个月的收入基本是固定的,因为五险一金什么的计算比较复杂就不算了。平时每个月5号发工资,银行卡到账都是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))
增长曲线-1
当前收入根本无法支撑自己的花销!!!当场破产!!
二、年终奖
按上面的算法,我早就破产了,但是实际上我还活得挺好,想来想去,原来是没算年终奖,按照今年的情况,年终奖按1W算。
In [14]: def income(date, money):
...: # 每月5号发工资
...: wage = 6000 if date.day == 5 else 0
...: # 每年2月发年终奖
...: 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))
增长曲线-2
过日子全靠年终奖啊!!
二、用发展的眼光看问题
offer中说,每年至少涨薪10%,支出也相应增长一半吧,简单粗暴。
In [18]: def income(date, money):
...: # 每个月5号发工资
...: wage = 6000 if date.day == 5 else 0
...: # 每年2月发年终奖
...: 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))
增长曲线-3
终于看到希望了,赶紧涨薪啊!!
三、信贷和理财
以下是本人目前的金融操作手段:
- 所有支出,在可以的情况下都使用花呗或信用卡支付。
- 所有手里的钱都放在余额宝等可以支持快赎的货币基金。
In [23]: def income(date, money):
...: # 简单粗暴假设万份收益0.75,这个年化利率不到3%,基本上是余额宝现在的收益
...: interest = money / 10000 * 0.75 * 0.8 if money > 0 else 0
...: # 每个月5号发工资
...: wage = 6000 if date.day == 5 else 0
...: # 每年2月发年终奖
...: 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))
增长曲线-2
看看房价,感觉自己前途渺茫!
网友评论