用Python简单粗暴地算一下自己未来五年的经济状况

In [1]: # 导入必要的包(pandas是真的好用,我要吹爆)
   ...: import pandas as pd
   ...: import calendar

当前经济状况:

  1. 从2018年6月毕业开始工作,不再依赖父母。
  2. 目前算半个程序员,在基因检测行业做研发,主要工作是分析二代测序数据。
  3. 5年内几乎不太可能有买房之类的巨大的花销。

消费数据:

数据来自支付宝,电脑网页可以导出所有的交易记录,我导出了2018年5月31号到2019年3月2号的数据。

Notes:

  1. 支付宝数据下载下来是CSV格式的,里面有些诡异的Tab,这里已经提前处理了一下,并删除了涉及隐私的列。
  2. 微信的账单只能导出最近三个月的并且我没有导出成功,况且微信我用得很少,略去。
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))
用Python简单粗暴地算一下自己未来五年的经济状况_第1张图片
增长曲线-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))
用Python简单粗暴地算一下自己未来五年的经济状况_第2张图片
增长曲线-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))
用Python简单粗暴地算一下自己未来五年的经济状况_第3张图片
增长曲线-3

终于看到希望了,赶紧涨薪啊!!


三、信贷和理财

以下是本人目前的金融操作手段:

  1. 所有支出,在可以的情况下都使用花呗或信用卡支付。
  2. 所有手里的钱都放在余额宝等可以支持快赎的货币基金。
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))
用Python简单粗暴地算一下自己未来五年的经济状况_第4张图片
增长曲线-2

看看房价,感觉自己前途渺茫!

你可能感兴趣的:(用Python简单粗暴地算一下自己未来五年的经济状况)