akshare-one 0.1.2__py3-none-any.whl → 0.2.0__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.
Files changed (33) hide show
  1. akshare_one/__init__.py +2 -3
  2. akshare_one/financial.py +7 -4
  3. akshare_one/insider.py +6 -5
  4. akshare_one/modules/cache.py +9 -0
  5. akshare_one/modules/financial/base.py +41 -0
  6. akshare_one/modules/financial/factory.py +44 -0
  7. akshare_one/{adapters → modules/financial}/sina.py +30 -195
  8. akshare_one/modules/historical/base.py +64 -0
  9. akshare_one/modules/historical/eastmoney.py +242 -0
  10. akshare_one/modules/historical/factory.py +46 -0
  11. akshare_one/modules/historical/sina.py +219 -0
  12. akshare_one/modules/insider/base.py +78 -0
  13. akshare_one/modules/insider/factory.py +44 -0
  14. akshare_one/{adapters → modules/insider}/xueqiu.py +21 -11
  15. akshare_one/modules/news/base.py +51 -0
  16. akshare_one/modules/news/eastmoney.py +48 -0
  17. akshare_one/modules/news/factory.py +44 -0
  18. akshare_one/modules/realtime/base.py +68 -0
  19. akshare_one/modules/realtime/eastmoney.py +58 -0
  20. akshare_one/modules/realtime/factory.py +46 -0
  21. akshare_one/modules/realtime/xueqiu.py +61 -0
  22. akshare_one/modules/utils.py +10 -0
  23. akshare_one/news.py +3 -4
  24. akshare_one/stock.py +18 -26
  25. {akshare_one-0.1.2.dist-info → akshare_one-0.2.0.dist-info}/METADATA +2 -2
  26. akshare_one-0.2.0.dist-info/RECORD +29 -0
  27. {akshare_one-0.1.2.dist-info → akshare_one-0.2.0.dist-info}/WHEEL +1 -1
  28. akshare_one/adapters/__init__.py +0 -7
  29. akshare_one/adapters/cache/cache.py +0 -9
  30. akshare_one/adapters/eastmoney.py +0 -342
  31. akshare_one-0.1.2.dist-info/RECORD +0 -15
  32. {akshare_one-0.1.2.dist-info → akshare_one-0.2.0.dist-info}/licenses/LICENSE +0 -0
  33. {akshare_one-0.1.2.dist-info → akshare_one-0.2.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,51 @@
1
+ from abc import ABC, abstractmethod
2
+ import pandas as pd
3
+
4
+
5
+ def validate_news_data(func):
6
+ """Decorator to validate news data returned by data providers"""
7
+
8
+ def wrapper(*args, **kwargs):
9
+ df = func(*args, **kwargs)
10
+
11
+ if not isinstance(df, pd.DataFrame):
12
+ raise ValueError("Returned data must be a pandas DataFrame")
13
+
14
+ # Required fields
15
+ required_fields = {"title", "publish_time"}
16
+ if not required_fields & set(df.columns):
17
+ raise ValueError(f"Must contain all required fields: {required_fields}")
18
+
19
+ # Validate publish_time if present
20
+ if "publish_time" in df.columns:
21
+ if not pd.api.types.is_datetime64_any_dtype(df["publish_time"]):
22
+ raise ValueError("publish_time must be datetime64 dtype")
23
+ if (
24
+ df["publish_time"].dt.tz is None
25
+ or str(df["publish_time"].dt.tz) != "UTC"
26
+ ):
27
+ raise ValueError("publish_time must be in UTC timezone")
28
+
29
+ return df
30
+
31
+ return wrapper
32
+
33
+
34
+ class NewsDataProvider(ABC):
35
+ def __init__(self, symbol: str) -> None:
36
+ self.symbol = symbol
37
+
38
+ @abstractmethod
39
+ def get_news_data(self) -> pd.DataFrame:
40
+ """Fetches news data for given symbol
41
+
42
+ Returns:
43
+ pd.DataFrame:
44
+ - keyword: 关键词
45
+ - title: 新闻标题
46
+ - content: 新闻内容
47
+ - publish_time: 发布时间 (UTC)
48
+ - source: 文章来源
49
+ - url: 新闻链接
50
+ """
51
+ pass
@@ -0,0 +1,48 @@
1
+ from cachetools import cached
2
+ import pandas as pd
3
+ import akshare as ak
4
+
5
+ from ..cache import CACHE_CONFIG
6
+ from .base import NewsDataProvider, validate_news_data
7
+
8
+
9
+ class EastMoneyNews(NewsDataProvider):
10
+ @validate_news_data
11
+ @cached(
12
+ CACHE_CONFIG["news_cache"],
13
+ key=lambda self: f"eastmoney_news_{self.symbol}",
14
+ )
15
+ def get_news_data(self) -> pd.DataFrame:
16
+ """获取东方财富个股新闻数据"""
17
+ raw_df = ak.stock_news_em(symbol=self.symbol)
18
+ return self._clean_news_data(raw_df)
19
+
20
+ def _clean_news_data(self, raw_df: pd.DataFrame) -> pd.DataFrame:
21
+ """清理和标准化新闻数据"""
22
+ column_mapping = {
23
+ "关键词": "keyword",
24
+ "新闻标题": "title",
25
+ "新闻内容": "content",
26
+ "发布时间": "publish_time",
27
+ "文章来源": "source",
28
+ "新闻链接": "url",
29
+ }
30
+
31
+ df = raw_df.rename(columns=column_mapping)
32
+
33
+ # Convert time to UTC
34
+ df["publish_time"] = (
35
+ pd.to_datetime(df["publish_time"])
36
+ .dt.tz_localize("Asia/Shanghai")
37
+ .dt.tz_convert("UTC")
38
+ )
39
+
40
+ required_columns = [
41
+ "keyword",
42
+ "title",
43
+ "content",
44
+ "publish_time",
45
+ "source",
46
+ "url",
47
+ ]
48
+ return df[required_columns]
@@ -0,0 +1,44 @@
1
+ from .eastmoney import EastMoneyNews
2
+ from .base import NewsDataProvider
3
+
4
+
5
+ class NewsDataFactory:
6
+ """
7
+ Factory class for creating news data providers
8
+ """
9
+
10
+ _providers = {
11
+ "eastmoney": EastMoneyNews,
12
+ }
13
+
14
+ @classmethod
15
+ def get_provider(cls, provider_name: str, **kwargs) -> NewsDataProvider:
16
+ """
17
+ Get a news data provider by name
18
+
19
+ Args:
20
+ provider_name: Name of the provider (e.g., 'eastmoney')
21
+ **kwargs: Additional arguments to pass to the provider's constructor
22
+
23
+ Returns:
24
+ NewsDataProvider: An instance of the requested provider
25
+
26
+ Raises:
27
+ ValueError: If the requested provider is not found
28
+ """
29
+ provider_class = cls._providers.get(provider_name.lower())
30
+ if not provider_class:
31
+ raise ValueError(f"Unknown news data provider: {provider_name}")
32
+
33
+ return provider_class(**kwargs)
34
+
35
+ @classmethod
36
+ def register_provider(cls, name: str, provider_class: type):
37
+ """
38
+ Register a new news data provider
39
+
40
+ Args:
41
+ name: Name to associate with this provider
42
+ provider_class: The provider class to register
43
+ """
44
+ cls._providers[name.lower()] = provider_class
@@ -0,0 +1,68 @@
1
+ from abc import ABC, abstractmethod
2
+ import pandas as pd
3
+
4
+
5
+ def validate_realtime_data(func):
6
+ """Decorator to validate realtime data returned by data providers"""
7
+
8
+ def wrapper(*args, **kwargs):
9
+ df = func(*args, **kwargs)
10
+
11
+ if not isinstance(df, pd.DataFrame):
12
+ raise ValueError("Returned data must be a pandas DataFrame")
13
+
14
+ # At least one of these core fields must be present
15
+ core_fields = {"timestamp", "price", "volume"}
16
+ if not core_fields & set(df.columns):
17
+ raise ValueError(f"Must contain at least one of: {core_fields}")
18
+
19
+ # Validate timestamp if present
20
+ if "timestamp" in df.columns:
21
+ if not pd.api.types.is_datetime64_any_dtype(df["timestamp"]):
22
+ raise ValueError("timestamp must be datetime64 dtype")
23
+ if df["timestamp"].dt.tz is None or str(df["timestamp"].dt.tz) != "UTC":
24
+ raise ValueError("timestamp must be in UTC timezone")
25
+
26
+ # Validate numeric fields if present
27
+ numeric_fields = {
28
+ "price",
29
+ "change",
30
+ "pct_change",
31
+ "open",
32
+ "high",
33
+ "low",
34
+ "prev_close",
35
+ "amount",
36
+ }
37
+ for field in numeric_fields & set(df.columns):
38
+ if not pd.api.types.is_numeric_dtype(df[field]):
39
+ raise ValueError(f"{field} must be numeric")
40
+
41
+ return df
42
+
43
+ return wrapper
44
+
45
+
46
+ class RealtimeDataProvider(ABC):
47
+ def __init__(self, symbol: str) -> None:
48
+ self.symbol = symbol
49
+
50
+ @abstractmethod
51
+ def get_current_data(self) -> pd.DataFrame:
52
+ """Fetches realtime market data
53
+
54
+ Returns:
55
+ pd.DataFrame:
56
+ - symbol: 股票代码
57
+ - price: 最新价
58
+ - change: 涨跌额
59
+ - pct_change: 涨跌幅(%)
60
+ - timestamp: 时间戳
61
+ - volume: 成交量(手)
62
+ - amount: 成交额(元)
63
+ - open: 今开
64
+ - high: 最高
65
+ - low: 最低
66
+ - prev_close: 昨收
67
+ """
68
+ pass
@@ -0,0 +1,58 @@
1
+ from cachetools import cached
2
+ import pandas as pd
3
+ import akshare as ak
4
+
5
+ from ..cache import CACHE_CONFIG
6
+ from .base import RealtimeDataProvider, validate_realtime_data
7
+
8
+
9
+ class EastmoneyRealtime(RealtimeDataProvider):
10
+ @validate_realtime_data
11
+ @cached(
12
+ CACHE_CONFIG["realtime_cache"],
13
+ key=lambda self, symbol=None: f"eastmoney_{symbol if symbol else 'all'}",
14
+ )
15
+ def get_current_data(self) -> pd.DataFrame:
16
+ """获取沪深京A股实时行情数据"""
17
+ raw_df = ak.stock_zh_a_spot_em()
18
+ df = self._clean_spot_data(raw_df)
19
+ if self.symbol:
20
+ df = df[df["symbol"] == self.symbol].reset_index(drop=True)
21
+ return df
22
+
23
+ def _clean_spot_data(self, raw_df: pd.DataFrame) -> pd.DataFrame:
24
+ """清理和标准化实时行情数据"""
25
+ column_mapping = {
26
+ "代码": "symbol",
27
+ "最新价": "price",
28
+ "涨跌额": "change",
29
+ "涨跌幅": "pct_change",
30
+ "成交量": "volume",
31
+ "成交额": "amount",
32
+ "今开": "open",
33
+ "最高": "high",
34
+ "最低": "low",
35
+ "昨收": "prev_close",
36
+ }
37
+
38
+ df = raw_df.rename(columns=column_mapping)
39
+
40
+ # Change time to UTC
41
+ df = df.assign(
42
+ timestamp=lambda x: pd.Timestamp.now(tz="Asia/Shanghai").tz_convert("UTC")
43
+ )
44
+
45
+ required_columns = [
46
+ "symbol",
47
+ "price",
48
+ "change",
49
+ "pct_change",
50
+ "timestamp",
51
+ "volume",
52
+ "amount",
53
+ "open",
54
+ "high",
55
+ "low",
56
+ "prev_close",
57
+ ]
58
+ return df[required_columns]
@@ -0,0 +1,46 @@
1
+ from .eastmoney import EastmoneyRealtime
2
+ from .xueqiu import XueQiuRealtime
3
+ from .base import RealtimeDataProvider
4
+
5
+
6
+ class RealtimeDataFactory:
7
+ """
8
+ Factory class for creating realtime data providers
9
+ """
10
+
11
+ _providers = {
12
+ "eastmoney": EastmoneyRealtime,
13
+ "xueqiu": XueQiuRealtime,
14
+ }
15
+
16
+ @classmethod
17
+ def get_provider(cls, provider_name: str, **kwargs) -> RealtimeDataProvider:
18
+ """
19
+ Get a realtime data provider by name
20
+
21
+ Args:
22
+ provider_name: Name of the provider (e.g., 'eastmoney')
23
+ **kwargs: Additional arguments to pass to the provider's constructor
24
+
25
+ Returns:
26
+ RealtimeDataProvider: An instance of the requested provider
27
+
28
+ Raises:
29
+ ValueError: If the requested provider is not found
30
+ """
31
+ provider_class = cls._providers.get(provider_name.lower())
32
+ if not provider_class:
33
+ raise ValueError(f"Unknown realtime data provider: {provider_name}")
34
+
35
+ return provider_class(**kwargs)
36
+
37
+ @classmethod
38
+ def register_provider(cls, name: str, provider_class: type):
39
+ """
40
+ Register a new realtime data provider
41
+
42
+ Args:
43
+ name: Name to associate with this provider
44
+ provider_class: The provider class to register
45
+ """
46
+ cls._providers[name.lower()] = provider_class
@@ -0,0 +1,61 @@
1
+ from cachetools import cached
2
+ import pandas as pd
3
+ import akshare as ak
4
+ from ..utils import convert_xieqiu_symbol
5
+ from ..cache import CACHE_CONFIG
6
+ from .base import RealtimeDataProvider, validate_realtime_data
7
+
8
+
9
+ class XueQiuRealtime(RealtimeDataProvider):
10
+ @validate_realtime_data
11
+ @cached(
12
+ cache=CACHE_CONFIG["realtime_cache"],
13
+ key=lambda self, symbol=None: f"xueqiu_{symbol}",
14
+ )
15
+ def get_current_data(self) -> pd.DataFrame:
16
+ """获取雪球实时行情数据
17
+
18
+ Args:
19
+ symbol: 股票代码 ("600000")
20
+
21
+ Returns:
22
+ pd.DataFrame with columns:
23
+ - symbol: 股票代码
24
+ - price: 最新价
25
+ - change: 涨跌额
26
+ - pct_change: 涨跌幅(%)
27
+ - timestamp: 时间戳
28
+ - volume: 成交量(手)
29
+ - amount: 成交额(元)
30
+ - open: 今开
31
+ - high: 最高
32
+ - low: 最低
33
+ - prev_close: 昨收
34
+ """
35
+ raw_df = ak.stock_individual_spot_xq(symbol=convert_xieqiu_symbol(self.symbol))
36
+
37
+ # Transform to match standard format
38
+ data = {
39
+ "symbol": self.symbol,
40
+ "price": float(raw_df.loc[raw_df["item"] == "现价", "value"].values[0]),
41
+ "change": float(raw_df.loc[raw_df["item"] == "涨跌", "value"].values[0]),
42
+ "pct_change": float(
43
+ raw_df.loc[raw_df["item"] == "涨幅", "value"].values[0]
44
+ ),
45
+ "timestamp": pd.to_datetime(
46
+ raw_df.loc[raw_df["item"] == "时间", "value"].values[0]
47
+ )
48
+ .tz_localize("Asia/Shanghai")
49
+ .tz_convert("UTC"),
50
+ "volume": int(raw_df.loc[raw_df["item"] == "成交量", "value"].values[0])
51
+ / 100,
52
+ "amount": float(raw_df.loc[raw_df["item"] == "成交额", "value"].values[0]),
53
+ "open": float(raw_df.loc[raw_df["item"] == "今开", "value"].values[0]),
54
+ "high": float(raw_df.loc[raw_df["item"] == "最高", "value"].values[0]),
55
+ "low": float(raw_df.loc[raw_df["item"] == "最低", "value"].values[0]),
56
+ "prev_close": float(
57
+ raw_df.loc[raw_df["item"] == "昨收", "value"].values[0]
58
+ ),
59
+ }
60
+
61
+ return pd.DataFrame([data])
@@ -0,0 +1,10 @@
1
+ def convert_xieqiu_symbol(symbol: str) -> str:
2
+ """
3
+ Convert Symbol (600000) to XueQiu Symbol (SH600000)
4
+ """
5
+ if symbol.startswith("6"):
6
+ return f"SH{symbol}"
7
+ elif symbol.startswith("0") or symbol.startswith("3"):
8
+ return f"SZ{symbol}"
9
+ else: # TODO: add more cases
10
+ return symbol
akshare_one/news.py CHANGED
@@ -4,7 +4,7 @@
4
4
  """
5
5
 
6
6
  import pandas as pd
7
- from .adapters import EastMoneyAdapter
7
+ from .modules.news.factory import NewsDataFactory
8
8
 
9
9
 
10
10
  def get_news_data(symbol: str, source: str = "eastmoney") -> "pd.DataFrame":
@@ -23,6 +23,5 @@ def get_news_data(symbol: str, source: str = "eastmoney") -> "pd.DataFrame":
23
23
  - source: 文章来源
24
24
  - url: 新闻链接
25
25
  """
26
- if source == "eastmoney":
27
- return EastMoneyAdapter().get_news_data(symbol=symbol)
28
- raise ValueError(f"Unsupported data source: {source}")
26
+ provider = NewsDataFactory.get_provider(source, symbol=symbol)
27
+ return provider.get_news_data()
akshare_one/stock.py CHANGED
@@ -5,12 +5,14 @@
5
5
 
6
6
  from typing import Optional
7
7
  import pandas as pd
8
- from .adapters import EastMoneyAdapter, SinaAdapter
8
+
9
+ from akshare_one.modules.historical.factory import HistoricalDataFactory
10
+ from akshare_one.modules.realtime.factory import RealtimeDataFactory
9
11
 
10
12
 
11
13
  def get_hist_data(
12
14
  symbol: str,
13
- interval: str,
15
+ interval: str = "day",
14
16
  interval_multiplier: int = 1,
15
17
  start_date: str = "1970-01-01",
16
18
  end_date: str = "2030-12-31",
@@ -37,35 +39,26 @@ def get_hist_data(
37
39
  - close: 收盘价
38
40
  - volume: 成交量
39
41
  """
40
- if source == "eastmoney":
41
- return EastMoneyAdapter().get_hist_data(
42
- symbol=symbol,
43
- interval=interval,
44
- interval_multiplier=interval_multiplier,
45
- start_date=start_date,
46
- end_date=end_date,
47
- adjust=adjust,
48
- )
49
- elif source == "sina":
50
- return SinaAdapter().get_hist_data(
51
- symbol=symbol,
52
- interval=interval,
53
- interval_multiplier=interval_multiplier,
54
- start_date=start_date,
55
- end_date=end_date,
56
- adjust=adjust,
57
- )
58
- raise ValueError(f"Unsupported data source: {source}")
42
+ kwargs = {
43
+ "symbol": symbol,
44
+ "interval": interval,
45
+ "interval_multiplier": interval_multiplier,
46
+ "start_date": start_date,
47
+ "end_date": end_date,
48
+ "adjust": adjust,
49
+ }
50
+ provider = HistoricalDataFactory.get_provider(source, **kwargs)
51
+ return provider.get_hist_data()
59
52
 
60
53
 
61
54
  def get_realtime_data(
62
- source: str = "eastmoney", symbol: Optional[str] = None
55
+ symbol: Optional[str] = None, source: str = "xueqiu"
63
56
  ) -> "pd.DataFrame":
64
57
  """Get real-time market quotes
65
58
 
66
59
  Args:
67
60
  symbol: 股票代码 (如 "600000")
68
- source: 数据源 ('eastmoney')
61
+ source: 数据源 ('eastmoney', 'xueqiu')
69
62
 
70
63
  Returns:
71
64
  pd.DataFrame:
@@ -81,6 +74,5 @@ def get_realtime_data(
81
74
  - low: 最低
82
75
  - prev_close: 昨收
83
76
  """
84
- if source == "eastmoney":
85
- return EastMoneyAdapter().get_realtime_data(symbol=symbol)
86
- raise ValueError(f"Unsupported data source: {source}")
77
+ provider = RealtimeDataFactory.get_provider(source, symbol=symbol)
78
+ return provider.get_current_data()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: akshare-one
3
- Version: 0.1.2
3
+ Version: 0.2.0
4
4
  Summary: Standardized interface for Chinese financial market data, built on AKShare with unified data formats and simplified APIs
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/zwldarren/akshare-one
@@ -9,7 +9,7 @@ Keywords: akshare,financial-data,stock-data,quant
9
9
  Requires-Python: >=3.12
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
- Requires-Dist: akshare>=1.16.64
12
+ Requires-Dist: akshare>=1.16.94
13
13
  Requires-Dist: cachetools>=5.5.2
14
14
  Dynamic: license-file
15
15
 
@@ -0,0 +1,29 @@
1
+ akshare_one/__init__.py,sha256=M4eXCnBzGqa5FihT-q7DHaluTvidnqwVF7AgPgCikKU,878
2
+ akshare_one/financial.py,sha256=XAsonRzGK8akKtW2Q7LUrew4OFRnRAfZm0nw0JY73Jc,1426
3
+ akshare_one/insider.py,sha256=fnbVT--7jGCvULhsiKNqLmZggo1VmR-eNOr4iq5BI7I,1179
4
+ akshare_one/news.py,sha256=yrYeCaKTgCGP-TSyOfOou9gMw8185qiWrg380fD9-f8,669
5
+ akshare_one/stock.py,sha256=K8KOHxHszHoWmdhgO4sj-6zfIUSMS--0PdzgsAOGk88,2203
6
+ akshare_one/modules/cache.py,sha256=47A80Xtfr4gkKvEfBQrT8Dz8hNFR769rBa2gU6ew25s,373
7
+ akshare_one/modules/utils.py,sha256=H4nrGf8m4_ezTiW5-OcNPxpV-neTYfffEfaOLDFLY9Y,323
8
+ akshare_one/modules/financial/base.py,sha256=JRZJhzl7kP16KEVOXP9mq1DjXW6rga2FJ8-sI5FH814,1107
9
+ akshare_one/modules/financial/factory.py,sha256=GqzFp6LoHWj7t5VwtZJkLFxBuaAW_0b__bduBrmlcOg,1301
10
+ akshare_one/modules/financial/sina.py,sha256=gHrbmykselWZC5tqR1Zkyc3oK0TcCCdCn_1z_8C2y_U,11026
11
+ akshare_one/modules/historical/base.py,sha256=hIk-DKxaDXfx9y9VWx-b918ntv6pCeqxjHpAiS7A5ZQ,1895
12
+ akshare_one/modules/historical/eastmoney.py,sha256=8lTZjbQ-P713vBvJxXTBmn6hPpNslWf5uAW8R6HJtyo,8292
13
+ akshare_one/modules/historical/factory.py,sha256=adxNNo_-PT180QXRUNwkdiN5x0lDJpPCt6rNFZcJ0ps,1389
14
+ akshare_one/modules/historical/sina.py,sha256=d-AWr4C72nvPYOC9IETqUXDoksofztWyoe9Ie9TC9Z0,7293
15
+ akshare_one/modules/insider/base.py,sha256=_TDvHr6TZa0sTynE_ZL0njnms-cb5Wd8hfqR7pdfvrU,2728
16
+ akshare_one/modules/insider/factory.py,sha256=om51vX-GTXknpptZGvmDD9m10FfgEVmy402xZ3bBsNM,1280
17
+ akshare_one/modules/insider/xueqiu.py,sha256=8ZBRn8tW4r0aTEsoaQuYzcNQ-q2oQ64Cn7VG_Hs8hhE,4021
18
+ akshare_one/modules/news/base.py,sha256=L55BLQionqTZGmrHZDpmNKuhcWQdIN8ZKR9jsMj1Bgo,1550
19
+ akshare_one/modules/news/eastmoney.py,sha256=iuZgpvub9zKDJNtGIShFXBQRHIG10oEvdMiYFDvbsdI,1377
20
+ akshare_one/modules/news/factory.py,sha256=Em6c7m46K760iwIX3GZ15HdFu7pXT2w-n4QsjwHezjY,1264
21
+ akshare_one/modules/realtime/base.py,sha256=Yztkh9IhCr0Y-N8SH81APL9uNr4ZMd10B5KfcC6Ekcg,2093
22
+ akshare_one/modules/realtime/eastmoney.py,sha256=PPfRC3LUIH0HWbjkgfHgoER5Aq8CtqGFbazjJdYFqcQ,1702
23
+ akshare_one/modules/realtime/factory.py,sha256=SxDvJJvp6VutRqLUGYRnrUBtJEOE0N7vVh5Rw-vJ6NY,1373
24
+ akshare_one/modules/realtime/xueqiu.py,sha256=WnSRktk4eyFV8_8c9SpCtL6UN08vdZdzFpCyhMyLRPM,2293
25
+ akshare_one-0.2.0.dist-info/licenses/LICENSE,sha256=Gg6A1GNSJCZWQ73aHJ7TXOa0i8RQ3FejZCTZ6Db07cU,1066
26
+ akshare_one-0.2.0.dist-info/METADATA,sha256=glFdSHMMfGgYlg1DIZvQ1r0xKnMCQHFgV215lM2pmbo,1865
27
+ akshare_one-0.2.0.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
28
+ akshare_one-0.2.0.dist-info/top_level.txt,sha256=kNiucyLVAGa89wmUSpXbBLWD7pF_RuahuiaOfLHZSyw,12
29
+ akshare_one-0.2.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (80.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,7 +0,0 @@
1
- # Initialize adapters package
2
- from .eastmoney import EastMoneyAdapter
3
- from .sina import SinaAdapter
4
- from .xueqiu import XueQiuAdapter
5
- from .cache.cache import CACHE_CONFIG
6
-
7
- __all__ = ['EastMoneyAdapter', 'SinaAdapter', 'XueQiuAdapter', 'CACHE_CONFIG']
@@ -1,9 +0,0 @@
1
- from cachetools import TTLCache
2
-
3
- # 缓存配置
4
- CACHE_CONFIG = {
5
- 'hist_data_cache': TTLCache(maxsize=1000, ttl=3600), # 历史数据缓存1小时
6
- 'realtime_cache': TTLCache(maxsize=500, ttl=60), # 实时数据缓存1分钟
7
- 'news_cache': TTLCache(maxsize=500, ttl=3600),
8
- 'financial_cache': TTLCache(maxsize=500, ttl=86400), # 财务数据缓存24小时
9
- }