私はPythonを初めて使用し、パンダを使って簡単なことをするのに苦労しています。特定のデータセットの各アイテムに同じ関数を適用したいのですが、時間依存のパラメーターを使用しています。
DataFrame
タイムスタンプをインデックスとして使用するパンダを使用しています。
まあ言ってみれば :
a(i、j)は、データフレームAの列jのi番目の要素です(タイムスタンプ/インデックス=iおよび列=j)
b(i)は、データフレームBのi番目の要素です(単一の列)
計算したい:
c(i、j)= fct(a(i、j)、b(i))
ここで、fctは2つの引数を持つ関数ですz = fct(x、y)
私はそれを正しく行うコードを書きましたが、それはおそらく最適ではありません(非常に遅い)。この例では、単純な関数fctを使用しました(ただし、実際にはもっと複雑です)
入力:
- df_data:
pandas.DataFrame
index=timestampsといくつかの列 - df_parameter:
pandas.DataFrame
時間依存パラメーターを含む1列
コードは次のとおりです。
# p.concat is required as timestamps are not identical in df_data & df_parameters
import numpy as np
import pandas as p
temp = p.concat([df_data, df_parameter], join='inner', axis=1)
index = temp.index
np_data = temp[nacelleWindSpeeds.columns].values
np_parameter = temp[airDensity.columns].values
import math
def fct(x, y):
return math.pow(x, y)
def test(np_data, np_parameter):
np_result = np.empty(np_data.shape, dtype=float)
it = np.nditer(np_data, flags=['multi_index'])
while not it.finished:
np_result[it.multi_index] = fct(it[0].item(),
np_parameter[it.multi_index[0]][0])
it.iternext()
df_final=p.DataFrame(data=np_result, index=index)
return df_final
final=test(np_data, np_parameter)
final.to_csv(r'C:\temp\test.csv', sep=';')
データの例を次に示します。
df_data
01/03/2010 00:00 ; 9 ; 5 ; 7
01/03/2010 00:10 ; 9 ; 1 ; 4
01/03/2010 00:20 ; 5 ; 3 ; 8
01/03/2010 00:30 ; 7 ; 7 ; 1
01/03/2010 00:40 ; 8 ; 2 ; 3
01/03/2010 00:50 ; 0 ; 3 ; 4
01/03/2010 01:00 ; 4 ; 3 ; 2
01/03/2010 01:10 ; 6 ; 2 ; 2
01/03/2010 01:20 ; 6 ; 8 ; 5
01/03/2010 01:30 ; 7 ; 7 ; 0
df_parameter
01/03/2010 00:00 ; 2
01/03/2010 00:10 ; 5
01/03/2010 00:20 ; 2
01/03/2010 00:30 ; 3
01/03/2010 00:40 ; 0
01/03/2010 00:50 ; 2
01/03/2010 01:00 ; 4
01/03/2010 01:10 ; 3
01/03/2010 01:20 ; 3
01/03/2010 01:30 ; 1
最後の
01/03/2010 00:00 ; 81 ; 25 ; 49
01/03/2010 00:10 ; 59049 ; 1 ; 1024
01/03/2010 00:20 ; 25 ; 9 ; 64
01/03/2010 00:30 ; 343 ; 343 ; 1
01/03/2010 00:40 ; 1 ; 1 ; 1
01/03/2010 00:50 ; 0 ; 9 ; 16
01/03/2010 01:00 ; 256 ; 81 ; 16
01/03/2010 01:10 ; 216 ; 8 ; 8
01/03/2010 01:20 ; 216 ; 512 ; 125
01/03/2010 01:30 ; 7 ; 7 ; 0
よろしくお願いします。
パトリック