本文目录一览:
- 1、python如何对时间序列
- 2、python中时间序列数据的一些处理方式
- 3、python时间序列(2)
- 4、python中两列金融时间序列数据,怎么对时间相同的数据做运算
- 5、用Python预测「周期性时间序列」的正确姿势
python如何对时间序列
import time
t = "2017-11-24 17:30:00"
#将其转换为时间数组
timeStruct = time.strptime(t, "%Y-%m-%d %H:%M:%S")
#转换为时间戳:
timeStamp = int(time.mktime(timeStruct))
print(timeStamp)
python中时间序列数据的一些处理方式
datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象。
利用以下数据进行说明:
如果我们发现时间相关内容的变量为int,float,str等类型,不方便后面的分析,就需要使用该函数转化为常用的时间变量格式:pandas.to_datetime
转换得到的时间单位如下:
如果时间序列格式不统一,pd.to_datetime()的处理方式:
当然,正确的转换是这样的:
第一步:to_datetime()
第二步:astype(datetime64[D]),astype(datetime64[M])
本例中:
order_dt_diff必须是Timedelta('0 days 00:00:00')格式,可能是序列使用了diff()
或者pct_change()。
前者往往要通过'/np.timedelta'去掉单位days。后者其实没有单位。
假如我们要统计某共享单车一天内不同时间点的用户使用数据,例如
还有其他维度的提取,年、月、日、周,参见:
Datetime properties
注意 :.dt的对象必须为pandas.Series,而不可以是Series中的单个元素
python时间序列(2)
时期(period)表示的是时间区间,比如数日、数月、数季、数年等。Period类所 表示的就是这种数据类型,其构造函数需要用到一个字符串或整数,以及表11-4中 的频率:
这里,这个Period对象表示的是从2007年1月1日到2007年12月31日之间的整段时间。
只需对Period对象加上或减去一个整数即可达到根据其频率进行位移的效果:
如果两个Period对象拥有相同的频率,则它们的差就是它们之间的单位数量:
period_range函数可用于创建规则的时期范围:
PeriodIndex类保存了一组Period,它可以在任何pandas数据结构中被用作轴索引:
如果你有一个字符串数组,你也可以使用PeriodIndex类:
Period和PeriodIndex对象都可以通过其asfreq方法被转换成别的频率。假设我们有 一个年度时期,希望将其转换为当年年初或年末的一个月度时期。该任务非常简 单:
你可以将Period('2007','A-DEC')看做一个被划分为多个月度时期的时间段中的游 标。图11-1对此进行了说明。
对于一个不以12月结束的财政年度,月度子时期的归属情况就不一样了:
在将高频率转换为低频率时,超时期(superperiod)是由子时期(subperiod)所 属的位置决定的。例如,在A-JUN频率中,月份“2007年8月”实际上是属于周期“2008年”的:
完整的PeriodIndex或TimeSeries的频率转换方式也是如此:
这里,根据年度时期的第一个月,每年的时期被取代为每月的时期。
如果我们想要 每年的最后一个工作日,我们可以使用“B”频率,并指明想要该时期的末尾:
未完待续。。。
python中两列金融时间序列数据,怎么对时间相同的数据做运算
数据先导入,通常用csv。 然后是时间格式转换用time.strptime 转换完的时间可以直接取到hour,miniute,等属性,你直接按hour做当天平均值,再做月份的平均值。(其实可以一直计算,不用分开算)
用Python预测「周期性时间序列」的正确姿势
公司平台上有不同的api,供内部或外部调用,这些api承担着不同的功能,如查询账号、发版、抢红包等等。日志会记录下每分钟某api被访问了多少次,即一个api每天会有1440条记录(1440分钟),将每天的数据连起来观察,有点类似于股票走势的意思。我想通过前N天的历史数据预测出第N+1天的流量访问情况,预测值即作为合理参考,供新一天与真实值做实时对比。当真实流量跟预测值有较大出入,则认为有异常访问,触发报警。
我放了一份样例数据在data文件夹下,
看一下数据大小和结构
画图看一下序列的走势:(一些画图等探索类的方法放在了test_stationarity.py 文件中,包含时间序列图,移动平均图,有兴趣的可以自己尝试下)。
看这糟心的图,那些骤降为0的点这就是我遇到的第一个坑,我当初一拿到这份数据就开始做了。后来折腾了好久才发现,那些骤降为0的点是由于数据缺失,ETL的同学自动补零造成的,沟通晚了(TДT)。
把坑填上,用前后值的均值把缺失值补上,再看一眼:
发现这份数据有这样几个特点,在模型设计和数据预处理的时候要考虑到:
前六天的数据做训练,第七天做测试集。
消除数据的毛刺,可以用移动平均法,我这里没有采用,因为我试过发现对于我的数据来说,移动平均处理完后并不能使数据平滑,我这里采用的方法很简单,但效果还不错:把每个点与上一点的变化值作为一个新的序列,对这里边的异常值,也就是变化比较离谱的值剃掉,用前后数据的均值填充,注意可能会连续出现变化较大的点:
平滑后的训练数据:
采用statsmodels工具包:
对分解出来的趋势部分单独用arima模型做训练:
预测出趋势数据后,加上周期数据即作为最终的预测结果,但更重要的是,我们要得到的不是具体的值,而是一个合理区间,当真实数据超过了这个区间,则触发报警,误差高低区间的设定来自刚刚分解出来的残差residual数据:
预测并完成最后的加法处理,得到第七天的预测值即高低置信区间:
对第七天作出预测,评估的指标为均方根误差rmse,画图对比和真实值的差距:
可以看到,均方根误差462.8,相对于原始数据几千的量级,还是可以的。测试数据中的两个突变的点,也超过了置信区间,能准确报出来。
前文提到不同的api形态差异巨大,本文只展示了一个,我在该项目中还接触了其他形态的序列,有的有明显的上升或下降趋势;有的开始比较平缓,后面开始增长... ... ,但是都属于典型的周期性时间序列,它的核心思想很简单:做好分解,做好预测结果的还原,和置信区间的设置,具体操作可根据具体业务逻辑做调整,祝大家建模愉快:-D。
发布于 2022-12-01 00:26:07 回复
发布于 2022-12-01 02:10:54 回复