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

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

作者: yangmqglobe | 来源:发表于2019-03-15 21:27 被阅读0次
    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))
    
    增长曲线-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

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


    三、信贷和理财

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

    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))
    
    增长曲线-2

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/vcxdmqtx.html