テナーによると、さまざまな国(たとえば、中国、米国、インドなど)のリンゴの価格に関するデータフレームがいくつかあります。これは次のようになります。中国を例にとると:
tenors = pd.Series(['1W', '1M', '1Y'])
apples_china = pd.Series([5.1, 6.2, 7.1])
days = pd.Series([7, 30, 365])
data = {'tenors': tenors,
'apples_china': apples_china,
'days' : days}
apples_china = pd.DataFrame(data)
次に、米国(apples_usa)、ヨーロッパ(apples_eu)などに相当するものがあります。
次に、次のような大きな「ポートフォリオ」データフレームがあります。
country = pd.Series(['china', 'usa', 'europe',' china', 'china', 'india'])
days = pd.Series([12, 45, 99, 101, 102, 300 ])
portfolio = {'country': country,
'days' : days}
df_portfolio = pd.DataFrame(portfolio)
列を追加したい:
df_portfolio['price']
これは、df_portfolio ['country']の値を調べ、たとえば 'china'の場合、日数(row [0]の12)を取り、apples_chinaデータフレーム内を線形補間します。したがって、行[0]では5.1から6.2の間の値、行[3]では6.2から7.1の間の値などになります。
row [1]の場合、類似のapples_usaデータフレームなどの内部を調べます。
私が試したのは:
from scipy.interpolate import interp1d
test = interp1d(apples_china['apples_china'], apples_china['days']) #arrays Y and X
df_portfolio['price'] = np.where(df_portfolio['country']=='china', test(df_portfolio['days']), 0)
しかしValueError
、x範囲でaを返しました。
numpy.where
治療には、いくつかの選択肢があるソリューションが適しています。
ただし、多くの国が関与するスケーラブルなソリューションの場合、辞書の方が便利な場合があります。以下に、必要な手順を示します。
ステップ1
国を国固有のデータにマッピングする辞書を作成します。
country_map = {'china': apples_china.sort_values('days')}
手順2で必要に応じて機能するように、国のデータフレームが並べ替えられdays
ていることを確認する必要があることに注意してくださいnp.interp
。
ステップ2
ポートフォリオデータフレームからデータの行を取得するカスタム関数と、ステップ1のマッピングディクショナリを定義し、を使用np.interp
してマッピングを実行します。try
/except
句を使用して、国が辞書に存在しないインスタンスをキャッチできます。
def interpolator(row, mapper):
days = row['days']
country = row['country']
try:
return np.interp(days, mapper[country]['days'].values,
mapper[country]['apples_china'].values)
except KeyError:
return np.nan
ステップ3
pd.DataFrame.apply
手順2の関数を行ごとに適用するために使用します。
df_portfolio['price'] = df_portfolio.apply(interpolator, mapper=country_map, axis=1)
結果
print(df_portfolio)
country days price
0 china 12 5.339130
1 usa 45 NaN
2 europe 99 NaN
3 china 101 6.390746
4 china 102 6.393433
5 india 300 NaN
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加