ワイドフォーマットのデータフレームdfがあり、約1000列あります。これを長い形式に変換する必要があります
サンプルテーブル:
Date TLRA_Equity KAMN_Equity B_Equity ARNC_Equity RC_Equity DAR_Equity
1/1/2000 10 20 30 40 50 60
2/1/2000 15 25 35 45 55 65
3/1/2000 17 27 37 47 57 67
これをデータフレームメルトで長い形式に変換し、以下のコードでPythonのテーブルに挿入できます
df = df.melt(id_vars = 'Date')
query = "insert into table values (?,?,?)"
cursor.executemany(query, df.values.tolist())
長い形式のデータ:
investment variable value
1/1/2000 TLRA_Equity 10
1/1/2000 KAMN_Equity 20
1/1/2000 B_Equity 30
1/1/2000 ARNC_Equity 40
しかし、長いフォーマットを変換した後、テーブルに更新するのに長い時間がかかります。ワイドフォーマットでデータベーステーブルに挿入し、SQLでロングフォーマットに変換してプロセスを高速化する方法はありますか?
「ジョン・キャパレッティ」ソリューションを実行して出力
Date Item Value
1/1/2000 Date 1/1/2000
1/1/2000 TLRA_x0020_Equity 10
1/1/2000 KAMN_x0020_Equity 20
1/1/2000 B_x0020_Equity 30
1/1/2000 ARNC_x0020_Equity 40
明らかにUnpivotの方がパフォーマンスが高くなりますが、動的SQLを使用せずにデータを「動的に」アンピボットするアプローチを次に示します。
プラス面は、1000列を指定する必要がないことです。
例
Select A.Date
,C.*
From YourTable A
Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
Cross Apply (
Select Item = xAttr.value('local-name(.)', 'varchar(100)')
,Value = xAttr.value('.','varchar(max)')
From XMLData.nodes('//@*') xNode(xAttr)
Where xAttr.value('local-name(.)','varchar(100)') not in ('Date')
) C
戻り値
編集
...
,Item = replace(xAttr.value('local-name(.)', 'varchar(100)'),'_x0020_',' ')
...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加