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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容