6

過去の株式取引のデータフレームがあります。フレームには ['ticker', 'date', 'cusip', 'profit', 'security_type'] のような列があります。最初に:

trades['cusip'] = np.nan
trades['security_type'] = np.nan

['ticker', 'cusip', 'date', 'name', 'security_type', 'primary_exchange'] のような列を持つフレームにロードできる履歴構成ファイルがあります。

config の cusip と security_type で取引フレームを更新したいと思いますが、ティッカーと日付が一致する場合のみです。

私は次のようなことができると思いました:

pd.merge(trades, config, on=['ticker', 'date'], how='left')

しかし、それは列を更新しません。構成列を取引に追加するだけです。

以下は機能しますが、もっと良い方法が必要だと思います。そうでない場合は、おそらくパンダの外で行います。

for date in trades['date'].unique():
    config = get_config_file_as_df(date)
    ## config['date'] == date
    for ticker in trades['ticker'][trades['date'] == date]:
        trades['cusip'][ 
                           (trades['ticker'] == ticker)
                         & (trades['date']   == date)
                       ] \
            = config['cusip'][config['ticker'] == ticker].values[0]

        trades['security_type'][ 
                           (trades['ticker'] == ticker)
                         & (trades['date']   == date)
                       ] \
            = config['security_type'][config['ticker'] == ticker].values[0]
4

1 に答える 1

13

次の設定があるとします。

import pandas as pd
import numpy as np
import datetime as DT

nan = np.nan

trades = pd.DataFrame({'ticker' : ['IBM', 'MSFT', 'GOOG', 'AAPL'],
                       'date' : pd.date_range('1/1/2000', periods = 4), 
                       'cusip' : [nan, nan, 100, nan]
                       })
trades = trades.set_index(['ticker', 'date'])
print(trades)
#                    cusip
# ticker date             
# IBM    2000-01-01    NaN
# MSFT   2000-01-02    NaN
# GOOG   2000-01-03    100  # <-- We do not want to overwrite this
# AAPL   2000-01-04    NaN

config = pd.DataFrame({'ticker' : ['IBM', 'MSFT', 'GOOG', 'AAPL'],
                       'date' : pd.date_range('1/1/2000', periods = 4),
                       'cusip' : [1,2,3,nan]})
config = config.set_index(['ticker', 'date'])

# Let's permute the index to show `DataFrame.update` correctly matches rows based on the index, not on the order of the rows.
new_index = sorted(config.index)
config = config.reindex(new_index)    
print(config)
#                    cusip
# ticker date             
# AAPL   2000-01-04    NaN
# GOOG   2000-01-03      3
# IBM    2000-01-01      1
# MSFT   2000-01-02      2

次に、メソッドを使用してtradesからの値で NaN 値を更新できます。インデックスに基づいて行に一致することに注意してください(これが上記で呼び出された理由です)。configDataFrame.updateDataFrame.updateset_index

trades.update(config, join = 'left', overwrite = False)
print(trades)

#                    cusip
# ticker date             
# IBM    2000-01-01      1
# MSFT   2000-01-02      2
# GOOG   2000-01-03    100 # If overwrite = True, then 100 is overwritten by 3.
# AAPL   2000-01-04    NaN
于 2012-12-18T01:49:55.733 に答える