2

次のような株式の 1 分間のデータがあります。

                      bidopen    bidhigh    bidlow  bidclose bidvolume
currencypair
2007-03-30 16:01:00    1.9687    1.96900    1.9686    1.9686    877.40
2007-03-30 16:02:00    1.9686    1.96905    1.9686    1.9686    897.20
2007-03-30 16:03:00    1.9686    1.96900    1.9686    1.9690    1076.11
2007-03-30 16:04:00    1.9689    1.96910    1.9688    1.9690    849.70
2007-03-30 16:05:00    1.9690    1.96900    1.9688    1.9689    1402.80

余分な列を追加したい。この列は次のことを行います。

  • この時点から 15 レコードを取得します (現在の時刻を含む)
  • これらの 15 のレコードから最高入札額と最低入札額を取得します
  • 高値と安値の差を計算し、その値を新しい列で使用します

以下を試しました。まず、データを読み込みます。

usecols = ['datetime','bidopen','bidhigh','bidlow','bidclose','bidvolume']
df=pd.read_csv(path,parse_dates=('datetime'),index_col=0, usecols = usecols )

関数を定義します。

def lookaheadmaxmin(df):
    df2=df[:15]
    high=df2['bidhigh'].max(axis=1)
    low=df2['bidlow'].min(axis=1)
    return high-low

それから

df['newcolumn'] = map( lookaheadmaxmin, df[:15])

これはエラーです。現在および将来のレコードのスライスを関数に渡す方法がわからないため、マップの「df[:15]」が問題であると確信しています

基本的に私がやろうとしているのは、次のように 15 分間の変動ウィンドウ内で価格がどれだけ変動したかを判断することです。

その間に; 16:00 - 16:15 - 価格はどれくらい動きましたか? これを16:00レコードの列に入れます

16:01 - 16:16 - 価格はどれくらい動きましたか? これを16:01レコードの列に入れます

16:02 - 16:17 - 価格はどれくらい動きましたか? これを16:02レコードの列に入れます

16:03 - 16:18 - 価格はどれくらい動きましたか? これを16:03レコードの列に入れます

16:04 - 16:19 - 価格はどれくらい動きましたか? これを16:04レコードの列に入れます

16:05 - 16:20 - 価格はどれくらい動きましたか? これを16:05レコードの列に入れます


追加情報:

Mac 用 Enthought Canopy バージョン 1.1.0 (64 ビット) を使用しています。Pandas バージョン: バージョン: 0.12.0-1 (numpy 1.7.1 を組み込む)

ソース データのサンプル:

    currencypair,datetime,bidopen,bidhigh,bidlow,bidclose,askopen,askhigh,asklow,askclose,bidvolume,askvolume
    GBPUSD,2007-03-30 16:01:00,1.96870,1.96900,1.96860,1.96860,1.96850,1.96880,1.96845,1.96850,877.40,1386.70
    GBPUSD,2007-03-30 16:02:00,1.96860,1.96905,1.96860,1.96860,1.96850,1.96890,1.96840,1.96840,897.20,1272.30
    GBPUSD,2007-03-30 16:03:00,1.96860,1.96900,1.96860,1.96900,1.96850,1.96890,1.96840,1.96880,1076.11,1333.30
    GBPUSD,2007-03-30 16:04:00,1.96890,1.96910,1.96880,1.96900,1.96880,1.96890,1.96865,1.96880,849.70,765.10
    GBPUSD,2007-03-30 16:05:00,1.96900,1.96900,1.96880,1.96890,1.96875,1.96890,1.96860,1.96870,1402.80,1240.90
    GBPUSD,2007-03-30 16:06:00,1.96890,1.96890,1.96840,1.96860,1.96870,1.96870,1.96820,1.96850,769.50,1727.30
    GBPUSD,2007-03-30 16:07:00,1.96860,1.96880,1.96820,1.96830,1.96850,1.96870,1.96810,1.96820,842.00,1865.60
    GBPUSD,2007-03-30 16:08:00,1.96830,1.96930,1.96830,1.96910,1.96820,1.96920,1.96820,1.96890,1096.60,1197.70
    GBPUSD,2007-03-30 16:09:00,1.96910,1.96920,1.96880,1.96890,1.96895,1.96910,1.96865,1.96880,368.60,432.10

補足として-レコードの表示に奇妙なことがあります(私はipythonノートブックを使用しています)。列を無視しても、'currencypair'奇妙に列見出しとして表示されます。(他の動作していないことに関係があるかどうかわからないので、これを含めています。

データのインポート (上記の csv_read を使用) ('currencypair'名前のない列に注意)

usecols = ['datetime','bidopen','bidhigh','bidlow','bidclose','bidvolume']
df=pd.read_csv(path,parse_dates=('datetime'),index_col=0, usecols = usecols )

それからやって

    df[:5]

表示: ('currencypair'列見出しとして表示されますが、df.info()以下ではとして表示されていることに注意してください'index')

                           bidopen    bidhigh    bidlow    bidclose    bidvolume
    currencypair                    
    2007-03-30 16:01:00     1.9687     1.96900     1.9686     1.9686     877.40
    2007-03-30 16:02:00     1.9686     1.96905     1.9686     1.9686     897.20
    2007-03-30 16:03:00     1.9686     1.96900     1.9686     1.9690     1076.11
    2007-03-30 16:04:00     1.9689     1.96910     1.9688     1.9690     849.70
    2007-03-30 16:05:00     1.9690     1.96900     1.9688     1.9689     1402.80

df.info()ショー:

    <class 'pandas.core.frame.DataFrame'>
    Index: 2362159 entries, 2007-03-30 16:01:00 to 2013-09-02 18:59:00
    Data columns (total 5 columns):
    bidopen      2362159  non-null values
    bidhigh      2362159  non-null values
    bidlow       2362159  non-null values
    bidclose     2362159  non-null values
    bidvolume    2362159  non-null values
    dtypes: float64(5)

別の方法でデータをインポートする

currencypair 列をインポートしてから削除します。'currencypair'(追加後に列を削除することに注意してください)

    usecols = ['currencypair','datetime','bidopen','bidhigh','bidlow','bidclose','bidvolume']
    df=pd.read_csv(path,parse_dates=('datetime'),index_col=1, usecols = usecols )
    df=df.drop('currencypair',1)

ショー:

                           bidopen    bidhigh    bidlow    bidclose    bidvolume
    datetime                    
    2007-03-30 16:01:00     1.9687     1.96900     1.9686     1.9686     877.40
    2007-03-30 16:02:00     1.9686     1.96905     1.9686     1.9686     897.20
    2007-03-30 16:03:00     1.9686     1.96900     1.9686     1.9690     1076.11
    2007-03-30 16:04:00     1.9689     1.96910     1.9688     1.9690     849.70
    2007-03-30 16:05:00     1.9690     1.96900     1.9688     1.9689     1402.80

およびdf.info()表示: (メモ インデックスは として表示されるようになりました'DatetimeIndex')

    <class 'pandas.core.frame.DataFrame'>
    DatetimeIndex: 2362159 entries, 2007-03-30 16:01:00 to 2013-09-02 18:59:00
    Data columns (total 5 columns):
    bidopen      2362159  non-null values
    bidhigh      2362159  non-null values
    bidlow       2362159  non-null values
    bidclose     2362159  non-null values
    bidvolume    2362159  non-null values
    dtypes: float64(5)
4

1 に答える 1

1

たとえば、a の最大値と b の最小値など、指定しているいくつかの列のみが必要な場合は非常に簡単です。

In [65]: df = DataFrame(randn(100,4),columns=list('abcd'),
        index=date_range('20130101 16:00',periods=100,freq='T'))

In [66]: df.head(20)
Out[66]: 
                            a         b         c         d
2013-01-01 16:00:00  0.404056  0.115774 -0.202356  0.998315
2013-01-01 16:01:00 -0.231966  0.262609  1.192302 -0.702163
2013-01-01 16:02:00 -0.467005  0.744724 -0.871782 -0.308637
2013-01-01 16:03:00 -0.175704  0.036244  1.404604 -0.106320
2013-01-01 16:04:00  0.046306 -0.098140  0.535573 -0.306300
2013-01-01 16:05:00 -0.115620 -1.069991  0.790965 -0.504283
2013-01-01 16:06:00  1.496555  0.373582  1.028092 -0.816990
2013-01-01 16:07:00  0.432081  0.182106  0.115107  1.239192
2013-01-01 16:08:00 -0.245789 -2.030840  0.118330 -1.922616
2013-01-01 16:09:00 -0.358188 -0.121750  1.768505 -2.096908
2013-01-01 16:10:00 -1.634722 -0.808355 -0.773417  0.095078
2013-01-01 16:11:00 -0.396295  0.168568 -0.901945 -0.073811
2013-01-01 16:12:00 -1.364391  2.052481 -0.175291  0.927363
2013-01-01 16:13:00 -0.523331  0.042475  0.361593 -2.239468
2013-01-01 16:14:00  1.573967 -0.709043  0.551812  0.452311
2013-01-01 16:15:00  0.180578  0.846856 -2.304107 -1.283507
2013-01-01 16:16:00  0.065386  0.356015 -0.174369  1.167562
2013-01-01 16:17:00 -1.747416  1.279114  0.559075  0.200927
2013-01-01 16:18:00 -2.041764 -0.085398  2.032789  0.195671
2013-01-01 16:19:00 -0.639329  0.268832  0.394621 -0.271260

ローリング関数はその時点から計算するため、値が (終点ではなく始点に) 整列するようにタイムシフト (インデックスを変更するだけ) します。

In [67]: df['max_a'] = pd.rolling_max(df['a'].tshift(-14),15)

In [68]: df['min_b'] = pd.rolling_min(df['b'].tshift(-14),15)

In [69]: df.head(20)
Out[69]: 
                            a         b         c         d     max_a     min_b
2013-01-01 16:00:00  0.404056  0.115774 -0.202356  0.998315  1.573967 -2.030840
2013-01-01 16:01:00 -0.231966  0.262609  1.192302 -0.702163  1.573967 -2.030840
2013-01-01 16:02:00 -0.467005  0.744724 -0.871782 -0.308637  1.573967 -2.030840
2013-01-01 16:03:00 -0.175704  0.036244  1.404604 -0.106320  1.573967 -2.030840
2013-01-01 16:04:00  0.046306 -0.098140  0.535573 -0.306300  1.573967 -2.030840
2013-01-01 16:05:00 -0.115620 -1.069991  0.790965 -0.504283  1.573967 -2.030840
2013-01-01 16:06:00  1.496555  0.373582  1.028092 -0.816990  1.573967 -2.030840
2013-01-01 16:07:00  0.432081  0.182106  0.115107  1.239192  1.573967 -2.030840
2013-01-01 16:08:00 -0.245789 -2.030840  0.118330 -1.922616  1.573967 -2.030840
2013-01-01 16:09:00 -0.358188 -0.121750  1.768505 -2.096908  1.573967 -1.185540
2013-01-01 16:10:00 -1.634722 -0.808355 -0.773417  0.095078  1.573967 -1.185540
2013-01-01 16:11:00 -0.396295  0.168568 -0.901945 -0.073811  1.573967 -1.185540
2013-01-01 16:12:00 -1.364391  2.052481 -0.175291  0.927363  1.573967 -1.185540
2013-01-01 16:13:00 -0.523331  0.042475  0.361593 -2.239468  1.573967 -1.185540
2013-01-01 16:14:00  1.573967 -0.709043  0.551812  0.452311  1.573967 -1.185540
2013-01-01 16:15:00  0.180578  0.846856 -2.304107 -1.283507  1.266667 -1.185540
2013-01-01 16:16:00  0.065386  0.356015 -0.174369  1.167562  1.266667 -1.563288
2013-01-01 16:17:00 -1.747416  1.279114  0.559075  0.200927  1.266667 -1.563288
2013-01-01 16:18:00 -2.041764 -0.085398  2.032789  0.195671  1.266667 -1.810085
2013-01-01 16:19:00 -0.639329  0.268832  0.394621 -0.271260  1.266667 -1.810085

ハイローデフはただです

df['max_a'] - df['min_b']

シリーズにギャップがあるようです。次を使用してくださいasfreq

In [16]: df = DataFrame(randn(10,2),columns=list('ab'),index=date_range('20130101 9:00',freq='T',periods=10))

In [17]: df
Out[17]: 
                            a         b
2013-01-01 09:00:00  0.516518 -1.497564
2013-01-01 09:01:00  1.747399  1.100530
2013-01-01 09:02:00 -0.223476 -0.682712
2013-01-01 09:03:00  0.343172 -0.341965
2013-01-01 09:04:00 -1.380057 -1.565732
2013-01-01 09:05:00 -2.156675  1.043532
2013-01-01 09:06:00 -1.237155 -0.219086
2013-01-01 09:07:00  1.626510 -0.596204
2013-01-01 09:08:00 -0.767588  0.496110
2013-01-01 09:09:00 -0.014556  0.012049

In [18]: df.index
Out[18]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 09:00:00, ..., 2013-01-01 09:09:00]
Length: 10, Freq: T, Timezone: None

In [19]: df.append(Series(name=[Timestamp('20130101 09:15')]))
Out[19]: 
                            a         b
2013-01-01 09:00:00  0.516518 -1.497564
2013-01-01 09:01:00  1.747399  1.100530
2013-01-01 09:02:00 -0.223476 -0.682712
2013-01-01 09:03:00  0.343172 -0.341965
2013-01-01 09:04:00 -1.380057 -1.565732
2013-01-01 09:05:00 -2.156675  1.043532
2013-01-01 09:06:00 -1.237155 -0.219086
2013-01-01 09:07:00  1.626510 -0.596204
2013-01-01 09:08:00 -0.767588  0.496110
2013-01-01 09:09:00 -0.014556  0.012049
2013-01-01 09:15:00       NaN       NaN

In [20]: df.append(Series(name=[Timestamp('20130101 09:15')])).index
Out[20]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 09:00:00, ..., 2013-01-01 09:15:00]
Length: 11, Freq: None, Timezone: None

In [21]: df.append(Series(name=[Timestamp('20130101 09:15')])).asfreq('T')
Out[21]: 
                            a         b
2013-01-01 09:00:00  0.516518 -1.497564
2013-01-01 09:01:00  1.747399  1.100530
2013-01-01 09:02:00 -0.223476 -0.682712
2013-01-01 09:03:00  0.343172 -0.341965
2013-01-01 09:04:00 -1.380057 -1.565732
2013-01-01 09:05:00 -2.156675  1.043532
2013-01-01 09:06:00 -1.237155 -0.219086
2013-01-01 09:07:00  1.626510 -0.596204
2013-01-01 09:08:00 -0.767588  0.496110
2013-01-01 09:09:00 -0.014556  0.012049
2013-01-01 09:10:00       NaN       NaN
2013-01-01 09:11:00       NaN       NaN
2013-01-01 09:12:00       NaN       NaN
2013-01-01 09:13:00       NaN       NaN
2013-01-01 09:14:00       NaN       NaN
2013-01-01 09:15:00       NaN       NaN

In [22]: df.append(Series(name=[Timestamp('20130101 09:15')])).asfreq('T').index
Out[22]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 09:00:00, ..., 2013-01-01 09:15:00]
Length: 16, Freq: T, Timezone: None
于 2013-09-08T00:28:40.533 に答える