我想对一组天文测量进行滚动平均

时间:2015-07-08 17:28:39

标签: python pandas moving-average

我对数据操作很新,我的任务是一个非常讨厌的问题。到目前为止,我无法在互联网上找到类似的东西来解释我需要的各种东西。 我试图获取两列数据,第一列是朱利安日期,第二列是数量级。我想做一些像滚动平均值这样的东西来创建均匀分布的数据点并将该点放在窗口的中间。以下是数据的摘录:

6000.87,0.709
6002.884,0.716
6003.72,0.721
6008.86,0.732
6009.748,0.738
6018.887,0.749

我需要60天的时间窗口(所以不是前60分,而是第一列增加60分),每次平均后我需要减少20天并重新获得平均值直到我结束我的数据。 到目前为止,我已经能够导入数据并运行标准滚动平均值,但它使用前60个点,我无法弄清楚如何让它读取第一列。在它取平均值之后它也会移动一个数据点,我需要它移动20天。任何帮助表示赞赏。 这是我到目前为止所做的:将pandas导入为pd

import numpy as np
import numpy.ma as ma
import matplotlib.pyplot as plt

x = []
y = []

readFile = open('trunkdata.txt', 'r')
sepFile = readFile.read().split('\n')
readFile.close()

for plotPair in sepFile:
    xAndY = plotPair.split(',')
    x.append(float(xAndY[0]))
    y.append(float(xAndY[1]))

arr = pd.DataFrame(y)


data_mean = pd.rolling_mean(arr, 49).shift(-24)

print data_mean


ma.masked_inside(x, 6210, 6249.972)
ma.masked_inside(x, 6935, 6991)
plt.plot(x[len(x) - len(data_mean) :], data_mean, label = 'Smoothed Data')
plt.plot(x,y, label = 'Original Data')

plt.title('Equatorial Data')
plt.xlabel('Julian Date')
plt.ylabel('Q')
plt.legend()

plt.show()

2 个答案:

答案 0 :(得分:0)

我认为您无法使用pd.rolling_mean实现此目的,因为参数指的是要使用的数据数量,在您的情况下,这取决于日期的值。我无法想出一种方法来避免循环,但这里有:

means = []
arr = pd.Series(y, index=x)
min_date = min(x) 
max_date = min_date + 60
while max_date < max(x):
    means.append(arr.loc[min_date:max_date].mean())
    max_date += 20
    min_date += 20

另外,我认为您的代码可以通过几种方式得到改进。首先,您可以使用更具描述性的命名,例如dates, mags而不是x, y。你可以做点什么

date, mag = plotPair.split(',')

然而,通过做

这样的事情看起来可以避免这一切
pd.read_csv('trunk_data.txt', names=['dates', 'magnitudes'])

应立即为您提供一个数据框,其中包含日期列和数量级列。

答案 1 :(得分:0)

所以我不得不做一些调整,让它以我想要的方式工作。以下是该问题文件的相关部分:

# runs mean on the Q data from file
Qmean = []
arr = pd.Series(y, index=x)
min_date = min(x)
max_date = min_date + window_size

# actually does the mean
while max_date < 7281:
    Qmean.append(arr.loc[min_date:max_date].mean())
    min_date += window_shift
    max_date += window_shift

所以说&#39; window_size&#39;是一个变量,它控制我平均的天数,以及&#39; window_shift&#39;在采取新的平均值之前,它将如何移动。

我在使用数据集中的原始日期绘制平均值时遇到了一些问题。它希望将所有平均值塞入数据集的最后两百天左右。所以我这样做了:

# gives me dates for the averages
dates = range(start_x, end_x, window_shift)

当时似乎比尝试调整数据的其他部分更容易。我所做的就是制作一组以与平均值相同的速度增加的数字,然后将两者绘制在一起得到我的图表。

感谢您的帮助。喜欢这个网站。

威尔