Files
NewStock/main/utils/__pycache__/data_process.cpython-313.pyc

106 lines
12 KiB
Plaintext
Raw Normal View History

2025-06-05 20:21:01 +08:00
<EFBFBD>
U Ah-<00> <00>T<00>SSKrSSKrSSKJr SSKJr SrSS\RS\RS\
S\ 4Sjjr SS \RS\
S
\ S \ 4S jjr SS \RS\
S \S\4SjjrSS \RS\
S\ 4SjjrS \RS\
\S\R4Sjrg)<17>N)<01>tqdm绽<6D><E7BBBD><EFBFBD>|<7C>=<3D>train_df<64>test_df<64>features<65>epsilonc <00>^<00>[S5 [U4SjU55(d3UVs/sHoDTR;dMUPM nn[SUS35 g[USS9HJnTUR S5nTUR S 5nTUU-
Xs-- TU'XU-
Xs-- X'ML [S5 gs snf![
a [S
US 35 M{[ an[S US US35 SnAM<>SnAff=f)<10><>
对指定特征列进行截面 Z-Score 标准化 (原地修改)。
方法: Z = (value - cross_sectional_mean) / (cross_sectional_std + epsilon)
Args:
df (pd.DataFrame): 输入 DataFrame需包含 'trade_date' 和 features 列。
features (list): 需要处理的特征列名列表。
epsilon (float): 防止除以零的小常数。
WARNING: 此函数会原地修改输入的 DataFrame 'df'。
<EFBFBD>!开始截面 Z-Score 标准化...c3<00>@># <00>UHoTR;v<00> M g7f<01>N<><01>columns)<03>.0<EFBFBD>colrs <20><>4/mnt/d/PyProject/NewStock/main/utils/data_process.py<70> <genexpr><3E>%zscore_standardize.<locals>.<genexpr>s<00><><00><00>;<3B>(<28>3<EFBFBD>h<EFBFBD>&<26>&<26>&<26>(<28><><00><01>,错误: DataFrame 中缺少以下特征列: <20>。跳过标准化处理。N<E38082> Standardizing<6E><01>desc<73>mean<61>std<74> 警告: 列 '<27>J' 可能不存在或在分组中出错跳过此列的标准化处理。<E79086>警告: 处理列 '<27>' 时发生错误: <20>$跳过此列的标准化处理。<E79086>!截面 Z-Score 标准化完成。)<07>print<6E>allrr<00> transform<72>KeyError<6F> Exception) rrrrr<00>missingrr<00>es ` r<00>zscore_standardizer*s"<00><><00>
<EFBFBD>
-<2D>.<2E> <0E>;<3B>(<28>;<3B> ;<3B> ;<3B>"*<2A>J<>(<28>3<EFBFBD><18>9I<39>9I<39>.I<>3<EFBFBD>(<28><07>J<> <0A><<3C>W<EFBFBD>I<EFBFBD>E`<60>a<>b<><0E><14>H<EFBFBD>?<3F>3<><03> i<01><1B>C<EFBFBD>=<3D>*<2A>*<2A>6<EFBFBD>2<>D<EFBFBD><1A>3<EFBFBD>-<2D>)<29>)<29>%<25>0<>C<EFBFBD>&<26>c<EFBFBD>]<5D>T<EFBFBD>1<>c<EFBFBD>m<EFBFBD>D<>H<EFBFBD>S<EFBFBD>M<EFBFBD>#<23>L<EFBFBD>4<EFBFBD>/<2F>C<EFBFBD>M<EFBFBD>B<>G<EFBFBD>L<EFBFBD>4<>
<EFBFBD>
-<2D>.<2E><>)K<01><><18> s<01> <11>M<EFBFBD>#<23><15>&p<>q<> r<><18> i<01> <11>'<27><03>u<EFBFBD>,?<3F><01>s<EFBFBD>Bf<42>g<> h<> h<><68> i<01>s*<00>B><04>B><04>(AC<02>D<05> D<05>(D<05>D<05>df<64>k<> scale_factorc <00><>^<00>[SUS35 [U4SjU55(d3UVs/sHoDTR;dMUPM nn[SUS35 gTRS5n[ USS 9HnXdR S
5nTUU-
R 5RTS5R S
5nXrU-U--
n XrU-U--n
[R"TUX<>5TU'M<> [S5 gs snf![a [S US 35 M<>[an [S USU S35 Sn A M<>Sn A ff=f)u<>
对指定特征列进行截面 MAD 去极值处理 (原地修改)。
方法: 对每日截面数据,计算 median 和 MAD
将超出 [median - k * scale * MAD, median + k * scale * MAD] 范围的值
替换为边界值 (Winsorization)。
scale_factor=1.4826 使得 MAD 约等于正态分布的标准差。
Args:
df (pd.DataFrame): 输入 DataFrame需包含 'trade_date' 和 features 列。
features (list): 需要处理的特征列名列表。
k (float): MAD 的倍数,用于确定边界。默认为 3.0。
scale_factor (float): MAD 的缩放因子。默认为 1.4826。
WARNING: 此函数会原地修改输入的 DataFrame 'df'。
u$开始截面 MAD 去极值处理 (k=z)...c3<00>@># <00>UHoTR;v<00> M g7fr r<00>rrr+s <20>rr<00> cs_mad_filter.<locals>.<genexpr>D<00><00><><00><00>5<>H<EFBFBD>S<EFBFBD>b<EFBFBD>j<EFBFBD>j<EFBFBD> <20>H<EFBFBD>rru。跳过去极值处理。N<E38082>
trade_datez MAD Filteringr<00>medianruF' 可能不存在或在分组中出错,跳过此列的 MAD 处理。rr u ,跳过此列的 MAD 处理。u#截面 MAD 去极值处理完成。) r#r$r<00>groupbyrr%<00>abs<62>np<6E>clipr&r') r+rr,r-rr(<00>groupedr4<00>mad<61> lower_bound<6E> upper_boundr)s ` r<00> cs_mad_filterr=/sa<00><><00>(
<EFBFBD> 0<><11><03>4<EFBFBD>
8<EFBFBD>9<> <0E>5<>H<EFBFBD>5<> 5<> 5<>"*<2A>D<>(<28>3<EFBFBD><12><1A><1A>.C<>3<EFBFBD>(<28><07>D<> <0A><<3C>W<EFBFBD>I<EFBFBD>E`<60>a<>b<><0E><10>j<EFBFBD>j<EFBFBD><1C>&<26>G<EFBFBD><13>H<EFBFBD>?<3F>3<><03> e<01><1C>\<5C>+<2B>+<2B>H<EFBFBD>5<>F<EFBFBD><15>c<EFBFBD>7<EFBFBD>V<EFBFBD>#<23>(<28>(<28>*<2A>2<>2<>2<EFBFBD>l<EFBFBD>3C<33>D<>N<>N<>x<EFBFBD>X<>C<EFBFBD>!<21>|<7C>#3<>c<EFBFBD>#9<>9<>K<EFBFBD> <20>|<7C>#3<>c<EFBFBD>#9<>9<>K<EFBFBD><19>g<EFBFBD>g<EFBFBD>b<EFBFBD><13>g<EFBFBD>{<7B>@<40>B<EFBFBD>s<EFBFBD>G<EFBFBD>4<>&
<EFBFBD>
/<2F>0<><30>3E<01><>(<18> o<01> <11>M<EFBFBD>#<23><15>&l<>m<> n<><18> e<01> <11>'<27><03>u<EFBFBD>,?<3F><01>s<EFBFBD>Bb<42>c<> d<> d<><64> e<01>s*<00>D<04>D<04>=A;D <02> E<05>) E<05>2E
<05>
E<05> industry_col<6F>market_cap_colc <00>D^<00>[S5 USX#/-n[U4SjU55(d3UVs/sHoUTR;dMUPM nn[SUS35 gSn[R"TU5TU'TSR 5n/n [ USS 9GH<>n
TRTSU
:HXU/-4R5n X<>/n [R"U S
S 9n [R"X<>US
S 9n U R[5n [R"X<>/S S9n X<>Vs/sHoUPM snR5nUGHnX<>nUR!5U R!5RS S9-nUR#5U R$S S -:a7[SU
SUSUR#5S35 [R&X<>'M<>UUnU Un[R("UR+5UR+55nUR-5nUR.URUU4'[R&URU)U4'GM U R3U5 GM<> U (a([R"U 5nTR5U5 O [S5 TR7U/S
S9 [S5 gs snfs snf![0a3n[SU
SUSUS35 [R&X<>'SnA M<>SnAff=f)u<>
对指定特征列进行截面行业和对数市值中性化 (原地修改)。
使用 OLS 回归: feature ~ 1 + log(market_cap) + C(industry)
将回归残差写回原特征列。
Args:
df (pd.DataFrame): 输入 DataFrame需包含 'trade_date', features 列,
industry_col, market_cap_col。
features (list): 需要处理的特征列名列表。
industry_col (str): 行业分类列名。
market_cap_col (str): 流通市值列名。
WARNING: 此函数会原地修改输入的 DataFrame 'df' 的 features 列。
计算量较大,可能耗时较长。
需要安装 statsmodels 库 (pip install statsmodels)。
u$开始截面行业市值中性化...r3c3<00>@># <00>UHoTR;v<00> M g7fr rr0s <20>rr<00>-cs_neutralize_industry_cap.<locals>.<genexpr>ys<00><><00><00>:<3A>M<EFBFBD>S<EFBFBD>b<EFBFBD>j<EFBFBD>j<EFBFBD> <20>M<EFBFBD>ru&错误: DataFrame 中缺少必需列: u。无法进行中性化。N<E38082>_log_market_cap<61> NeutralizingrT)<01>prepend)<02>prefix<69>
drop_first<EFBFBD>)<01>axisu警告: 日期 u , 特征 u 有效数据不足 (u&个),无法中性化,填充 NaN。u 回归失败: u,填充 NaN。u*没有有效的残差结果可以合并。)r<00>inplaceu$截面行业市值中性化完成。)r#r$rr7<00>log1p<31>uniquer<00>loc<6F>copy<70>sm<73> add_constant<6E>pd<70> get_dummies<65>astype<70>int<6E>concat<61>notna<6E>sum<75>shape<70>nan<61>OLS<4C>to_numpy<70>fit<69>residr'<00>append<6E>update<74>drop)r+rr>r?<00> required_colsrr(<00> log_cap_col<6F>dates<65> all_residuals<6C>date<74>
daily_data<EFBFBD>X<>industry_dummies<65>daily_residuals<6C>Y<>
valid_mask<EFBFBD>Y_valid<69>X_valid<69>model<65>resultsr)<00> residuals_dfs` r<00>cs_neutralize_industry_caprqcs<><00><><00>(
<EFBFBD>
0<EFBFBD>1<><1C> <0C>l<EFBFBD>K<>K<>M<EFBFBD> <0E>:<3A>M<EFBFBD>:<3A> :<3A> :<3A>"/<2F>I<>-<2D>3<EFBFBD>b<EFBFBD>j<EFBFBD>j<EFBFBD>3H<33>3<EFBFBD>-<2D><07>I<> <0A>6<>w<EFBFBD>i<EFBFBD>?Z<>[<5B>\<5C><0E>$<24>K<EFBFBD><18>h<EFBFBD>h<EFBFBD>r<EFBFBD>.<2E>1<>2<>B<EFBFBD>{<7B>O<EFBFBD>
<0F>|<7C> <1C> #<23> #<23> %<25>E<EFBFBD><16>M<EFBFBD><14>U<EFBFBD><1E>0<><04><17>V<EFBFBD>V<EFBFBD>B<EFBFBD>|<7C>,<2C><04>4<>h<EFBFBD>|<7C>A\<5C>6\<5C>\<5C>]<5D>b<>b<>d<>
<EFBFBD> <17>}<7D> %<25><01> <0E>O<EFBFBD>O<EFBFBD>A<EFBFBD>t<EFBFBD> ,<2C><01><1D>><3E>><3E>*<2A>*B<><<3C>dh<64>i<><18>+<2B>2<>2<>3<EFBFBD>7<><18> <0E>I<EFBFBD>I<EFBFBD>q<EFBFBD>+<2B>!<21> 4<><01>$<24>X<EFBFBD>%><3E>X<EFBFBD>c<EFBFBD>c<EFBFBD>X<EFBFBD>%><3E>?<3F>D<>D<>F<><0F><1B>C<EFBFBD><1A><0F>A<EFBFBD><1B><17><17><19>Q<EFBFBD>W<EFBFBD>W<EFBFBD>Y<EFBFBD>]<5D>]<5D><01>]<5D>%:<3A>:<3A>J<EFBFBD><19>~<7E>~<7E><1F>1<EFBFBD>7<EFBFBD>7<EFBFBD>1<EFBFBD>:<3A><01>><3E>2<><15><0F><04>v<EFBFBD>Y<EFBFBD>s<EFBFBD>e<EFBFBD>;P<>Q[<5B>Q_<51>Q_<51>Qa<51>Pb<50>cI<02>J<02>K<02>')<29>v<EFBFBD>v<EFBFBD><0F>$<24><18><17>
<EFBFBD>m<EFBFBD>G<EFBFBD><17>
<EFBFBD>m<EFBFBD>G<EFBFBD> <16><1A><06><06>w<EFBFBD>/<2F>/<2F>1<>7<EFBFBD>3C<33>3C<33>3E<33>F<><05><1F>)<29>)<29>+<2B><07>7><3E>}<7D>}<7D><0F>#<23>#<23>J<EFBFBD><03>O<EFBFBD>4<>8:<3A><06><06><0F>#<23>#<23>Z<EFBFBD>K<EFBFBD><13>$4<>5<>'<1C>2 <16><1C><1C>_<EFBFBD>-<2D>M1<>R<15><19>y<EFBFBD>y<EFBFBD><1D>/<2F> <0C> <0B> <09> <09>,<2C><1F> <0A>:<3A>;<3B><07>G<EFBFBD>G<EFBFBD>[<5B>M<EFBFBD>4<EFBFBD>G<EFBFBD>0<> <09>
0<EFBFBD>1<><31>GJ<01><>2&?<3F><>,<1D> <16><15><0F><04>v<EFBFBD>Y<EFBFBD>s<EFBFBD>e<EFBFBD>?<3F>1<EFBFBD>#<23>M]<5D>^<5E>_<>')<29>v<EFBFBD>v<EFBFBD><0F>$<24><15><> <16>s*<00>K<04> K<04>, K<08>(A>K"<04>"
L<07>,'L<07>Lc <00>^<00>[S5 [U4SjU55(d3UVs/sHo3TR;dMUPM nn[SUS35 gTRS5n[ USS9H:nXSR S 5nXSR S
5nTUU-
Xr-- TU'M< [S5 gs snf![ a [S US 35 Mk[an[S USUS35 SnAM<>SnAff=f)r
r c3<00>@># <00>UHoTR;v<00> M g7fr rr0s <20>rr<00>(cs_zscore_standardize.<locals>.<genexpr><3E>r2rrrNr3rrrrrrrr r!r")r#r$rr5rr%r&r') r+rrrr(r9rrr)s ` r<00>cs_zscore_standardizeru<00>s<00><><00>
<EFBFBD>
-<2D>.<2E> <0E>5<>H<EFBFBD>5<> 5<> 5<>"*<2A>D<>(<28>3<EFBFBD><12><1A><1A>.C<>3<EFBFBD>(<28><07>D<> <0A><<3C>W<EFBFBD>I<EFBFBD>E`<60>a<>b<><0E><10>j<EFBFBD>j<EFBFBD><1C>&<26>G<EFBFBD><13>H<EFBFBD>?<3F>3<><03> i<01><1A><<3C>)<29>)<29>&<26>1<>D<EFBFBD><19>,<2C>(<28>(<28><15>/<2F>C<EFBFBD><1A>#<23>w<EFBFBD><14>~<7E>#<23>-<2D>8<>B<EFBFBD>s<EFBFBD>G<EFBFBD>4<>
<EFBFBD>
-<2D>.<2E><>)E<01><><18> s<01> <11>M<EFBFBD>#<23><15>&p<>q<> r<><18> i<01> <11>'<27><03>u<EFBFBD>,?<3F><01>s<EFBFBD>Bf<42>g<> h<> h<><68> i<01>s)<00>B?<04>B?<04>96C<02>D<05> D<05>)D<05>D<05>feature_columns<6E>returnc<00><>^<01>UR5n[R"US5US'U4SjnURSSS9R U5nU$)u<>
对指定特征列进行每日截面中位数填充缺失值 (NaN)。
参数:
df (pd.DataFrame): 包含多日数据的DataFrame需要包含 'trade_date' 和 feature_columns 中的列。
feature_columns (list[str]): 需要进行缺失值填充的特征列名称列表。
返回:
pd.DataFrame: 包含缺失值填充后特征列的DataFrame。在输入DataFrame的副本上操作。
r3c<00><>><01>TH8nXR;dMXR5nXRUSS9 M: U$)NT)rJ)rr4<00>fillna)<04>group<75> feature_col<6F>
median_valrvs <20>r<00>_fill_daily_nan<61>3fill_nan_with_daily_median.<locals>._fill_daily_nan<61>sI<00><><00>+<2B>K<EFBFBD><1A>m<EFBFBD>m<EFBFBD>+<2B>"<22>/<2F>6<>6<>8<>
<EFBFBD><16>"<22>)<29>)<29>*<2A>d<EFBFBD>)<29>C<>+<2B><15> <0C>F)<01>
group_keys)rNrQ<00> to_datetimer5<00>apply)r+rv<00> processed_dfr~<00> filled_dfs ` r<00>fill_nan_with_daily_medianr<6E><00>sW<00><><00><16>7<EFBFBD>7<EFBFBD>9<EFBFBD>L<EFBFBD>"$<24><1E><1E> <0C>\<5C>0J<30>!K<>L<EFBFBD><1C><1E><15>(<1D>$<24>$<24>\<5C>e<EFBFBD>$<24>D<>J<>J<>?<3F>[<5B>I<EFBFBD> <14>r<>)r)g@g)<29>Ǻ<><C7BA>?)<02> cat_l2_code<64>circ_mv)<12>pandasrQ<00>numpyr7<00>statsmodels.api<70>apirOrr<00> DataFrame<6D>list<73>floatr*r=<00>strrqrur<><00>r<>r<00><module>r<>s<><00><01><13><12><1C><15>
<0F><07>"/<2F><12><1C><1C>"/<2F><02> <0C> <0C>"/<2F>PT<50>"/<2F>_d<5F>"/<2F>R!<21>(.<2E>/1<>b<EFBFBD>l<EFBFBD>l<EFBFBD>/1<> <20>/1<><1A>/1<>!&<26>/1<>l4A<01>5><3E>Z2<>2<EFBFBD><<3C><<3C>Z2<>)-<2D>Z2<>-0<>Z2<>03<30>Z2<>~"/<2F>b<EFBFBD>l<EFBFBD>l<EFBFBD>"/<2F>d<EFBFBD>"/<2F>U<EFBFBD>"/<2F>H&<15>2<EFBFBD><<3C><<3C>&<15>$<24>s<EFBFBD>)<29>&<15>PR<50>P\<5C>P\<5C>&r<>