siat 3.7.29__py3-none-any.whl → 3.8.1__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/allin.py +2 -0
- siat/common.py +19 -1
- siat/economy2.py +914 -0
- siat/grafix.py +128 -35
- siat/stock.py +1 -1
- siat/translate.py +280 -5
- {siat-3.7.29.dist-info → siat-3.8.1.dist-info}/METADATA +1 -1
- {siat-3.7.29.dist-info → siat-3.8.1.dist-info}/RECORD +11 -10
- {siat-3.7.29.dist-info → siat-3.8.1.dist-info}/LICENSE +0 -0
- {siat-3.7.29.dist-info → siat-3.8.1.dist-info}/WHEEL +0 -0
- {siat-3.7.29.dist-info → siat-3.8.1.dist-info}/top_level.txt +0 -0
siat/grafix.py
CHANGED
@@ -124,7 +124,7 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
|
|
124
124
|
resample_freq='H',loc='best', \
|
125
125
|
date_range=False,date_freq=False,date_fmt='%Y-%m-%d', \
|
126
126
|
mark_top=True,mark_bottom=True,mark_end=True, \
|
127
|
-
facecolor='whitesmoke'):
|
127
|
+
facecolor='whitesmoke',maxticks=10,translate=False):
|
128
128
|
"""
|
129
129
|
功能:绘制折线图。如果power=0不绘制趋势图,否则绘制多项式趋势图
|
130
130
|
假定:数据表有索引,且已经按照索引排序
|
@@ -136,6 +136,8 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
|
|
136
136
|
注意1:需要日期类型作为df索引
|
137
137
|
注意2:date_freq不为False时,必须设置date_range=True,否则无法完成日期设置!
|
138
138
|
"""
|
139
|
+
DEBUG=False
|
140
|
+
|
139
141
|
import pandas as pd
|
140
142
|
|
141
143
|
#空值判断
|
@@ -176,6 +178,10 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
|
|
176
178
|
lwadjust=linewidth_adjust(df)
|
177
179
|
|
178
180
|
#if 'filled' not in list(df):
|
181
|
+
if translate:
|
182
|
+
collabel=lang_auto2(collabel)
|
183
|
+
|
184
|
+
if DEBUG: print(f"df.index: {df.index}")
|
179
185
|
plt.plot(df.index,df[colname],'-',label=collabel, \
|
180
186
|
linestyle='-',color='blue', linewidth=lwadjust)
|
181
187
|
"""
|
@@ -243,7 +249,7 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
|
|
243
249
|
x_end = df_end[colname].idxmin() # 末端值的x坐标
|
244
250
|
|
245
251
|
#y1=str(int(y_end)) if y_end >= 100 else str(round(y_end,2))
|
246
|
-
y1=str(round(y_end,
|
252
|
+
y1=str(round(y_end,1)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 1 else str(round(y_end,3))
|
247
253
|
plt.annotate(text=' '+y1,
|
248
254
|
xy=(x_end, y_end),
|
249
255
|
xytext=(x_end, y_end),fontsize=annotate_size)
|
@@ -286,6 +292,7 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
|
|
286
292
|
plt.fill_between(df.index,attention_value_area[0],attention_value_area[1],color='lightgray',alpha=0.5)
|
287
293
|
|
288
294
|
import pandas as pd
|
295
|
+
from datetime import datetime; date_format="%Y-%m-%d"
|
289
296
|
if not attention_point=='':
|
290
297
|
if isinstance(attention_point,str) or isinstance(attention_point,int) or isinstance(attention_point,float):
|
291
298
|
atp_list=[attention_point]
|
@@ -304,9 +311,12 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
|
|
304
311
|
|
305
312
|
#判断是否日期字符串
|
306
313
|
try:
|
314
|
+
#at=datetime.strptime(at, date_format)
|
307
315
|
atpd=pd.to_datetime(at)
|
308
316
|
except:
|
309
317
|
atpd=at
|
318
|
+
|
319
|
+
if DEBUG: print(f"atpd={atpd}")
|
310
320
|
plt.axvline(x=atpd,ls=":",c=color,linewidth=1.5,label=text_lang("关注点","Attention point ")+str(at))
|
311
321
|
|
312
322
|
if not attention_point_area=='':
|
@@ -314,12 +324,18 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
|
|
314
324
|
apa_list=[]
|
315
325
|
for ap in attention_point_area:
|
316
326
|
try:
|
327
|
+
#ap=datetime.strptime(ap, date_format)
|
317
328
|
appd=pd.to_datetime(ap)
|
318
329
|
except:
|
319
330
|
appd=ap
|
320
331
|
apa_list=apa_list+[appd]
|
321
332
|
|
322
333
|
yaxis_data=plt.ylim()
|
334
|
+
|
335
|
+
if DEBUG:
|
336
|
+
print(f"yaxis_data={yaxis_data}")
|
337
|
+
print(f"apa_list[0]={apa_list[0]}")
|
338
|
+
print(f"apa_list[1]={apa_list[1]}")
|
323
339
|
plt.fill_betweenx(yaxis_data,apa_list[0],apa_list[1],color='powderblue',alpha=0.5)
|
324
340
|
|
325
341
|
if average_value:
|
@@ -352,7 +368,11 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
|
|
352
368
|
if ylabeltxt != '' or average_value or isinstance(zeroline,bool):
|
353
369
|
if haveLegend:
|
354
370
|
plt.legend(loc=loc,fontsize=legend_txt_size)
|
355
|
-
|
371
|
+
|
372
|
+
# 使用 AutoDateLocator 自动选择最佳间隔,目的是显示最后一个日期,亲测有效!!!
|
373
|
+
import matplotlib.dates as mdates
|
374
|
+
ax.xaxis.set_major_locator(mdates.AutoDateLocator(maxticks=maxticks))
|
375
|
+
|
356
376
|
plt.gcf().autofmt_xdate(ha="center") # 优化标注(自动倾斜)
|
357
377
|
try:
|
358
378
|
plt.gca().set_facecolor(facecolor) #设置画布背景颜色
|
@@ -362,6 +382,11 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
|
|
362
382
|
|
363
383
|
if '基金' in titletxt and '收盘价' in ylabeltxt and not ('基金指数' in titletxt):
|
364
384
|
ylabeltxt=ylabeltxt.replace('收盘价','单位净值')
|
385
|
+
|
386
|
+
if translate:
|
387
|
+
ylabeltxt=lang_auto2(ylabeltxt)
|
388
|
+
footnote=lang_auto2(footnote)
|
389
|
+
titletxt=lang_auto2(titletxt)
|
365
390
|
|
366
391
|
plt.ylabel(ylabeltxt,fontsize=ylabel_txt_size)
|
367
392
|
plt.xlabel(footnote,fontsize=xlabel_txt_size,ha='center')
|
@@ -610,6 +635,7 @@ def plot_line2_coaxial(df01,ticker1,colname1,label1, \
|
|
610
635
|
|
611
636
|
#是否绘制垂直线
|
612
637
|
import pandas as pd
|
638
|
+
from datetime import datetime; date_format="%Y-%m-%d"
|
613
639
|
if xline != 999:
|
614
640
|
attention_point=xline
|
615
641
|
#用于关注点的颜色列表
|
@@ -633,6 +659,7 @@ def plot_line2_coaxial(df01,ticker1,colname1,label1, \
|
|
633
659
|
|
634
660
|
#判断是否日期字符串
|
635
661
|
try:
|
662
|
+
at=datetime.strptime(at, date_format)
|
636
663
|
atpd=pd.to_datetime(at)
|
637
664
|
except:
|
638
665
|
atpd=at
|
@@ -647,6 +674,7 @@ def plot_line2_coaxial(df01,ticker1,colname1,label1, \
|
|
647
674
|
apa_list=[]
|
648
675
|
for ap in attention_point_area:
|
649
676
|
try:
|
677
|
+
ap=datetime.strptime(ap, date_format)
|
650
678
|
appd=pd.to_datetime(ap)
|
651
679
|
except:
|
652
680
|
appd=ap
|
@@ -869,6 +897,7 @@ def plot_line2_coaxial2(df01,ticker1,colname1,label1, \
|
|
869
897
|
|
870
898
|
#是否绘制垂直线
|
871
899
|
import pandas as pd
|
900
|
+
from datetime import datetime; date_format="%Y-%m-%d"
|
872
901
|
if xline != 999:
|
873
902
|
attention_point=xline
|
874
903
|
#用于关注点的颜色列表
|
@@ -891,6 +920,7 @@ def plot_line2_coaxial2(df01,ticker1,colname1,label1, \
|
|
891
920
|
|
892
921
|
#判断是否日期字符串
|
893
922
|
try:
|
923
|
+
at=datetime.strptime(at, date_format)
|
894
924
|
atpd=pd.to_datetime(at)
|
895
925
|
except:
|
896
926
|
atpd=at
|
@@ -905,6 +935,7 @@ def plot_line2_coaxial2(df01,ticker1,colname1,label1, \
|
|
905
935
|
apa_list=[]
|
906
936
|
for ap in attention_point_area:
|
907
937
|
try:
|
938
|
+
ap=datetime.strptime(ap, date_format)
|
908
939
|
appd=pd.to_datetime(ap)
|
909
940
|
except:
|
910
941
|
appd=ap
|
@@ -1073,6 +1104,7 @@ def plot_line2_twinx(df01,ticker1,colname1,label1, \
|
|
1073
1104
|
|
1074
1105
|
#绘制关注点
|
1075
1106
|
import pandas as pd
|
1107
|
+
from datetime import datetime; date_format="%Y-%m-%d"
|
1076
1108
|
if xline != 999:
|
1077
1109
|
attention_point=xline
|
1078
1110
|
|
@@ -1100,6 +1132,7 @@ def plot_line2_twinx(df01,ticker1,colname1,label1, \
|
|
1100
1132
|
|
1101
1133
|
#判断是否日期字符串
|
1102
1134
|
try:
|
1135
|
+
at=datetime.strptime(at, date_format)
|
1103
1136
|
atpd=pd.to_datetime(at)
|
1104
1137
|
except:
|
1105
1138
|
atpd=at
|
@@ -1110,6 +1143,7 @@ def plot_line2_twinx(df01,ticker1,colname1,label1, \
|
|
1110
1143
|
apa_list=[]
|
1111
1144
|
for ap in attention_point_area:
|
1112
1145
|
try:
|
1146
|
+
ap=datetime.strptime(ap, date_format)
|
1113
1147
|
appd=pd.to_datetime(ap)
|
1114
1148
|
except:
|
1115
1149
|
appd=ap
|
@@ -1304,6 +1338,7 @@ def plot_line2_twinx2(df01,ticker1,colname1,label1, \
|
|
1304
1338
|
|
1305
1339
|
#绘制关注点
|
1306
1340
|
import pandas as pd
|
1341
|
+
from datetime import datetime; date_format="%Y-%m-%d"
|
1307
1342
|
if xline != 999:
|
1308
1343
|
attention_point=xline
|
1309
1344
|
|
@@ -1331,6 +1366,7 @@ def plot_line2_twinx2(df01,ticker1,colname1,label1, \
|
|
1331
1366
|
|
1332
1367
|
#判断是否日期字符串
|
1333
1368
|
try:
|
1369
|
+
at=datetime.strptime(at, date_format)
|
1334
1370
|
atpd=pd.to_datetime(at)
|
1335
1371
|
except:
|
1336
1372
|
atpd=at
|
@@ -1341,6 +1377,7 @@ def plot_line2_twinx2(df01,ticker1,colname1,label1, \
|
|
1341
1377
|
apa_list=[]
|
1342
1378
|
for ap in attention_point_area:
|
1343
1379
|
try:
|
1380
|
+
ap=datetime.strptime(ap, date_format)
|
1344
1381
|
appd=pd.to_datetime(ap)
|
1345
1382
|
except:
|
1346
1383
|
appd=ap
|
@@ -1478,11 +1515,12 @@ if __name__ =="__main__":
|
|
1478
1515
|
|
1479
1516
|
def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
1480
1517
|
data_label=True,resample_freq='H',smooth=True,linewidth=1.5, \
|
1481
|
-
loc='best',
|
1518
|
+
band_area='',loc='best', \
|
1519
|
+
annotate=False,annotate_value=False,plus_sign=False, \
|
1482
1520
|
attention_value='',attention_value_area='', \
|
1483
1521
|
attention_point='',attention_point_area='', \
|
1484
1522
|
mark_top=False,mark_bottom=False,mark_end=False, \
|
1485
|
-
ticker_type='auto',facecolor='whitesmoke'):
|
1523
|
+
ticker_type='auto',facecolor='whitesmoke',maxticks=10,translate=False):
|
1486
1524
|
"""
|
1487
1525
|
函数功能:根据df的内容绘制折线图
|
1488
1526
|
输入参数:
|
@@ -1500,6 +1538,10 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1500
1538
|
注意:需要日期类型作为df索引
|
1501
1539
|
"""
|
1502
1540
|
DEBUG=False
|
1541
|
+
if DEBUG:
|
1542
|
+
print(f"band_area={band_area}")
|
1543
|
+
print(f"df0={df0}")
|
1544
|
+
|
1503
1545
|
|
1504
1546
|
if DEBUG:
|
1505
1547
|
print("annotate=",annotate,"annotate_value=",annotate_value)
|
@@ -1552,6 +1594,7 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1552
1594
|
firstline=True
|
1553
1595
|
|
1554
1596
|
#绘制折线图
|
1597
|
+
ax=plt.gca()
|
1555
1598
|
print('')
|
1556
1599
|
y_end_list=[]
|
1557
1600
|
for c in collist:
|
@@ -1598,7 +1641,7 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1598
1641
|
clabel=c+str(round(dfg[c].values[0],2))
|
1599
1642
|
else:
|
1600
1643
|
clabel=c
|
1601
|
-
plt.plot(dfg,label=clabel,linewidth=lwadjust,ls=lsc,marker=mkc,markersize=3)
|
1644
|
+
plt.plot(dfg,label=auto_translate2(clabel,translate),linewidth=lwadjust,ls=lsc,marker=mkc,markersize=3)
|
1602
1645
|
else:
|
1603
1646
|
plt.plot(dfg,linewidth=lwadjust,ls=lsc,marker=mkc,markersize=3)
|
1604
1647
|
|
@@ -1615,12 +1658,12 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1615
1658
|
if annotate_value: #在标记曲线名称的同时标记其末端数值
|
1616
1659
|
#y1=str(int(y_end)) if y_end >= 100 else str(round(y_end,2))
|
1617
1660
|
y1=str(round(y_end,2)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 1 else str(round(y_end,3))
|
1618
|
-
plt.annotate(text=c+':'+y1,
|
1661
|
+
plt.annotate(text=' '+auto_translate2(c,translate)+':'+y1,
|
1619
1662
|
xy=(x_end, y_end),
|
1620
1663
|
xytext=(x_end, y_end),fontsize=annotate_size,
|
1621
1664
|
color=last_line_color)
|
1622
1665
|
else:
|
1623
|
-
plt.annotate(text=c,
|
1666
|
+
plt.annotate(text=' '+auto_translate2(c,translate),
|
1624
1667
|
xy=(x_end, y_end),
|
1625
1668
|
#xytext=(x_end, y_end),fontsize=9)
|
1626
1669
|
xytext=(x_end, y_end),fontsize=annotate_size,
|
@@ -1669,7 +1712,7 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1669
1712
|
x_end = df_end[c].idxmin() # 末端值的x坐标
|
1670
1713
|
|
1671
1714
|
#y1=str(int(y_end)) if y_end >= 100 else str(round(y_end,2))
|
1672
|
-
y1=str(round(y_end,
|
1715
|
+
y1=str(round(y_end,1)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 1 else str(round(y_end,3))
|
1673
1716
|
plt.annotate(text=' '+y1,
|
1674
1717
|
xy=(x_end, y_end),
|
1675
1718
|
xytext=(x_end, y_end),fontsize=annotate_size,
|
@@ -1696,8 +1739,35 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1696
1739
|
if not attention_value_area=='':
|
1697
1740
|
if isinstance(attention_value_area,list) and len(attention_value_area)>=2:
|
1698
1741
|
plt.fill_between(dfg.index,attention_value_area[0],attention_value_area[1],color='lightgray',alpha=0.5)
|
1742
|
+
|
1743
|
+
#绘制曲线之间的带状区域
|
1744
|
+
if DEBUG:
|
1745
|
+
print(f"dfg={dfg}")
|
1746
|
+
|
1747
|
+
if band_area != '' and isinstance(band_area,list) and len(band_area)>=2:
|
1748
|
+
upper_line=band_area[0]; lower_line=band_area[1]
|
1749
|
+
if upper_line not in collist:
|
1750
|
+
upper_line=ectranslate(upper_line)
|
1751
|
+
lower_line=ectranslate(lower_line)
|
1699
1752
|
|
1700
|
-
|
1753
|
+
if upper_line not in collist:
|
1754
|
+
upper_line=ticker_name(upper_line)
|
1755
|
+
lower_line=ticker_name(lower_line)
|
1756
|
+
|
1757
|
+
if upper_line not in collist:
|
1758
|
+
upper_line=None
|
1759
|
+
lower_line=None
|
1760
|
+
|
1761
|
+
if not (upper_line is None) and not (lower_line is None):
|
1762
|
+
try:
|
1763
|
+
plt.fill_between(df2.index,df2[upper_line],df2[lower_line],df2[upper_line] > df2[lower_line],color='aquamarine',alpha=0.5,label='',interpolate=True)
|
1764
|
+
plt.fill_between(df2.index,df2[upper_line],df2[lower_line],df2[upper_line] < df2[lower_line],color='lightcoral',alpha=0.5,label='',interpolate=True)
|
1765
|
+
except:
|
1766
|
+
print(f" #Warning(draw_lines): band area elements {upper_line} or {lower_line} not found")
|
1767
|
+
|
1768
|
+
import pandas as pd
|
1769
|
+
from datetime import datetime; date_format="%Y-%m-%d"
|
1770
|
+
from datetime import datetime; date_format="%Y-%m-%d"
|
1701
1771
|
if not attention_point=='':
|
1702
1772
|
if isinstance(attention_point,str) or isinstance(attention_point,int) or isinstance(attention_point,float):
|
1703
1773
|
atp_list=[attention_point]
|
@@ -1721,10 +1791,13 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1721
1791
|
|
1722
1792
|
color=atp_color_list[-1]
|
1723
1793
|
|
1724
|
-
#判断是否日期字符串
|
1725
1794
|
try:
|
1795
|
+
#判断是否日期字符串
|
1796
|
+
at=datetime.strptime(at, date_format)
|
1797
|
+
#若是日期字符串
|
1726
1798
|
atpd=pd.to_datetime(at)
|
1727
1799
|
except:
|
1800
|
+
#不是日期字符串
|
1728
1801
|
atpd=at
|
1729
1802
|
|
1730
1803
|
"""
|
@@ -1752,6 +1825,7 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1752
1825
|
apa_list=[]
|
1753
1826
|
for ap in attention_point_area:
|
1754
1827
|
try:
|
1828
|
+
ap=datetime.strptime(ap, date_format)
|
1755
1829
|
appd=pd.to_datetime(ap)
|
1756
1830
|
except:
|
1757
1831
|
appd=ap
|
@@ -1764,19 +1838,23 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1764
1838
|
if axhline_label !="":
|
1765
1839
|
if '零线' in axhline_label:
|
1766
1840
|
axhline_label=''
|
1767
|
-
plt.axhline(y=axhline_value,label=axhline_label,color='black',linestyle=':',linewidth=2)
|
1841
|
+
plt.axhline(y=axhline_value,label=auto_translate2(axhline_label,translate),color='black',linestyle=':',linewidth=2)
|
1768
1842
|
#plt.axhline(y=axhline_value,color='purple',linestyle=':',linewidth=1.5)
|
1769
1843
|
|
1770
1844
|
#坐标轴标记
|
1771
1845
|
y_label_t=ectranslate(y_label)
|
1772
|
-
plt.ylabel(y_label_t,fontweight='bold',fontsize=ylabel_txt_size)
|
1846
|
+
plt.ylabel(auto_translate2(y_label_t,translate),fontweight='bold',fontsize=ylabel_txt_size)
|
1773
1847
|
|
1774
1848
|
x_label_t=ectranslate(x_label)
|
1775
1849
|
if x_label != "":
|
1776
|
-
plt.xlabel(x_label_t,fontweight='bold',fontsize=xlabel_txt_size,ha='center')
|
1850
|
+
plt.xlabel(auto_translate2(x_label_t,translate),fontweight='bold',fontsize=xlabel_txt_size,ha='center')
|
1777
1851
|
#图示标题
|
1778
|
-
plt.title(title_txt,fontweight='bold',fontsize=title_txt_size)
|
1852
|
+
plt.title(auto_translate2(title_txt,translate),fontweight='bold',fontsize=title_txt_size)
|
1779
1853
|
|
1854
|
+
# 使用 AutoDateLocator 自动选择最佳间隔,目的是显示最后一个日期,亲测有效!!!
|
1855
|
+
import matplotlib.dates as mdates
|
1856
|
+
ax.xaxis.set_major_locator(mdates.AutoDateLocator(maxticks=maxticks))
|
1857
|
+
|
1780
1858
|
plt.gcf().autofmt_xdate(ha="center") # 优化标注(自动倾斜)
|
1781
1859
|
try:
|
1782
1860
|
plt.gca().set_facecolor(facecolor)
|
@@ -1822,7 +1900,7 @@ if __name__=='__main__':
|
|
1822
1900
|
|
1823
1901
|
#==============================================================================
|
1824
1902
|
def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
1825
|
-
data_label=False,resample_freq='
|
1903
|
+
data_label=False,resample_freq='1D',smooth=True, \
|
1826
1904
|
date_range=False,date_freq=False,date_fmt='%Y-%m-%d', \
|
1827
1905
|
colorlist=[],lslist=[],lwlist=[], \
|
1828
1906
|
#指定纵轴两个变量之间的区域
|
@@ -1835,7 +1913,7 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1835
1913
|
attention_point_area='', \
|
1836
1914
|
annotate=False,annotate_value=False, \
|
1837
1915
|
mark_top=False,mark_bottom=False,mark_end=False, \
|
1838
|
-
facecolor='whitesmoke'):
|
1916
|
+
facecolor='whitesmoke',maxticks=10,translate=False):
|
1839
1917
|
"""
|
1840
1918
|
函数功能:根据df的内容绘制折线图
|
1841
1919
|
输入参数:
|
@@ -1858,6 +1936,9 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1858
1936
|
"""
|
1859
1937
|
import pandas as pd
|
1860
1938
|
DEBUG=False
|
1939
|
+
if DEBUG:
|
1940
|
+
print(f"band_area={band_area}")
|
1941
|
+
print(f"df0={df0}")
|
1861
1942
|
|
1862
1943
|
#空值判断
|
1863
1944
|
if len(df0) ==0:
|
@@ -1927,17 +2008,17 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1927
2008
|
|
1928
2009
|
if (lcolor !='') and (lls !=''):
|
1929
2010
|
if not annotate:
|
1930
|
-
plt.plot(df[c],label=c,linewidth=llw,ls=lls,color=lcolor)
|
2011
|
+
plt.plot(df[c],label=auto_translate2(c,translate),linewidth=llw,ls=lls,color=lcolor)
|
1931
2012
|
else:
|
1932
2013
|
plt.plot(df[c],linewidth=llw,ls=lls,color=lcolor)
|
1933
2014
|
elif (lcolor !=''):
|
1934
2015
|
if not annotate:
|
1935
|
-
plt.plot(df[c],label=c,linewidth=llw,color=lcolor)
|
2016
|
+
plt.plot(df[c],label=auto_translate2(c,translate),linewidth=llw,color=lcolor)
|
1936
2017
|
else:
|
1937
2018
|
plt.plot(df[c],linewidth=llw,color=lcolor)
|
1938
2019
|
else:
|
1939
2020
|
if not annotate:
|
1940
|
-
plt.plot(df[c],label=c,linewidth=llw)
|
2021
|
+
plt.plot(df[c],label=auto_translate2(c,translate),linewidth=llw)
|
1941
2022
|
else:
|
1942
2023
|
plt.plot(df[c],linewidth=llw)
|
1943
2024
|
|
@@ -1987,12 +2068,12 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
1987
2068
|
if annotate_value: #在标记曲线名称的同时标记其末端数值
|
1988
2069
|
#y1=str(int(y_end)) if y_end >= 100 else str(round(y_end,2))
|
1989
2070
|
y1=str(int(y_end)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 10 else str(round(y_end,4))
|
1990
|
-
plt.annotate(text=c+':'+y1,
|
2071
|
+
plt.annotate(text=auto_translate2(c,translate)+':'+y1,
|
1991
2072
|
xy=(x_end, y_end),
|
1992
2073
|
xytext=(x_end, y_end),fontsize=annotate_size,
|
1993
2074
|
color=last_line_color)
|
1994
2075
|
else:
|
1995
|
-
plt.annotate(text=c,
|
2076
|
+
plt.annotate(text=auto_translate2(c,translate),
|
1996
2077
|
xy=(x_end, y_end),
|
1997
2078
|
xytext=(x_end, y_end),fontsize=annotate_size,
|
1998
2079
|
color=last_line_color)
|
@@ -2004,7 +2085,7 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
2004
2085
|
x_end = df_end[c].idxmin() # 末端值的x坐标
|
2005
2086
|
|
2006
2087
|
#y1=str(int(y_end)) if y_end >= 100 else str(round(y_end,2))
|
2007
|
-
y1=str(round(y_end,
|
2088
|
+
y1=str(round(y_end,1)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 1 else str(round(y_end,3))
|
2008
2089
|
plt.annotate(text=y1,
|
2009
2090
|
xy=(x_end, y_end),
|
2010
2091
|
xytext=(x_end, y_end),fontsize=annotate_size,
|
@@ -2026,15 +2107,19 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
2026
2107
|
lower_line=None
|
2027
2108
|
|
2028
2109
|
if not (upper_line is None) and not (lower_line is None):
|
2029
|
-
|
2030
|
-
|
2031
|
-
|
2032
|
-
|
2033
|
-
|
2034
|
-
|
2035
|
-
|
2036
|
-
|
2037
|
-
|
2110
|
+
try:
|
2111
|
+
"""
|
2112
|
+
plt.fill_between(df.index,df[upper_line],df[lower_line],color='moccasin',alpha=0.5,label='',where=df[upper_line]>=df[lower_line])
|
2113
|
+
plt.fill_between(df.index,df[upper_line],df[lower_line],color='aquamarine',alpha=0.5,label='',where=df[upper_line]<=df[lower_line])
|
2114
|
+
"""
|
2115
|
+
#plt.fill_between(df.index,df[upper_line],df[lower_line],color='aquamarine',alpha=0.5,label='')
|
2116
|
+
plt.fill_between(df.index,df[upper_line],df[lower_line],df[upper_line] > df[lower_line],color='aquamarine',alpha=0.5,label='',interpolate=True)
|
2117
|
+
plt.fill_between(df.index,df[upper_line],df[lower_line],df[upper_line] < df[lower_line],color='lightcoral',alpha=0.5,label='',interpolate=True)
|
2118
|
+
#plt.fill_between(df.index,df[upper_line],df[lower_line],df[upper_line] == df[lower_line],color='lightgray',alpha=0.5,label='')
|
2119
|
+
except:
|
2120
|
+
print(f" #Warning(draw_lines2): lack of data for either {upper_line} or {lower_line}")
|
2121
|
+
#return None
|
2122
|
+
|
2038
2123
|
#绘制水平辅助线
|
2039
2124
|
if axhline_label !="":
|
2040
2125
|
if DEBUG:
|
@@ -2068,6 +2153,7 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
2068
2153
|
plt.fill_between(df.index,attention_value_area[0],attention_value_area[1],color='lightgray',alpha=0.5)
|
2069
2154
|
|
2070
2155
|
import pandas as pd
|
2156
|
+
from datetime import datetime; date_format="%Y-%m-%d"
|
2071
2157
|
if not attention_point=='':
|
2072
2158
|
if isinstance(attention_point,str) or isinstance(attention_point,int) or isinstance(attention_point,float):
|
2073
2159
|
atp_list=[attention_point]
|
@@ -2085,6 +2171,7 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
2085
2171
|
|
2086
2172
|
#判断是否日期字符串
|
2087
2173
|
try:
|
2174
|
+
at=datetime.strptime(at, date_format)
|
2088
2175
|
atpd=pd.to_datetime(at)
|
2089
2176
|
except:
|
2090
2177
|
atpd=at
|
@@ -2095,6 +2182,7 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
2095
2182
|
apa_list=[]
|
2096
2183
|
for ap in attention_point_area:
|
2097
2184
|
try:
|
2185
|
+
ap=datetime.strptime(ap, date_format)
|
2098
2186
|
appd=pd.to_datetime(ap)
|
2099
2187
|
except:
|
2100
2188
|
appd=ap
|
@@ -2104,11 +2192,16 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
|
2104
2192
|
plt.fill_betweenx(yaxis_data,apa_list[0],apa_list[1],color='powderblue',alpha=0.5)
|
2105
2193
|
|
2106
2194
|
#坐标轴标记
|
2107
|
-
plt.ylabel(y_label,fontweight='bold',fontsize=ylabel_txt_size)
|
2195
|
+
plt.ylabel(auto_translate2(y_label,translate),fontweight='bold',fontsize=ylabel_txt_size)
|
2108
2196
|
if x_label != "":
|
2109
|
-
plt.xlabel(x_label,fontweight='bold',fontsize=xlabel_txt_size,ha='center')
|
2197
|
+
plt.xlabel(auto_translate2(x_label,translate),fontweight='bold',fontsize=xlabel_txt_size,ha='center')
|
2110
2198
|
#图示标题
|
2111
|
-
plt.title(title_txt,fontweight='bold',fontsize=title_txt_size)
|
2199
|
+
plt.title(auto_translate2(title_txt,translate),fontweight='bold',fontsize=title_txt_size)
|
2200
|
+
|
2201
|
+
# 使用 AutoDateLocator 自动选择最佳间隔,目的是显示最后一个日期,亲测有效!!!
|
2202
|
+
import matplotlib.dates as mdates
|
2203
|
+
ax.xaxis.set_major_locator(mdates.AutoDateLocator(maxticks=maxticks))
|
2204
|
+
|
2112
2205
|
plt.gcf().autofmt_xdate(ha="center") # 优化标注(自动倾斜)
|
2113
2206
|
try:
|
2114
2207
|
plt.gca().set_facecolor(facecolor)
|
siat/stock.py
CHANGED
@@ -987,7 +987,7 @@ def security_mindicators(ticker,measures,
|
|
987
987
|
titletxt=text_lang("证券趋势分析:","Security Trend: ")+ticker_name(ticker,ticker_type=ticker_type)
|
988
988
|
|
989
989
|
draw_lines2(df,y_label,x_label,axhline_value,axhline_label,titletxt, \
|
990
|
-
data_label=False,resample_freq='
|
990
|
+
data_label=False,resample_freq='1D',smooth=smooth, \
|
991
991
|
date_range=date_range,date_freq=date_freq,date_fmt='%Y-%m-%d', \
|
992
992
|
attention_value=attention_value,attention_value_area=attention_value_area, \
|
993
993
|
attention_point=attention_point,attention_point_area=attention_point_area, \
|