【发布时间】:2019-07-12 08:22:53
【问题描述】:
对于我的实验,我有以下格式的三个不同时间序列数据,它们具有不同的特征,其中第一列是时间戳,第二列是值。
0.086206438,10
0.086425551,12
0.089227066,20
0.089262508,24
0.089744425,30
0.090036815,40
0.090054172,28
0.090377569,28
0.090514071,28
0.090762872,28
0.090912691,27
为了重现性,我分享了我使用的三个时间序列数据here。
从第 2 列开始,我想读取当前行并将其与前一行的值进行比较。如果它更大,我会继续比较。如果当前值小于前一行的值,我想将当前值(较小)除以前一个值(较大)。让我说清楚。例如,在我提供的上述示例记录中,第七行 (28) 小于第六行 (40) 中的值 - 所以它将是 (28/40=0.7)。
这是我的示例代码。
import numpy as np
import pandas as pd
import csv
import numpy as np
import scipy.stats
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm
from statsmodels.graphics.tsaplots import plot_acf, acf
protocols = {}
types = {"data1": "data1.csv", "data2": "data2.csv", "data3": "data3.csv"}
for protname, fname in types.items():
col_time = []
col_window = []
with open(fname, mode='r', encoding='utf-8-sig') as f:
reader = csv.reader(f, delimiter=",")
for i in reader:
col_time.append(float(i[0]))
col_window.append(int(i[1]))
col_time, col_window = np.array(col_time), np.array(col_window)
diff_time = np.diff(col_time)
diff_window = np.diff(col_window)
diff_time = diff_time[diff_window > 0]
diff_window = diff_window[diff_window > 0] # To keep only the increased values
protocols[protname] = {
"col_time": col_time,
"col_window": col_window,
"diff_time": diff_time,
"diff_window": diff_window,
}
# Plot the quotient values
rt = np.exp(np.diff(np.log(col_window)))
for protname, fname in types.items():
col_time, col_window = protocols[protname]["col_time"], protocols[protname]["col_window"]
rt = np.exp(np.diff(np.log(col_window)))
plt.plot(np.diff(col_time), rt, ".", markersize=4, label=protname, alpha=0.1)
plt.ylim(0, 1.0001)
plt.xlim(0, 0.003)
plt.title(protname)
plt.xlabel("time")
plt.ylabel("difference")
plt.legend()
plt.show()
这给了我以下情节
但是,当我这样做时
rt = np.exp(np.diff(np.log(col_window)))
它将当前行除以前一行,这不是我想要的。正如我在上面用我的问题中的一个例子解释的那样,只有当当前行值小于前一个值时,我才想将第 2 列的当前行值除以第 2 列的前一个值。最后,根据时间戳差异绘制商(我上面的代码中的col_time)。我怎样才能解决这个问题?
【问题讨论】:
标签: python python-3.x csv numpy dataframe