SQLサーバーとデータフレームでワイドフォーマットからロングフォーマットに変換する場合、約1000列あります-最適化

Arvinth kumar

ワイドフォーマットのデータフレーム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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ