siat 2.12.8__py3-none-any.whl → 2.12.14__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- siat/financial_statements.py +35 -2
- siat/financials.py +35 -10
- siat/financials2.py +59 -12
- {siat-2.12.8.dist-info → siat-2.12.14.dist-info}/METADATA +1 -1
- {siat-2.12.8.dist-info → siat-2.12.14.dist-info}/RECORD +7 -7
- {siat-2.12.8.dist-info → siat-2.12.14.dist-info}/WHEEL +0 -0
- {siat-2.12.8.dist-info → siat-2.12.14.dist-info}/top_level.txt +0 -0
siat/financial_statements.py
CHANGED
@@ -150,8 +150,7 @@ def get_balance_sheet(symbol):
|
|
150
150
|
stmt['AccountsReceivable']=stmt['Receivables']
|
151
151
|
|
152
152
|
#总检查:总资产=总负债+总权益是否成立
|
153
|
-
stmt['TA-TL-TE']=stmt['TotalAssets']-stmt['TotalLiabilities']-
|
154
|
-
stmt['TotalEquities']
|
153
|
+
#stmt['TA-TL-TE']=stmt['TotalAssets']-stmt['TotalLiabilities']-stmt['TotalEquities']
|
155
154
|
|
156
155
|
#排序
|
157
156
|
stmt.sort_values(by=['asOfDate','periodType'],inplace=True)
|
@@ -159,6 +158,7 @@ def get_balance_sheet(symbol):
|
|
159
158
|
stmt.drop_duplicates(subset=['asOfDate'],keep='first',inplace=True)
|
160
159
|
|
161
160
|
#print(", done")
|
161
|
+
|
162
162
|
return stmt
|
163
163
|
|
164
164
|
if __name__ == '__main__':
|
@@ -171,6 +171,8 @@ if __name__ == '__main__':
|
|
171
171
|
if __name__=='__main__':
|
172
172
|
symbol='AAPL'
|
173
173
|
symbol='MST'
|
174
|
+
|
175
|
+
fsdf=get_income_statements(symbol)
|
174
176
|
|
175
177
|
def get_income_statements(symbol):
|
176
178
|
"""
|
@@ -284,6 +286,8 @@ if __name__ == '__main__':
|
|
284
286
|
#==============================================================================
|
285
287
|
if __name__=='__main__':
|
286
288
|
symbol='AAPL'
|
289
|
+
|
290
|
+
fsdf=get_cashflow_statements(symbol)
|
287
291
|
|
288
292
|
def get_cashflow_statements(symbol):
|
289
293
|
"""
|
@@ -382,6 +386,8 @@ if __name__ == '__main__':
|
|
382
386
|
if __name__=='__main__':
|
383
387
|
ticker='AAPL'
|
384
388
|
ticker='00700.HK'
|
389
|
+
|
390
|
+
fsdf=get_financial_statements(ticker)
|
385
391
|
|
386
392
|
def get_financial_statements(ticker):
|
387
393
|
"""
|
@@ -615,6 +621,33 @@ if __name__ == '__main__':
|
|
615
621
|
"""
|
616
622
|
|
617
623
|
#==============================================================================
|
624
|
+
if __name__ == '__main__':
|
625
|
+
fsdf=get_financial_statements('601398.SS')
|
626
|
+
account_entry='TotalAssets'
|
627
|
+
|
628
|
+
fsdf1=fs_entry_begin(fsdf,account_entry='TotalAssets',suffix='_begin')
|
629
|
+
|
630
|
+
def fs_entry_begin(fsdf,account_entry='TotalAssets',suffix='_begin'):
|
631
|
+
"""
|
632
|
+
功能:以上年年报期末科目数值作为本期年报和季报的期初
|
633
|
+
"""
|
634
|
+
import pandas as pd
|
635
|
+
import numpy as np
|
636
|
+
#获取年报日期
|
637
|
+
ar_mm_dd=pd.to_datetime(fsdf[fsdf['periodType']=='12M']['asOfDate'].values[0]).strftime("%Y-%m-%d")[-5:]
|
638
|
+
|
639
|
+
fsdf['asOfDate_pd']=fsdf['asOfDate'].apply(lambda x: pd.to_datetime(x))
|
640
|
+
fsdf['Date_y4']=fsdf['asOfDate'].apply(lambda x: pd.to_datetime(x).strftime("%Y"))
|
641
|
+
fsdf['Date_begin_pd']=fsdf['Date_y4'].apply(lambda x: pd.to_datetime(str(int(x)-1)+'-'+ar_mm_dd))
|
642
|
+
|
643
|
+
asOfDate_pd_list=list(fsdf['asOfDate_pd'])
|
644
|
+
entry_begin=lambda x: fsdf[fsdf['asOfDate_pd']==x][account_entry].values[0] if x in asOfDate_pd_list else np.nan
|
645
|
+
fsdf[account_entry+suffix]=fsdf['Date_begin_pd'].apply(entry_begin)
|
646
|
+
|
647
|
+
fsdf.drop(['asOfDate_pd','Date_y4','Date_begin_pd'],axis=1,inplace=True)
|
648
|
+
|
649
|
+
return fsdf
|
650
|
+
|
618
651
|
#==============================================================================
|
619
652
|
#==============================================================================
|
620
653
|
#==============================================================================
|
siat/financials.py
CHANGED
@@ -892,10 +892,12 @@ if __name__ == '__main__':
|
|
892
892
|
fst=fsdf.T #查看科目名称更加方便
|
893
893
|
|
894
894
|
fsdf=get_financial_statements('3333.HK')
|
895
|
+
fsdf=get_financial_statements('601398.SS')
|
895
896
|
|
896
897
|
def calc_fin_rates(fsdf):
|
897
898
|
"""
|
898
899
|
功能:基于财报计算各种指标
|
900
|
+
注意:ROA/ROE/EM/turnover比率基于期初期末均值计算,其余仅基于期末数据计算!
|
899
901
|
"""
|
900
902
|
#####前后填充缺失值
|
901
903
|
if fsdf is None: return None
|
@@ -928,9 +930,13 @@ def calc_fin_rates(fsdf):
|
|
928
930
|
fs['Debt to Asset']=fs['TotalLiabilities']/fs['TotalAssets']
|
929
931
|
#股东权益比率:股东权益总额 / 资产总额
|
930
932
|
fs['Equity to Asset']=fs['TotalEquities']/fs['TotalAssets']
|
931
|
-
|
932
|
-
|
933
|
+
|
934
|
+
#权益乘数:资产总额 / 股东权益总额,使用期初期末均值*****
|
935
|
+
fs=fs_entry_begin(fs,account_entry='TotalAssets',suffix='_begin')
|
936
|
+
fs=fs_entry_begin(fs,account_entry='TotalEquities',suffix='_begin')
|
937
|
+
fs['Equity Multiplier']=((fs['TotalAssets']+fs['TotalAssets_begin'])/2)/((fs['TotalEquities']+fs['TotalEquities_begin'])/2)
|
933
938
|
#fs['Equity Multiplier']=fs['avgTotalAsset']/fs['avgTotalEquity']
|
939
|
+
|
934
940
|
#负债股权比率:负债总额 / 股东权益总额
|
935
941
|
fs['Debt to Equity']=fs['TotalLiabilities']/fs['TotalEquities']
|
936
942
|
#有形净值债务率:负债总额 / (股东权益-无形资产净额)
|
@@ -945,19 +951,23 @@ def calc_fin_rates(fsdf):
|
|
945
951
|
#存货周转率:销售收入 / 期末存货,平均存货计算困难
|
946
952
|
#fs['Inventory Turnover']=fs['CostOfRevenue']/fs['avgInventory']
|
947
953
|
#fs['Inventory Turnover']=fs['CostOfRevenue']/fs['Inventory']
|
948
|
-
fs
|
954
|
+
fs=fs_entry_begin(fs,account_entry='Inventory',suffix='_begin')
|
955
|
+
fs['Inventory Turnover']=fs['TotalRevenue']/((fs['Inventory']+fs['Inventory_begin'])/2)
|
949
956
|
#应收账款周转率:赊销收入净额 / 平均应收账款余额
|
950
957
|
#fs['Receivable Turnover']=fs['TotalRevenue']/fs['avgReceivables']
|
951
|
-
fs
|
958
|
+
fs=fs_entry_begin(fs,account_entry='AccountsReceivable',suffix='_begin')
|
959
|
+
fs['Receivable Turnover']=fs['TotalRevenue']/((fs['AccountsReceivable']+fs['AccountsReceivable_begin'])/2)
|
952
960
|
#流动资产周转率:销售收入 / 平均流动资产余额
|
953
961
|
#fs['Current Asset Turnover']=fs['TotalRevenue']/fs['avgCurrentAsset']
|
954
|
-
fs
|
962
|
+
fs=fs_entry_begin(fs,account_entry='CurrentAssets',suffix='_begin')
|
963
|
+
fs['Current Asset Turnover']=fs['TotalRevenue']/((fs['CurrentAssets']+fs['CurrentAssets_begin'])/2)
|
955
964
|
#固定资产周转率:销售收入 / 平均固定资产净额
|
956
965
|
#fs['Fixed Asset Turnover']=fs['TotalRevenue']/fs['avgPPE']
|
957
|
-
fs
|
966
|
+
fs=fs_entry_begin(fs,account_entry='NetPPE',suffix='_begin')
|
967
|
+
fs['Fixed Asset Turnover']=fs['TotalRevenue']/((fs['NetPPE']+fs['NetPPE_begin'])/2)
|
958
968
|
#总资产周转率:销售收入 / 平均资产总额
|
959
969
|
#fs['Total Asset Turnover']=fs['TotalRevenue']/fs['avgTotalAsset']
|
960
|
-
fs['Total Asset Turnover']=fs['TotalRevenue']/fs['TotalAssets']
|
970
|
+
fs['Total Asset Turnover']=fs['TotalRevenue']/((fs['TotalAssets']+fs['TotalAssets_begin'])/2)
|
961
971
|
|
962
972
|
#主营业务利润率=主营业务利润/主营业务收入
|
963
973
|
fs['Operating Margin']=fs['OperatingIncome']/fs['OperatingRevenue']
|
@@ -979,19 +989,22 @@ def calc_fin_rates(fsdf):
|
|
979
989
|
#资产报酬率:净利润 / 期末资产总额,平均总资产计算困难
|
980
990
|
#fs['Return on Asset']=(fs['NetIncome']+fs['InterestExpense'])/fs['avgTotalAsset']
|
981
991
|
#fs['Return on Asset']=(fs['NetIncome']+fs['InterestExpense'])/fs['TotalAssets']
|
982
|
-
fs
|
992
|
+
#fs=fs_entry_begin(fs,account_entry='TotalAssets',suffix='_begin')
|
993
|
+
fs['Return on Asset']=(fs['NetIncome'])/((fs['TotalAssets']+fs['TotalAssets_begin'])/2)
|
983
994
|
fs['ROA']=fs['Return on Asset']
|
984
995
|
#(投入)资本回报率(Return on Invested Capital,简称ROIC)
|
985
996
|
#ROIC=NOPLAT(息前税后经营利润)/IC(投入资本)
|
986
997
|
#NOPLAT=EBIT×(1-T)=(营业利润+财务费用-非经常性投资损益) ×(1-所得税率)
|
987
998
|
#IC=有息负债+净资产-超额现金-非经营性资产
|
988
999
|
#fs['Return on Invested Capital']=(fs['OperatingIncome']+fs['InterestExpense'])*(1-fs['TaxRateForCalcs'])/fs['InvestedCapital']
|
989
|
-
fs
|
1000
|
+
fs=fs_entry_begin(fs,account_entry='InvestedCapital',suffix='_begin')
|
1001
|
+
fs['Return on Invested Capital']=(fs['OperatingIncome'])*(1-fs['TaxRateForCalcs'])/((fs['InvestedCapital']+fs['InvestedCapital_begin'])/2)
|
990
1002
|
#fs['Return on Invested Capital']=fs['Return on Invested Capital']
|
991
1003
|
fs['ROIC']=fs['Return on Invested Capital']
|
992
1004
|
#净资产报酬率:净利润 / 平均净资产
|
993
1005
|
#fs['Return on Net Asset']=fs['NetIncome']/fs['avgTotalEquity']
|
994
|
-
|
1006
|
+
|
1007
|
+
fs['Return on Net Asset']=fs['NetIncome']/((fs['TotalEquities']+fs['TotalEquities_begin'])/2)
|
995
1008
|
#股东权益报酬率:净利润 / 平均股东权益总额
|
996
1009
|
fs['Return on Equity']=fs['Return on Net Asset']
|
997
1010
|
fs['ROE']=fs['Return on Equity']
|
@@ -1026,6 +1039,13 @@ def calc_fin_rates(fsdf):
|
|
1026
1039
|
fs['date']=fs['endDate']
|
1027
1040
|
fs.set_index('date',inplace=True)
|
1028
1041
|
|
1042
|
+
# 删除起初_begin字段
|
1043
|
+
list_begin=[]
|
1044
|
+
for b in list(fs):
|
1045
|
+
if '_begin' in b:
|
1046
|
+
list_begin=list_begin+[b]
|
1047
|
+
fs.drop(list_begin,axis=1,inplace=True)
|
1048
|
+
|
1029
1049
|
return fs
|
1030
1050
|
|
1031
1051
|
|
@@ -1036,6 +1056,8 @@ if __name__ == '__main__':
|
|
1036
1056
|
if __name__ == '__main__':
|
1037
1057
|
ticker='AAPL'
|
1038
1058
|
ticker='00700.HK'
|
1059
|
+
ticker='601398.SS'
|
1060
|
+
|
1039
1061
|
fsr=get_financial_rates(ticker)
|
1040
1062
|
|
1041
1063
|
def get_financial_rates(ticker):
|
@@ -2022,5 +2044,8 @@ if __name__=='__main__':
|
|
2022
2044
|
tickerlist=['IBM','DELL','WMT']
|
2023
2045
|
df=compare_dupont(tickerlist,fsdate='latest',scale1 = 100,scale2 = 10)
|
2024
2046
|
#==============================================================================
|
2047
|
+
|
2048
|
+
|
2049
|
+
|
2025
2050
|
#==============================================================================
|
2026
2051
|
#==============================================================================
|
siat/financials2.py
CHANGED
@@ -183,7 +183,8 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
183
183
|
|
184
184
|
# 删除不用的列
|
185
185
|
currency=fsdf2['currencyCode'].values[0]
|
186
|
-
droplist=['currencyCode','TA-TL-TE','asOfDate']
|
186
|
+
#droplist=['currencyCode','TA-TL-TE','asOfDate']
|
187
|
+
droplist=['currencyCode','asOfDate']
|
187
188
|
fsdf2.drop(droplist,axis=1,inplace=True)
|
188
189
|
|
189
190
|
# 打印前处理
|
@@ -234,6 +235,8 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
234
235
|
fsdf5=fsdf4[['Item']+collist]
|
235
236
|
fsdf6=df_filter_row(fsdf5,exclude_collist=['Item'],symbol='---')
|
236
237
|
|
238
|
+
fsdf6=df_sort_priority_list(fsdf6,sort_column='Item',priorityList=['periodType'],ascending=True)
|
239
|
+
|
237
240
|
alignlist=['left']+['right']*(len(list(fsdf5))-1)
|
238
241
|
print(fsdf6.to_markdown(tablefmt='plain',index=False,colalign=alignlist))
|
239
242
|
|
@@ -306,6 +309,8 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
306
309
|
fsdf5=fsdf4[['Item']+collist]
|
307
310
|
fsdf6=df_filter_row(fsdf5,exclude_collist=['Item'],symbol='---')
|
308
311
|
|
312
|
+
fsdf6=df_sort_priority_list(fsdf6,sort_column='Item',priorityList=['periodType'],ascending=True)
|
313
|
+
|
309
314
|
alignlist=['left']+['right']*(len(list(fsdf5))-1)
|
310
315
|
print(fsdf6.to_markdown(tablefmt='plain',index=False,colalign=alignlist))
|
311
316
|
|
@@ -376,6 +381,8 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
376
381
|
fsdf5=fsdf4[['Item']+collist]
|
377
382
|
fsdf6=df_filter_row(fsdf5,exclude_collist=['Item'],symbol='---')
|
378
383
|
|
384
|
+
fsdf6=df_sort_priority_list(fsdf6,sort_column='Item',priorityList=['periodType'],ascending=True)
|
385
|
+
|
379
386
|
alignlist=['left']+['right']*(len(list(fsdf5))-1)
|
380
387
|
print(fsdf6.to_markdown(tablefmt='plain',index=False,colalign=alignlist))
|
381
388
|
|
@@ -477,11 +484,13 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
477
484
|
fsdf5=fsdf4[['Item']+collist]
|
478
485
|
fsdf6=df_filter_row(fsdf5,exclude_collist=['Item'],symbol='---')
|
479
486
|
|
487
|
+
fsdf6=df_sort_priority_list(fsdf6,sort_column='Item',priorityList=['periodType'],ascending=True)
|
488
|
+
|
480
489
|
alignlist=['left']+['right']*(len(list(fsdf5))-1)
|
481
490
|
print(fsdf6.to_markdown(tablefmt='plain',index=False,colalign=alignlist))
|
482
491
|
|
483
492
|
footnote1="*** Amount unit: "+currency+" billion, exchange's local accounting standards"
|
484
|
-
footnote2="***
|
493
|
+
footnote2="*** ROx/EM/turnover rates are based on periodic mean, others on end-term"
|
485
494
|
footnote3="*** Data source: Yahoo Finance, "+todaydt
|
486
495
|
print('\n',footnote1,'\n',footnote2,'\n',footnote3)
|
487
496
|
|
@@ -562,7 +571,7 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
562
571
|
|
563
572
|
fsdf4.replace(0,'---',inplace=True)
|
564
573
|
|
565
|
-
titletxt="\n***** COMPARISON OF FINANCIAL STATEMENT SUMMARY *****\n"
|
574
|
+
titletxt="\n***** PEER COMPARISON OF FINANCIAL STATEMENT SUMMARY *****\n"
|
566
575
|
print(titletxt)
|
567
576
|
|
568
577
|
collist=list(fsdf4)
|
@@ -570,11 +579,13 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
570
579
|
fsdf5=fsdf4[['Item']+collist]
|
571
580
|
fsdf6=df_filter_row(fsdf5,exclude_collist=['Item'],symbol='---')
|
572
581
|
|
582
|
+
fsdf6=df_sort_priority_list(fsdf6,sort_column='Item',priorityList=['periodType','reportDate','currencyCode'],ascending=True)
|
583
|
+
|
573
584
|
alignlist=['left']+['right']*(len(list(fsdf5))-1)
|
574
585
|
print(fsdf6.to_markdown(tablefmt='plain',index=False,colalign=alignlist))
|
575
586
|
|
576
|
-
footnote1="*** Amount unit:
|
577
|
-
footnote2="***
|
587
|
+
footnote1="*** Amount unit: billion, based on exchange's local accounting standards"
|
588
|
+
footnote2="*** ROx/EM/turnover rates are based on periodic mean, others on end-term"
|
578
589
|
footnote3="*** Data source: Yahoo Finance, "+todaydt
|
579
590
|
print('\n',footnote1,'\n',footnote2,'\n',footnote3)
|
580
591
|
|
@@ -670,11 +681,13 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
670
681
|
fsdf5=fsdf4[['Item']+collist]
|
671
682
|
fsdf6=df_filter_row(fsdf5,exclude_collist=['Item'],symbol='---')
|
672
683
|
|
684
|
+
fsdf6=df_sort_priority_list(fsdf6,sort_column='Item',priorityList=['periodType'],ascending=True)
|
685
|
+
|
673
686
|
alignlist=['left']+['right']*(len(list(fsdf5))-1)
|
674
687
|
print(fsdf6.to_markdown(tablefmt='plain',index=False,colalign=alignlist))
|
675
688
|
|
676
689
|
footnote1="*** Amount unit: "+currency+" billion, exchange's local accounting standards"
|
677
|
-
footnote2="***
|
690
|
+
footnote2="*** ROx/EM/turnover rates are based on periodic mean, others on end-term"
|
678
691
|
footnote3="*** Data source: Yahoo Finance, "+todaydt
|
679
692
|
print('\n',footnote1,'\n',footnote2,'\n',footnote3)
|
680
693
|
|
@@ -756,7 +769,7 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
756
769
|
|
757
770
|
fsdf4.replace(0,'---',inplace=True)
|
758
771
|
|
759
|
-
titletxt="\n***** COMPARISON OF FINANCIAL INDICATORS *****\n"
|
772
|
+
titletxt="\n***** PEER COMPARISON OF FINANCIAL INDICATORS *****\n"
|
760
773
|
print(titletxt)
|
761
774
|
|
762
775
|
collist=list(fsdf4)
|
@@ -764,11 +777,13 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
764
777
|
fsdf5=fsdf4[['Item']+collist]
|
765
778
|
fsdf6=df_filter_row(fsdf5,exclude_collist=['Item'],symbol='---')
|
766
779
|
|
780
|
+
fsdf6=df_sort_priority_list(fsdf6,sort_column='Item',priorityList=['periodType','reportDate','currencyCode'],ascending=True)
|
781
|
+
|
767
782
|
alignlist=['left']+['right']*(len(list(fsdf5))-1)
|
768
783
|
print(fsdf6.to_markdown(tablefmt='plain',index=False,colalign=alignlist))
|
769
784
|
|
770
|
-
footnote1="*** Amount unit:
|
771
|
-
footnote2="***
|
785
|
+
footnote1="*** Amount unit: billion, based on exchange's local accounting standards"
|
786
|
+
footnote2="*** ROx/EM/turnover rates are based on periodic mean, others on end-term"
|
772
787
|
footnote3="*** Data source: Yahoo Finance, "+todaydt
|
773
788
|
print('\n',footnote1,'\n',footnote2,'\n',footnote3)
|
774
789
|
|
@@ -841,6 +856,8 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
841
856
|
df2=df.copy()
|
842
857
|
df2[name1]=df2[name1].apply(lambda x: x * scale1)
|
843
858
|
df2[name2]=df2[name2].apply(lambda x: x * scale2)
|
859
|
+
|
860
|
+
fin_period=df2['endDate'].values[0]
|
844
861
|
|
845
862
|
f,ax1 = plt.subplots(1,figsize=(10,5))
|
846
863
|
w = 0.75
|
@@ -860,9 +877,9 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
860
877
|
plt.ylabel("Items (Amplified)")
|
861
878
|
|
862
879
|
footnote1="[Bar amplifier] "+name1+':x'+str(scale1)+','+name2+':x'+str(scale2)
|
863
|
-
footnote2='Financial statement period: '+
|
880
|
+
footnote2='Financial statement period: '+fin_period+'. Bar height does not indicate ROE value.'
|
864
881
|
footnote3="Data source: Yahoo Finance,"+todaydt
|
865
|
-
footnote ='\n'+footnote1+'\n'+footnote2+'
|
882
|
+
footnote ='\n'+footnote1+'\n'+footnote2+'\n'+footnote3
|
866
883
|
plt.xlabel(footnote,fontsize=10)
|
867
884
|
|
868
885
|
plt.legend(loc='best',fontsize=10)
|
@@ -882,10 +899,13 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
882
899
|
except:
|
883
900
|
continue
|
884
901
|
|
902
|
+
for d in list(df):
|
903
|
+
df[d]=df[d].apply(lambda x: round(x,5) if isinstance(x,float) else x)
|
904
|
+
|
885
905
|
alignlist=['left']+['right']*(len(list(df))-1)
|
886
906
|
print(df.to_markdown(tablefmt='plain',index=False,colalign=alignlist))
|
887
907
|
|
888
|
-
footnote1="*** Based on exchange's local accounting standards"
|
908
|
+
footnote1="*** Based on exchange's local accounting standards, EM/TAT are on periodic mean"
|
889
909
|
footnote2="Data source: Yahoo Finance, "+todaydt
|
890
910
|
print('\n',footnote1,'\b.',footnote2)
|
891
911
|
|
@@ -897,5 +917,32 @@ def fs_analysis(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
897
917
|
|
898
918
|
|
899
919
|
#==============================================================================
|
920
|
+
|
921
|
+
if __name__ == '__main__':
|
922
|
+
sort_column='Item'
|
923
|
+
priorityList=['periodType']
|
924
|
+
|
925
|
+
df_sort_priority_list(df,sort_column='Item',priorityList=['periodType'],ascending=True)
|
926
|
+
df_sort_priority_list(df,sort_column='Item',priorityList=['periodType'],ascending=False)
|
927
|
+
|
928
|
+
def df_sort_priority_list(df,sort_column='',priorityList=[],ascending=True):
|
929
|
+
"""
|
930
|
+
功能:为df排序,但保持某些优先项目按顺序排在前面
|
931
|
+
"""
|
932
|
+
if sort_column == '': #无需排序
|
933
|
+
return df
|
934
|
+
|
935
|
+
if len(priorityList) > 0: # 存在优先项目
|
936
|
+
df['priority_seq']=df[sort_column].apply(lambda x: priorityList.index(x) if x in priorityList else 9)
|
937
|
+
|
938
|
+
df.sort_values(by=['priority_seq',sort_column],ascending=[True,ascending],inplace=True)
|
939
|
+
|
940
|
+
df.drop('priority_seq',axis=1,inplace=True) #删除列
|
941
|
+
else:
|
942
|
+
df.sort_values(by=[sort_column],ascending=ascending,inplace=True)
|
943
|
+
|
944
|
+
return df
|
945
|
+
|
946
|
+
|
900
947
|
#==============================================================================
|
901
948
|
#==============================================================================
|
@@ -33,11 +33,11 @@ siat/exchange_bond_china.pickle,sha256=78r6E3vPFZlCYPcmS1asgVbe0FGAxsCWaw8ek42Sd
|
|
33
33
|
siat/fama_french.py,sha256=tNtr0WRyPxDbgN6Nu_ZnDtVC-RIiQfh6w0JiPjevWa0,47538
|
34
34
|
siat/fama_french_test.py,sha256=M4O23lBKsJxhWHRluwCb3l7HSEn3OFTjzGMpehcevRg,4678
|
35
35
|
siat/financial_base.py,sha256=j961-1YS9qBl6LmOzI4gCOpdTmk0d1JgNXMzLmV-lrs,41062
|
36
|
-
siat/financial_statements.py,sha256=
|
36
|
+
siat/financial_statements.py,sha256=luukwpaUnOAbHBdL20WobLeREOfe-soe-qFJSejsIFs,25361
|
37
37
|
siat/financial_statements_test.py,sha256=FLhx8JD-tVVWSBGux6AMz1jioXX4U4bp9DmgFHYXb_w,716
|
38
|
-
siat/financials.py,sha256=
|
38
|
+
siat/financials.py,sha256=RMHdzV8Vf8F2RfhboIwlApGBMtAA3NL_m0xbEl-a0ro,80443
|
39
39
|
siat/financials2 - 副本.py,sha256=dKlNjIfKeoSy055fQ6E6TUj9HEoO5Ney9grD84J5kfk,14389
|
40
|
-
siat/financials2.py,sha256=
|
40
|
+
siat/financials2.py,sha256=_RVb-9q7cV74jWpyLQlNcqPT0pOwyqwdouMi_V2hJnQ,40750
|
41
41
|
siat/financials_china.py,sha256=nUSPS4SDLP1RaOZF6uIvel8pFl3X_aBO_I0Opl1O8RI,177685
|
42
42
|
siat/financials_china2.py,sha256=12wgmTz1iV7N3IKm6Z0b6_punUzlkBMQ8I8yqvBsScU,73675
|
43
43
|
siat/financials_china2_test.py,sha256=Erz5k4LyOplBBvYls2MypuqHpVNJ3daiLdyeJezNPu0,2722
|
@@ -125,7 +125,7 @@ siat/valuation.py,sha256=3VKrO9b9xY9dOJGGuF0ZhytzB5d2pCx3kO3TtMml7mo,44025
|
|
125
125
|
siat/valuation_china.py,sha256=oEQRrktJNHiOG1mJSQN1aSSQAQrwrg-ppIHyNVjMjNg,67603
|
126
126
|
siat/valuation_market_china_test.py,sha256=gbJ0ioauuo4koTPH6WKUkqcXiQPafnbhU5eKJ6lpdLA,1571
|
127
127
|
siat/var_model_validation.py,sha256=zB_Skk_tmzIR15l6oAW3am4HBGVIG-eZ8gJhCdXZ8Qw,14859
|
128
|
-
siat-2.12.
|
129
|
-
siat-2.12.
|
130
|
-
siat-2.12.
|
131
|
-
siat-2.12.
|
128
|
+
siat-2.12.14.dist-info/METADATA,sha256=_6DCyj3gCXtCzZDYh9eSfvqp8u6XTe6RT5BKrEQ5qsA,1367
|
129
|
+
siat-2.12.14.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
|
130
|
+
siat-2.12.14.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
|
131
|
+
siat-2.12.14.dist-info/RECORD,,
|
File without changes
|
File without changes
|