绘制股票价格图 《Python数据可视化》的p131 python爬取雅虎财经股票交易数据

股票价格图

  1. 采用pandas_datareader包和获取Yahoo数据源

该书中说
采用matplotlib.mlab和matplotlib.finance的子包可以获取股票数据,但是matplotlib.finance已经用不了了。所以课本上的代码运行不通了。
所以我们换成pandas_datareader包获取Yahoo数据
旧版Pandas是通过pandas.io.data获取网络数据源,新版Pandas已将该子模块独立成了pandas_datareader包,须独立安装.(摘自老师给的某本书的截图,不知道叫什么)

目前可访问的网络数据服务商主要包括:Yahoo Finance(雅虎金融),Google Finance(谷歌金融)、Enigma(Enigma公共数据搜索的提供商)、World Bank(世界银行)、OECD(经合组织)、Eurostat(欧盟统计局)、Nasdaq Trader Symbol Definitions(纳斯达克)等。
获取网络数据源的途径

打开命令行(cmd)窗口,输入

pip install pandas_datareader

获取数据股票数据的方法

 r= webdata.get_data_yahoo(ticker,startdate,enddate)
 print(r.head())

光写这个实现的代码还是会报错,网上看到很多人用get_data_yahoo()方法都读取不出数据,因为雅虎在中国受到限制,程序会运行很久没有结果出来,还会报超时的错误,如下

runfile('H:/python/股票.py', wdir='H:/python')
Traceback (most recent call last):

timeout: The read operation timed out




  File "C:\Users\a\anaconda3\lib\contextlib.py", line 131, in __exit__
    self.gen.throw(type, value, traceback)

  File "C:\Users\a\AppData\Roaming\Python\Python38\site-packages\urllib3\response.py", line 443, in _error_catcher
    raise ReadTimeoutError(self._pool, None, "Read timed out.")

ReadTimeoutError: HTTPSConnectionPool(host='finance.yahoo.com', port=443): Read timed out.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "C:\Users\a\AppData\Roaming\Python\Python38\site-packages\requests\models.py", line 760, in generate
    raise ConnectionError
  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
对于第一个问题,以下是使用 C# 编写的程序代码,实现了生成哈夫曼树和哈夫曼编码的功能: ```csharp using System; using System.Collections.Generic; namespace HuffmanEncoding { class Program { static void Main(string[] args) { int[] freq = { 5, 2, 1, 4, 3 }; char[] chars = { 'a', 'b', 'c', 'd', 'e' }; // 构造哈夫曼树 HuffmanNode root = BuildHuffmanTree(chars, freq); // 生成哈夫曼编码 Dictionary<char, string> codes = GenerateHuffmanCode(root); // 输出结果 Console.WriteLine("Original array: "); for (int i = 0; i < freq.Length; i++) { Console.WriteLine(chars[i] + ": " + freq[i]); } Console.WriteLine("\nHuffman tree: "); PrintHuffmanTree(root); Console.WriteLine("\nHuffman codes: "); foreach (var code in codes) { Console.WriteLine(code.Key + ": " + code.Value); } } // 定义哈夫曼树节点类 class HuffmanNode { public char Char { get; set; } public int Freq { get; set; } public HuffmanNode Left { get; set; } public HuffmanNode Right { get; set; } } // 构造哈夫曼树函数 static HuffmanNode BuildHuffmanTree(char[] chars, int[] freq) { List<HuffmanNode> nodes = new List<HuffmanNode>(); for (int i = 0; i < chars.Length; i++) { nodes.Add(new HuffmanNode { Char = chars[i], Freq = freq[i] }); } while (nodes.Count > 1) { nodes.Sort((a, b) => b.Freq - a.Freq); HuffmanNode leftNode = nodes[nodes.Count - 1]; HuffmanNode rightNode = nodes[nodes.Count - 2]; HuffmanNode parentNode = new HuffmanNode { Freq = leftNode.Freq + rightNode.Freq, Left = leftNode, Right = rightNode }; nodes.RemoveAt(nodes.Count - 1); nodes.RemoveAt(nodes.Count - 1); nodes.Add(parentNode); } return nodes[0]; } // 生成哈夫曼编码函数 static Dictionary<char, string> GenerateHuffmanCode(HuffmanNode root) { Dictionary<char, string> codes = new Dictionary<char, string>(); Stack<Tuple<HuffmanNode, string>> stack = new Stack<Tuple<HuffmanNode, string>>(); stack.Push(new Tuple<HuffmanNode, string>(root, "")); while (stack.Count > 0) { Tuple<HuffmanNode, string> tuple = stack.Pop(); HuffmanNode node = tuple.Item1; string code = tuple.Item2; if (node.Left == null && node.Right == null) { codes[node.Char] = code; } if (node.Left != null) { stack.Push(new Tuple<HuffmanNode, string>(node.Left, code + "0")); } if (node.Right != null) { stack.Push(new Tuple<HuffmanNode, string>(node.Right, code + "1")); } } return codes; } // 打印哈夫曼树 static void PrintHuffmanTree(HuffmanNode node, string indent = "") { if (node != null) { Console.WriteLine(indent + node.Freq); if (node.Left != null) { PrintHuffmanTree(node.Left, indent + " "); } if (node.Right != null) { PrintHuffmanTree(node.Right, indent + " "); } } } } } ``` 该程序首先定义了一个 `HuffmanNode` 类来表示哈夫曼树节点,包括字符、频率和左右子树。然后定义了 `BuildHuffmanTree` 函数来构造哈夫曼树,该函数接受两个数组作为输入,分别为字符和频率。函数首先根据字符和频率构造叶子节点,然后将这些节点作为初始节点列表,循环进行以下操作:从节点列表中选取频率最小的两个节点作为左右子节点,生成一个新的父节点,将父节点加入节点列表中。最终生成的哈夫曼树即为节点列表中的唯一节点,函数返回该节点。这个构造哈夫曼树的过程与教材上的描述相同。 接下来定义了 `GenerateHuffmanCode` 函数来生成哈夫曼编码,该函数接受哈夫曼树的根节点作为输入。函数通过深度优先遍历哈夫曼树,将从根节点到每个叶子节点的路径表示为 0 或 1 的编码,保存在一个字典中,键为字符,值为该字符的编码。这个生成哈夫曼编码的过程与教材上的描述相同。 最后在 `Main` 函数中定义了两个数组作为测试输入,然后调用 `BuildHuffmanTree` 和 `GenerateHuffmanCode` 函数,最终输出生成的哈夫曼树和哈夫曼编码。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值