1

時間値(フロート)でインデックス付けされた一連のデータがあり、一連のチャンクを取得して、それらを互いに重ねてプロットしたいと思います。たとえば、20週間にわたって約10分ごとに株価を取得し、株価を20行プロットして週ごとのパターンを確認したいとします。したがって、私のX軸は1週間で、20行あります(その週の価格に対応します)。

更新しました

インデックスは等間隔の値ではなく、浮動小数点です。それは次のようなものです:

t = np.arange(0,12e-9,12e-9/1000.0)
noise = np.random.randn(1000)/1e12
cn = noise.cumsum()
t_noise = t+cn
y = sin(2*math.pi*36e7*t_noise) + noise
df = DataFrame(y,index=t_noise,columns=["A"])
df.plot(marker='.')
plt.axis([0,0.2e-8,0,1])

したがって、インデックスは等間隔ではありません。シミュレーターからの電圧対時間のデータを扱っています。時間のウィンドウTを作成し、dfをTの長さのチャンクに分割し、それらを互いに重ねてプロットする方法を知りたいです。したがって、データの長さが20 * Tの場合、同じプロットに20本の線が表示されます。

混乱させて申し訳ありません; 私はそれが役立つかもしれないと考えて株式のアナロジーを使用しました。

4

2 に答える 2

4

オブジェクトpandas.TimeSeriesを開始点として、ISOの週番号とISOの平日で要素をグループ化できます datetime.date.isocalendar()。ISO年を無視する次のステートメントは、毎日の最後のサンプルを集約したものです。

In [95]: daily = ts.groupby(lambda x: x.isocalendar()[1:]).agg(lambda s: s[-1])

In [96]: daily
Out[96]: 
key_0
(1, 1)     63
(1, 2)     91
(1, 3)     73
...
(20, 5)    82
(20, 6)    53
(20, 7)    63
Length: 140

次のステップを実行するためのよりクリーンな方法があるかもしれませんが、目標は、インデックスをタプルの配列からMultiIndexオブジェクトに変更することです。

In [97]: daily.index = pandas.MultiIndex.from_tuples(daily.index, names=['W', 'D'])

In [98]: daily
Out[98]: 
W   D
1   1    63
    2    91
    3    73
    4    88
    5    84
    6    95
    7    72
...
20  1    81
    2    53
    3    78
    4    64
    5    82
    6    53
    7    63
Length: 140

最後のステップは、MultiIndexから平日を「スタック解除」し、各平日の列を作成し、平日の数値を省略形に置き換えて、読みやすさを向上させることです。

In [102]: dofw = "Mon Tue Wed Thu Fri Sat Sun".split()

In [103]: grid = daily.unstack('D').rename(columns=lambda x: dofw[x-1])

In [104]: grid
Out[104]: 
    Mon  Tue  Wed  Thu  Fri  Sat  Sun
W                                    
1    63   91   73   88   84   95   72
2    66   77   96   72   56   80   66
...
19   56   69   89   69   96   73   80
20   81   53   78   64   82   53   63

週ごとに折れ線グラフを作成するには、データフレームを転置して、列が週番号、行が平日になるようにし(前の手順で、平日の代わりに週番号をアンスタックすることで、この手順を回避できることに注意してください)、を呼び出しますplot

grid.T.plot()
于 2012-05-05T23:19:22.297 に答える
0

これに答えさせてください。基本的に、私は完全な平日でパッドまたはインデックスを再作成し、休日または一時停止のために欠落しているデータを削除しながら、5日ごとにサンプリングします

>>> coke = DataReader('KO', 'yahoo', start=datetime(2012,1,1))

>>> startd=coke.index[0]-timedelta(coke.index[0].isoweekday()-1)

>>> rng = array(DateRange(str(startd), periods=90))

>>> chunk=[]

>>> for i in range(18):

... chunk.append(coke[i*5:(i+1)*5].dropna())

...

次に、チャンクをループして毎週のデータをプロットできます

于 2012-05-05T17:55:50.610 に答える