siat 3.2.25__py3-none-any.whl → 3.2.30__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 CHANGED
@@ -120,3 +120,6 @@ from siat.stock_technical import *
120
120
  # 2FA: Google Authenticator
121
121
  from siat.google_authenticator import *
122
122
 
123
+ # 提问记录
124
+ from siat.luchy_draw import *
125
+
siat/luchy_draw.py ADDED
@@ -0,0 +1,252 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ """
4
+ 本模块功能:幸运抽奖,仅限课堂案例演示用
5
+ 创建日期:2024年6月29日
6
+ 最新修订日期:
7
+ 作者:王德宏 (WANG Dehong, Peter)
8
+ 作者单位:北京外国语大学国际商学院
9
+ 用途限制:仅限研究与教学使用,不可商用!商用需要额外授权。
10
+ 特别声明:作者不对使用本工具进行证券投资导致的任何损益负责!
11
+ """
12
+
13
+ #==============================================================================
14
+ #关闭所有警告
15
+ import warnings; warnings.filterwarnings('ignore')
16
+ import warnings; warnings.filterwarnings('ignore')
17
+
18
+ import pandas as pd
19
+ import pickle
20
+ import random
21
+ import datetime
22
+ import time
23
+
24
+ #==============================================================================
25
+ if __name__=='__main__':
26
+ text="A B C"
27
+ text_color='red'
28
+ text_size=12
29
+ delay=1
30
+
31
+ typewriter(text,text_color='red',text_size=12,delay=1)
32
+
33
+ def typewriter(text,text_color='blue',text_size=12,delay=1):
34
+ from IPython.display import display_html
35
+
36
+ text_html="<center><font size="+str(text_size)+" color="+text_color+">"+text
37
+ display_html(text_html, raw=True)
38
+
39
+ return
40
+
41
+ #==============================================================================
42
+
43
+ def pickle_write(df,pickle_path):
44
+ with open(pickle_path, 'wb') as pickle_file:
45
+ # 使用pickle模块的dump函数写入对象
46
+ pickle.dump(df,pickle_file)
47
+
48
+ if __name__=='__main__':
49
+ file_path="S:\北外工作-24春\小学期-人大\学生名单\student_list.xlsx"
50
+ pickle_path="student_list.pkl"
51
+ skiprows=1
52
+ column='Name'
53
+
54
+ namelist_get(file_path,skiprows=1,column='Name',pickle_path="student_list.pkl")
55
+
56
+ def lucky_draw_initialize(file_path,skiprows=1,column='Name',pickle_path="student_list.pkl"):
57
+ """
58
+ 功能:读入带有指定路径的Excel文件file_path,跳过前skiprows行
59
+ Excel文件结构:抽奖名单字段为'Name',字段位于第2行
60
+ 输出:存入pickle文件student_list.pkl
61
+ """
62
+
63
+ df = pd.read_excel(file_path,skiprows=skiprows)
64
+
65
+ df1=df[[column]].copy()
66
+
67
+ todaydt = str(datetime.date.today())
68
+ df1['Date']=todaydt
69
+ df1['Lucky']=0
70
+ df1['Absent']=0
71
+ df1['Answer']=0
72
+
73
+ #排序
74
+ df1.sort_values(by=[column,'Date','Lucky','Absent','Answer'],inplace=True)
75
+ df1.reset_index(drop=True,inplace=True)
76
+
77
+ pickle_write(df1,pickle_path)
78
+
79
+ return
80
+
81
+ #==============================================================================
82
+ if __name__=='__main__':
83
+ pickle_path="student_list.pkl"
84
+
85
+ df=pickle_read(pickle_path)
86
+
87
+ def pickle_read(pickle_path="student_list.pkl"):
88
+ with open(pickle_path,'rb') as pickle_file:
89
+ df = pickle.load(pickle_file)
90
+ return df
91
+
92
+ #==============================================================================
93
+
94
+
95
+
96
+ def pickle_append(df,column='Name',pickle_path="student_list.pkl"):
97
+ df_tmp=pickle_read(pickle_path)
98
+ df_new=pd.concat([df_tmp,df])
99
+
100
+ df_new.sort_values(by=[column,'Date'],inplace=True)
101
+
102
+ pickle_write(df_new,pickle_path)
103
+
104
+ return
105
+
106
+ #==============================================================================
107
+ if __name__=='__main__':
108
+ alist=["A","B","C","D"]
109
+
110
+ for i in range(4):
111
+ print(random_select(alist))
112
+
113
+
114
+ def random_select(alist):
115
+ return random.choice(alist)
116
+
117
+ #==============================================================================
118
+
119
+ if __name__=='__main__':
120
+ prompt="Is the lucky person here in class?"
121
+
122
+ read_yes_no(prompt)
123
+
124
+
125
+ def read_yes_no(prompt, default=None):
126
+ if default is None:
127
+ prompt += " [yes/no] "
128
+ else:
129
+ prompt += " [yes/no] (default: %s) " % ('yes' if default else 'no')
130
+ while True:
131
+ user_input = input(prompt).lower()
132
+ if user_input in ['', 'yes', 'y', 'true']:
133
+ return True
134
+ elif user_input in ['no', 'n', 'false']:
135
+ return False
136
+ elif user_input == '' and default is not None:
137
+ return default
138
+ else:
139
+ print("Please enter 'yes' or 'no' (or 'y'/'n').")
140
+
141
+ return
142
+
143
+ #==============================================================================
144
+ if __name__=='__main__':
145
+ draw_limit=2
146
+ absent_limit=2
147
+ column='Name'
148
+ pickle_path="student_list.pkl"
149
+
150
+ lucky_draw()
151
+ df=pickle_read(pickle_path)
152
+
153
+
154
+ def lucky_draw(draw_limit=2,absent_limit=2,column='Name',pickle_path="student_list.pkl"):
155
+ """
156
+ draw_limit=2:整个课程每人最多2次抽签机会
157
+ absent_limit=2:整个课程每人最多缺席2次,超过就丧失抽签资格
158
+ """
159
+ df=pickle_read(pickle_path)
160
+
161
+ alist=list(set(list(df[column])))
162
+
163
+ found=False
164
+ todaydt = str(datetime.date.today())
165
+ prompt="*** Is the lucky person here on site?"
166
+ prompt2="*** Do you expect to pass?"
167
+
168
+ while True:
169
+ while True:
170
+ aname=random_select(alist)
171
+
172
+ adf=df[df[column]==aname]
173
+ atimes=adf['Lucky'].sum()
174
+ aonsite=adf['Absent'].sum()
175
+
176
+ if atimes < draw_limit and aonsite <= absent_limit:
177
+ #检查今日是否被抽中过
178
+ drew_today=False
179
+ try:
180
+ adf_today=adf[adf['Date']==todaydt]
181
+ if len(adf_today) > 0:
182
+ if adf_today['Lucky'].sum() > 0 or adf_today['Absent'].sum() > 0:
183
+ drew_today=True
184
+ except: pass
185
+
186
+ if not drew_today:
187
+ found=True
188
+ break
189
+ else: continue
190
+ else:
191
+ continue
192
+
193
+ if not found:
194
+ print("Congratulations! all person has been lucky for",limit,"times")
195
+ else:
196
+ """
197
+ print("\nThe lucky person is ",end='')
198
+ typewriter(aname,delay=1)
199
+ """
200
+ typewriter(text=aname,text_color='blue',text_size=12,delay=1)
201
+
202
+ #print('')
203
+ onsite=read_yes_no(prompt)
204
+ #是否到场
205
+ if onsite: absent=0
206
+ else: absent=1
207
+
208
+ onpass=False; answer=0
209
+ if onsite:
210
+ onpass=read_yes_no(prompt2)
211
+ #是否pass
212
+ if onpass: answer=0
213
+ else: answer=1
214
+
215
+ #只要抽中,不论是否到场都记录
216
+ row=pd.Series({column:aname,'Date':todaydt,'Lucky':1,'Absent':absent,'Answer':answer})
217
+ try:
218
+ df=df.append(row,ignore_index=True)
219
+ except:
220
+ df=df._append(row,ignore_index=True)
221
+
222
+ if onsite and not onpass:
223
+ #到场且不pass,结束本轮抽签
224
+ break
225
+ else:
226
+ #未到场或pass,继续抽签
227
+ continue
228
+
229
+ df.sort_values(by=[column,'Date'],inplace=True)
230
+ pickle_write(df,pickle_path)
231
+
232
+ return
233
+
234
+ #==============================================================================
235
+ #==============================================================================
236
+ #==============================================================================
237
+ #==============================================================================
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+ #==============================================================================#==============================================================================
249
+ #==============================================================================#==============================================================================
250
+ #==============================================================================#==============================================================================
251
+
252
+ #==============================================================================
siat/stock_technical.py CHANGED
@@ -188,8 +188,10 @@ def calc_technical(df,start,end,technical='MACD', \
188
188
  ROC_day=12,ROC_madays=[6], \
189
189
  DMI_DIdays=[14],DMI_ADXdays=[6], \
190
190
 
191
- MFI_day=14,MFI_madays=[14], \
192
- MOM_day=10,MOM_madays=[10], \
191
+ MFI_day=14,MFI_madays=[6], \
192
+
193
+ #提出选择12日或25日,移动均线为10日
194
+ MOM_day=12,MOM_madays=6, \
193
195
 
194
196
  #需要显示SAR
195
197
  SAR_day=4,SAR_madays=[5,20], \
@@ -201,7 +203,7 @@ def calc_technical(df,start,end,technical='MACD', \
201
203
  TSF_day=14,TSF_madays=[5,20], \
202
204
 
203
205
  #需要显示AD
204
- AD_day=26,AD_madays=[5,20], \
206
+ AD_madays=[5], \
205
207
 
206
208
  #不建议使用复权价,因为最高最低价和开盘价没有复权价!
207
209
  indicator='Close', \
@@ -586,11 +588,11 @@ def calc_technical(df,start,end,technical='MACD', \
586
588
  TRIX_madays=[TRIX_madays]
587
589
  for d in TRIX_madays:
588
590
  df['trix_ma'+str(d)] = talib.MA(df['trix'],timeperiod=d)
589
-
591
+ """
590
592
  if not more_details:
591
593
  #不保留TRIX
592
594
  df.drop(columns = ['trix'],inplace=True)
593
-
595
+ """
594
596
  #=========== DMA: 平均线差
595
597
  """
596
598
  计算公式:
@@ -744,11 +746,11 @@ def calc_technical(df,start,end,technical='MACD', \
744
746
  MFI_madays=[MFI_madays]
745
747
  for d in MFI_madays:
746
748
  df['mfi_ma'+str(d)] = df['mfi'].rolling(window=d).mean()
747
-
749
+ """
748
750
  if not more_details:
749
751
  #不保留指标本身
750
752
  df.drop(columns = ['mfi'],inplace=True)
751
-
753
+ """
752
754
  #=========== MOM:动量指标
753
755
  """
754
756
 
@@ -760,11 +762,11 @@ def calc_technical(df,start,end,technical='MACD', \
760
762
  MOM_madays=[MOM_madays]
761
763
  for d in MOM_madays:
762
764
  df['mom_ma'+str(d)] = df['mom'].rolling(window=d).mean()
763
-
765
+ """
764
766
  if not more_details:
765
767
  #不保留指标本身
766
768
  df.drop(columns = ['mom'],inplace=True)
767
-
769
+ """
768
770
  #=========== BETA:贝塔系数
769
771
  """
770
772
  动态贝塔系数?
@@ -805,18 +807,17 @@ def calc_technical(df,start,end,technical='MACD', \
805
807
  """
806
808
  if technical=='AD':
807
809
 
808
- #df['ad'] = talib.AD(df['High'],df['Low'],df[indicator],df['Volume'],timeperiod=AD_day)
809
810
  df['ad'] = talib.AD(df['High'],df['Low'],df[indicator],df['Volume'])
810
811
 
811
812
  if not isinstance(AD_madays,list):
812
813
  AD_madays=[AD_madays]
813
814
  for d in AD_madays:
814
815
  df['ad_ma'+str(d)] = df['ad'].rolling(window=d).mean()
815
-
816
+ """
816
817
  if not more_details:
817
818
  #不保留指标本身
818
819
  df.drop(columns = ['ad'],inplace=True)
819
-
820
+ """
820
821
 
821
822
 
822
823
  #过滤日期===================================================================
@@ -2620,12 +2621,12 @@ if __name__ =="__main__":
2620
2621
  WR_days=[10,6]
2621
2622
  ROC_day=12; ROC_madays=6
2622
2623
  DMI_DIdays=14; DMI_ADXdays=6
2623
- MFI_day=14; MFI_madays=[3,5]
2624
- MOM_day=10; MOM_madays=[5,20]
2624
+ MFI_day=14; MFI_madays=[6]
2625
+ MOM_day=12; MOM_madays=6
2625
2626
  SAR_day=4; SAR_madays=[5,20]
2626
2627
  BETA_day=5; BETA_madays=[5,20]
2627
2628
  TSF_day=14; TSF_madays=[5,10]
2628
- AD_day=26; AD_madays=[5,20]
2629
+ AD_madays=[5]
2629
2630
 
2630
2631
 
2631
2632
  ticker='002594.SZ';ticker_type='auto'
@@ -2691,7 +2692,7 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
2691
2692
 
2692
2693
  DMA_fastperiod=10,DMA_slowperiod=50,DMA_madays=[10], \
2693
2694
 
2694
- TRIX_day=12,TRIX_madays=[5,10], \
2695
+ TRIX_day=12,TRIX_madays=[20], \
2695
2696
 
2696
2697
  BIAS_days=[6,12,24], \
2697
2698
 
@@ -2703,9 +2704,10 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
2703
2704
 
2704
2705
  DMI_DIdays=7,DMI_ADXdays=6, \
2705
2706
 
2706
- #资金流:3日作为信号,5日作为确认信号
2707
- MFI_day=14,MFI_madays=[3,5], \
2708
- MOM_day=10,MOM_madays=[5,20], \
2707
+ #资金流:
2708
+ MFI_day=14,MFI_madays=[6], \
2709
+
2710
+ MOM_day=12,MOM_madays=6, \
2709
2711
 
2710
2712
  #需要显示SAR
2711
2713
  SAR_day=4,SAR_madays=[5,20], \
@@ -2717,7 +2719,7 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
2717
2719
  TSF_day=14,TSF_madays=[5,10], \
2718
2720
 
2719
2721
  #需要显示AD
2720
- AD_day=26,AD_madays=[5,20], \
2722
+ AD_madays=[], \
2721
2723
 
2722
2724
  #数据提前量,用于前置计算指标的移动平均值
2723
2725
  ahead_days=30*8, \
@@ -2739,11 +2741,11 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
2739
2741
 
2740
2742
  #价格线的绘图参数
2741
2743
  #price_line_style=(0,(1,1)), \
2742
- price_line_style='dotted', \
2744
+ price_line_style=(0,(3,1,1,1,1,1)), \
2743
2745
  price_line_color=['red','green'], \
2744
2746
  price_line_width=1,price_line_marker='o', \
2745
2747
  marker_sizes=[30,120,250], \
2746
- ):
2748
+ ):
2747
2749
  """
2748
2750
  功能:计算和绘制证券技术分析指标的简易图,仅供进一步探索使用,仅用于单个证券(股债基)
2749
2751
 
@@ -2867,7 +2869,7 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
2867
2869
  TSF_day=TSF_day,TSF_madays=TSF_madays, \
2868
2870
 
2869
2871
  #需要显示AD
2870
- AD_day=AD_day,AD_madays=AD_madays, \
2872
+ AD_madays=AD_madays, \
2871
2873
 
2872
2874
  indicator=indicator, \
2873
2875
  more_details=more_details)
@@ -3007,6 +3009,9 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
3007
3009
  ax3.set_facecolor('papayawhip')
3008
3010
 
3009
3011
  color_list=['k','g','b','c','m','yellowgreen','tomato','lime','orange','deepskyblue']
3012
+
3013
+ if isinstance(attention_values,int):
3014
+ attention_values=[attention_values]
3010
3015
  attention_draws=[False] * len(attention_values)
3011
3016
 
3012
3017
  for l in tech_line_collist:
@@ -3037,7 +3042,7 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
3037
3042
  xy=(x_end, y_end),
3038
3043
  xytext=(x_end, y_end),color=last_line_color)
3039
3044
  """
3040
- ax.annotate(text=' '+l.upper(),
3045
+ ax.annotate(text=''+l.upper(),
3041
3046
  xy=(x_end, y_end),
3042
3047
  xytext=(x_end, y_end),color=last_line_color,fontsize=legend_txt_size)
3043
3048
 
@@ -3053,7 +3058,7 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
3053
3058
 
3054
3059
  #如果需要绘制关注线,且尚未绘制过,则绘制
3055
3060
  if line_al and not attention_draws[pos]:
3056
- ax.axhline(y=attention_values[pos],ls=":",c=color_list[pos],linewidth=2)
3061
+ ax.axhline(y=attention_values[pos],ls='dotted',c=color_list[pos],linewidth=1)
3057
3062
 
3058
3063
  attention_draws[pos]=True
3059
3064
 
@@ -3109,8 +3114,8 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
3109
3114
  ax2.set_ylabel(ylabeltxt2,fontsize=ylabel_txt_size)
3110
3115
 
3111
3116
  #细灰线先画出轮廓
3112
- ax2.plot(df1.index,df1[indicator],label='', \
3113
- linestyle=price_line_style,color='grey',lw=2)
3117
+ ax2.plot(df1.index,df1[indicator],label=ylabeltxt2, \
3118
+ linestyle=price_line_style,color='k',lw=2)
3114
3119
 
3115
3120
  #不同颜色绘制涨跌价格线
3116
3121
  first_time=True; second_time=False
@@ -3119,11 +3124,13 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
3119
3124
  if df1seg['up_down'].values[0] >=0:
3120
3125
  seg_color=price_line_color1
3121
3126
  #labeltxt=ylabeltxt2+'(当日↑)'
3122
- labeltxt=ylabeltxt2+'(当日阳线)'
3127
+ #labeltxt=ylabeltxt2+'(当日阳线)'
3128
+ labeltxt='当日↑'
3123
3129
  else:
3124
3130
  seg_color=price_line_color2
3125
3131
  #labeltxt=ylabeltxt2+'(当日↓)'
3126
- labeltxt=ylabeltxt2+'(当日阴线)'
3132
+ #labeltxt=ylabeltxt2+'(当日阴线)'
3133
+ labeltxt='当日↓'
3127
3134
 
3128
3135
  if first_time:
3129
3136
  first_time=False; second_time=True
@@ -3135,7 +3142,7 @@ def security_technical2(ticker,start='default',end='default',technical='MACD', \
3135
3142
  ax2.scatter(df1seg.index,df1seg[indicator], \
3136
3143
  s=df1seg['marker_size'], \
3137
3144
  label=labeltxt, \
3138
- linestyle=':',color=seg_color,lw=price_line_width,marker=price_line_marker)
3145
+ linestyle=':',color=seg_color,lw=price_line_width,marker=price_line_marker,alpha=0.5)
3139
3146
 
3140
3147
  ax2.legend(loc=loc2,fontsize=legend_txt_size)
3141
3148
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: siat
3
- Version: 3.2.25
3
+ Version: 3.2.30
4
4
  Summary: Securities Investment Analysis Tools (siat)
5
5
  Home-page: https://pypi.org/project/siat/
6
6
  Author: Prof. WANG Dehong, International Business School, Beijing Foreign Studies University
@@ -1,5 +1,5 @@
1
1
  siat/__init__.py,sha256=gP5uajXnJesnH5SL0ZPwq_Qhv59AG1bs4qwZv26Fo2Y,2894
2
- siat/allin.py,sha256=f1VWxZLvPLR57ilk9GOziZMWjyAYOYLXbvQI4z38r50,2708
2
+ siat/allin.py,sha256=f8mlMSQJUgx4mRVOJNlHH2SZP0jUyWaeDPT2V6AGfY8,2757
3
3
  siat/alpha_vantage_test.py,sha256=tKr-vmuFH3CZAqwmISz6jzjPHzV1JJl3sPfZdz8aTfM,747
4
4
  siat/assets_liquidity.py,sha256=o_UZdLs693uNWPEQB2OzxDH0mdWimOmq4qe_vx1pue0,28987
5
5
  siat/assets_liquidity_test.py,sha256=UWk6HIUlizU7LQZ890fGx8LwU1jMMrIZswg8cFUJWZ8,1285
@@ -64,6 +64,7 @@ siat/grafix_test.py,sha256=kXvcpLgQNO7wd30g_bWljLj5UH7bIVI0_dUtXbfiKR0,3150
64
64
  siat/holding_risk.py,sha256=G3wpaewAKF9CwEqRpr4khyuDu9SU2EGyQUHdk7cmHOA,30693
65
65
  siat/holding_risk_test.py,sha256=FRlw_9wFG98BYcg_cSj95HX5WZ1TvkGaOUdXD7-V86s,474
66
66
  siat/local_debug_test.py,sha256=CDAOffW1Rvs-TcNN5giWVvHMlch1w4dp-w5SIV9jXL0,3936
67
+ siat/luchy_draw.py,sha256=cL-QBRbnjvY2h8B6YGp6Orycw43ypvBPhkFARD1bbPo,8248
67
68
  siat/market_china.py,sha256=hKoTLUyHuzsuG2L3_IuLx_utTKqS-__mZ63wrElh65U,45943
68
69
  siat/markowitz.py,sha256=glHikhabFAF6Hb6df1pYfhkxid2IZXBYAVQng5wd9Wk,97526
69
70
  siat/markowitz2-20240620.py,sha256=irZAPnjaatFsKQmFRMENP-cO6bEUl2narYtkU5NKTWI,108019
@@ -115,7 +116,7 @@ siat/stock_prices_kneighbors.py,sha256=WfZvo5EyeBsm-T37zDj7Sl9dPSRq5Bx4JxIJ9IUum
115
116
  siat/stock_prices_linear.py,sha256=-OUKRr27L2aStQgJSlJOrJ4gay_G7P-m-7t7cU2Yoqk,13991
116
117
  siat/stock_profile.py,sha256=B3eIwzEmiCqiCaxIlhfdEPsQBoW1PFOe1hkiY3mVF6Y,26038
117
118
  siat/stock_technical-20240620.py,sha256=A4x18mZgYSA8SSiDz4u_O3gd5oVRgbI6JIiBfFY0tVw,116013
118
- siat/stock_technical.py,sha256=DYSewOV9kRTusA3PX37BVbLQuo3qAeJML_qmEljXcAc,131491
119
+ siat/stock_technical.py,sha256=GPedxbOSPTi8zthDMu69edFVLES2RSNor2a1y8Zo42w,131612
119
120
  siat/stock_test.py,sha256=E9YJAvOw1VEGJSDI4IZuEjl0tGoisOIlN-g9UqA_IZE,19475
120
121
  siat/stooq.py,sha256=dOc_S5HLrYg48YAKTCs1eX8UTJOOkPM8qLL2KupqlLY,2470
121
122
  siat/temp.py,sha256=gbJ0ioauuo4koTPH6WKUkqcXiQPafnbhU5eKJ6lpdLA,1571
@@ -136,7 +137,7 @@ siat/valuation.py,sha256=NKfeZMdDJOW42oLVHob6eSVBXUqlN1OCnnzwyGAst8c,48855
136
137
  siat/valuation_china.py,sha256=EkZQaVkoBjM0c4MCNbaX-bMnlG0e3FXeaWczZDnkptU,67784
137
138
  siat/valuation_market_china_test.py,sha256=gbJ0ioauuo4koTPH6WKUkqcXiQPafnbhU5eKJ6lpdLA,1571
138
139
  siat/var_model_validation.py,sha256=R0caWnuZarrRg9939hxh3vJIIpIyPfvelYmzFNZtPbo,14910
139
- siat-3.2.25.dist-info/METADATA,sha256=rrntA_Rsj1bjBtLPjAssepn-I-IYK1cxL7eAMMHDgmU,7234
140
- siat-3.2.25.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
141
- siat-3.2.25.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
142
- siat-3.2.25.dist-info/RECORD,,
140
+ siat-3.2.30.dist-info/METADATA,sha256=zYx92U4_7j4-A4T0OGuZKkgwk8HFROhi0Wblv7L-w2E,7234
141
+ siat-3.2.30.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
142
+ siat-3.2.30.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
143
+ siat-3.2.30.dist-info/RECORD,,
File without changes