Python:直观地查看某个物品使用一段时间之后每天的平摊价格

简介: 买了一副眼镜,花了 800 块钱,感觉很贵,然后我在心里突然思考,这个眼镜如果买了一天就不见了,那么相当于我这一天使用的成本是 800 块钱。如果使用了 4 天之后才不见,那么我这四天每天使用的成本就是 200 块钱。也就是说如果这一副眼镜我用的时间越多,每天所花费的使用成本就越低。那么我想要每天的使用成本低于 5 毛钱,至少要花费多少时间呢?

1、问题

买了一副眼镜,花了 800 块钱,感觉很贵,然后我在心里突然思考,这个眼镜如果买了一天就不见了,那么相当于我这一天使用的成本是 800 块钱。如果使用了 4 天之后才不见,那么我这四天每天使用的成本就是 200 块钱。也就是说如果这一副眼镜我用的时间越多,每天所花费的使用成本就越低。那么我想要每天的使用成本低于 5 毛钱,至少要花费多少时间呢?

带着这个问题,我用 Python 写了一个简单的程序,使用 Matplotlib 来可视化,很直观地就看到要花多少时间才能够每天的平摊价格达到自己可接受的程度。

PriceOverDays.png

可以看到至少要使用 4 年半,才可以使得每天的使用成本低于 0.5 元。也就是说,我要好好地保养买的这个眼镜,至少要保证可以用到 4.5 年才行。

2、代码

下面是画出上面这个图的 Python 代码:

# 计算一个价格为 price 的物件, 在使用了 days 之后
# 平摊到每天所花的价格是多少. 
# 例如一副眼镜是 800 元, 在第二天的时候平摊价格为 400 元/天
# 到第四天的时候平摊价格为 200 元/天. 有的时候我们想要知道
# 用到多少天的时候这个眼镜的平摊价格才能降到 0.5 元/天
import numpy as np
import matplotlib.pyplot as plt
price = 800  # 物品的价格
expected_prices = 0.5  # 预期可接受的平摊价格
max_day = int(price / expected_prices * 1.5)  # 画出的最大时间为两年
amortized_prices = [price / day for day in range(1, max_day + 1)]
day_hit_expected = 0  # 达到预期平摊价格的天数
for i in range(max_day):
    if amortized_prices[i] < expected_prices:
        day_hit_expected = i + 1
        break

# 每隔多少天设为一个区间单位, 用于画出多个虚线, 更加直观地看到自己关心经过饿了多少个时间区间
# 例如设定为 365 年的话可以看到大概要经过多少年才能达到自己预测可接受的平摊价格
bins_days = 365
bins_label = 'Year'  # 相对地替换成自己所设定的天数代表的意思 

xs = np.linspace(1, max_day, max_day)
plt.plot(xs, amortized_prices)
# axline 用于画一条无限长的线, 在这里用来标出一条代表达到 expected prices 的虚线
plt.axhline(expected_prices,
           linestyle='--', linewidth=0.75, color='black')
for i in range(1, int(max_day / bins_days) + 1):
    plt.axvline(i * bins_days,
                linestyle='--', linewidth=0.75, color='orange')
plt.xlim(0, max_day)
plt.yscale('log')

# 改变一下坐标轴的显示, 以 bins_days 作为单位
old_xticks = [i * bins_days for i in range(int(max_day / bins_days) + 1)]
new_xticks = [i for i in range(int(max_day / bins_days) + 1)]
plt.xticks(old_xticks, new_xticks)

# 标出达到可接受平摊价格时的天数以及价格
annotate = "{:.2f}¥ on day {}".format(amortized_prices[day_hit_expected], day_hit_expected)
point_pos = (day_hit_expected, amortized_prices[day_hit_expected])
text_pos = (point_pos[0] * 1.05, point_pos[1] * 1.55)
plt.annotate(annotate,
             xy=point_pos, xytext=text_pos,
             arrowprops=dict(facecolor='k', width=0.5, headwidth=5, headlength=5))

plt.xlabel(bins_label)
plt.ylabel('Yuan')
plt.show()

对于 Matplotlib 有一些好用的函数可以讲一下:

  • plt.axline 用于画直线(无限长的线)的函数:**kwargs 是指定 2D 曲线的属性,比如线宽(linewidth)、颜色(color)、线型(linestyle)。

    • plt.axline(xy1, xy2=None, *, slope=None, **kwargs):其中 xy1 为直线通过的第一个点,xy2 为第二个点,也可以不提供第二个点而是提供斜率 slope
    • plt.axhline(y=0, xmin=0, xmax=1, **kwargs):画一条值在 y 的平行线,xminxmax 的值指定为 0 到 1 之间,其中 0 是图的最左边,1 是图的最右边;
    • plt.axvline(x=0, ymin=0, ymax=1, **kwargs):画一条值在 x 的平行线,yminymax 的值指定为 0 到 1 之间,其中 0 是图的最底端,1 是图的最上端。
  • plt.annotate(text, xy, xytext=None, ..., arrowprops=None) 用于画出注释的函数:text 是注释的内容,xy 是注释指向的点的位置,xytext 是注释文本的位置,arrowprops 是指定箭头格式(arrowstyle)的一个字典(dict);
  • plt.xticks(ticks=None, labels=None, *, minor=False, **kwargs) 改变坐标显示刻度:ticks 为要替换的原刻度,labels 为新的刻度,如果将 ticks 设为空则代表不显示坐标刻度。minor 如果为 False 代表设定主坐标轴,为 True 代表设定次坐标轴。

在本文的代码中将原来表示天数的刻度 old_xticks 替代为代表年的 new_xticks

目录
相关文章
|
20天前
|
数据采集 数据可视化 vr&ar
Python3实现基于ARIMA模型来预测茅台股票价格趋势
Python3实现基于ARIMA模型来预测茅台股票价格趋势
89 0
|
20天前
|
索引 Python
python实战案例之寻找物品
python实战案例之寻找物品
|
20天前
|
机器学习/深度学习 算法 算法框架/工具
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
|
20天前
|
机器学习/深度学习 数据采集 算法
【Python机器学习专栏】使用机器学习预测股票价格
【4月更文挑战第30天】本文探讨了使用Python和机器学习预测股票价格的方法,包括数据收集(如开盘价、收盘价等)、预处理(缺失值填充、异常值处理、标准化)、特征选择(技术指标、基本面指标、市场情绪)和工程、模型选择(线性回归、SVM、神经网络等)、训练与调优。模型评估涉及准确率、召回率等指标,并强调实际应用中需考虑多种因素,未来研究可探索深度学习的应用及数据质量与安全。
|
20天前
|
数据可视化 数据处理 索引
Python用GARCH对ADBL股票价格时间序列趋势滚动预测、损失、可视化分析
Python用GARCH对ADBL股票价格时间序列趋势滚动预测、损失、可视化分析
|
20天前
|
机器学习/深度学习 数据采集 数据可视化
python用回归、arima、随机森林、GARCH模型分析国债期货波动性、收益率、价格预测
python用回归、arima、随机森林、GARCH模型分析国债期货波动性、收益率、价格预测
|
20天前
|
机器学习/深度学习 算法 算法框架/工具
PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
|
20天前
|
机器学习/深度学习 测试技术 TensorFlow
PYTHON用RNN神经网络LSTM优化EMD经验模态分解交易策略分析股票价格MACD
PYTHON用RNN神经网络LSTM优化EMD经验模态分解交易策略分析股票价格MACD
|
20天前
|
数据可视化 Python Windows
PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据
PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据
|
20天前
|
机器学习/深度学习 自然语言处理 TensorFlow
Python TensorFlow循环神经网络RNN-LSTM神经网络预测股票市场价格时间序列和MSE评估准确性
Python TensorFlow循环神经网络RNN-LSTM神经网络预测股票市场价格时间序列和MSE评估准确性