├── .env_example
├── .gitignore
├── LICENSE
├── README.md
├── README.zh.md
├── agents
├── __init__.py
├── markdown_table_agent.py
├── pandasql_agent.py
└── router_agent.py
├── asserts
├── gradio.png
└── img.png
├── core
├── __init__.py
├── agent.py
├── excel_table.py
└── openai_like_llm.py
├── data
├── SuperStoreUS-2015.xlsx
├── daily-min-temperatures.csv
├── flightdata-head-hebing.xlsx
├── flightdata-hebing.xlsx
├── score.xlsx
├── score1.xlsx
├── 学生视力表.xls
└── 销售统计表2.xlsx
├── fonts
├── arialuni.ttf
└── fireflysung.ttf
├── main.py
├── output
├── analysis_result.md
├── analysis_result.pdf
└── analysis_result_test.pdf
├── requirements.txt
├── test
├── __init__.py
├── analyze_with_llm_test.py
├── test.py
├── test_extract_table_names.py
├── test_re_parse_table_head.py
└── test_router_agent.py
├── tools
├── __init__.py
├── analyze_tool.py
├── quickchart_tool.py
└── table_tool.py
├── utils
├── __init__.py
├── excel_loader.py
└── export_tools.py
└── view
├── __init__.py
└── view.py
/.env_example:
--------------------------------------------------------------------------------
1 | OPENAI_API_KEY=sk-xxxxxxx
2 | OPENAI_API_BASE=https://dashscope.aliyuncs.com/compatible-mode/v1
3 | OPENAI_MODEL_NAME=qwen-max-latest
4 | ANALYZE_LLM_MODEL_NAME=deepseek-v3
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # 系统文件
2 | .DS_Store
3 | Thumbs.db
4 |
5 | .idea/
6 |
7 | .env
8 |
9 | # Python虚拟环境
10 | venv/
11 | .venv/
12 | env/
13 | .conda/
14 |
15 | # 日志文件
16 | *.log
17 |
18 | # 缓存文件
19 | __pycache__/
20 |
21 | # 数据文件备份
22 | *.bak
23 | *.tmp
24 |
25 | # 配置文件(如果包含敏感信息)
26 | config.ini
27 | .env
28 |
29 | # 自动生成的文件(如果有)
30 | generated/
31 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU AFFERO GENERAL PUBLIC LICENSE
2 | Version 3, 19 November 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU Affero General Public License is a free, copyleft license for
11 | software and other kinds of works, specifically designed to ensure
12 | cooperation with the community in the case of network server software.
13 |
14 | The licenses for most software and other practical works are designed
15 | to take away your freedom to share and change the works. By contrast,
16 | our General Public Licenses are intended to guarantee your freedom to
17 | share and change all versions of a program--to make sure it remains free
18 | software for all its users.
19 |
20 | When we speak of free software, we are referring to freedom, not
21 | price. Our General Public Licenses are designed to make sure that you
22 | have the freedom to distribute copies of free software (and charge for
23 | them if you wish), that you receive source code or can get it if you
24 | want it, that you can change the software or use pieces of it in new
25 | free programs, and that you know you can do these things.
26 |
27 | Developers that use our General Public Licenses protect your rights
28 | with two steps: (1) assert copyright on the software, and (2) offer
29 | you this License which gives you legal permission to copy, distribute
30 | and/or modify the software.
31 |
32 | A secondary benefit of defending all users' freedom is that
33 | improvements made in alternate versions of the program, if they
34 | receive widespread use, become available for other developers to
35 | incorporate. Many developers of free software are heartened and
36 | encouraged by the resulting cooperation. However, in the case of
37 | software used on network servers, this result may fail to come about.
38 | The GNU General Public License permits making a modified version and
39 | letting the public access it on a server without ever releasing its
40 | source code to the public.
41 |
42 | The GNU Affero General Public License is designed specifically to
43 | ensure that, in such cases, the modified source code becomes available
44 | to the community. It requires the operator of a network server to
45 | provide the source code of the modified version running there to the
46 | users of that server. Therefore, public use of a modified version, on
47 | a publicly accessible server, gives the public access to the source
48 | code of the modified version.
49 |
50 | An older license, called the Affero General Public License and
51 | published by Affero, was designed to accomplish similar goals. This is
52 | a different license, not a version of the Affero GPL, but Affero has
53 | released a new version of the Affero GPL which permits relicensing under
54 | this license.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | TERMS AND CONDITIONS
60 |
61 | 0. Definitions.
62 |
63 | "This License" refers to version 3 of the GNU Affero General Public License.
64 |
65 | "Copyright" also means copyright-like laws that apply to other kinds of
66 | works, such as semiconductor masks.
67 |
68 | "The Program" refers to any copyrightable work licensed under this
69 | License. Each licensee is addressed as "you". "Licensees" and
70 | "recipients" may be individuals or organizations.
71 |
72 | To "modify" a work means to copy from or adapt all or part of the work
73 | in a fashion requiring copyright permission, other than the making of an
74 | exact copy. The resulting work is called a "modified version" of the
75 | earlier work or a work "based on" the earlier work.
76 |
77 | A "covered work" means either the unmodified Program or a work based
78 | on the Program.
79 |
80 | To "propagate" a work means to do anything with it that, without
81 | permission, would make you directly or secondarily liable for
82 | infringement under applicable copyright law, except executing it on a
83 | computer or modifying a private copy. Propagation includes copying,
84 | distribution (with or without modification), making available to the
85 | public, and in some countries other activities as well.
86 |
87 | To "convey" a work means any kind of propagation that enables other
88 | parties to make or receive copies. Mere interaction with a user through
89 | a computer network, with no transfer of a copy, is not conveying.
90 |
91 | An interactive user interface displays "Appropriate Legal Notices"
92 | to the extent that it includes a convenient and prominently visible
93 | feature that (1) displays an appropriate copyright notice, and (2)
94 | tells the user that there is no warranty for the work (except to the
95 | extent that warranties are provided), that licensees may convey the
96 | work under this License, and how to view a copy of this License. If
97 | the interface presents a list of user commands or options, such as a
98 | menu, a prominent item in the list meets this criterion.
99 |
100 | 1. Source Code.
101 |
102 | The "source code" for a work means the preferred form of the work
103 | for making modifications to it. "Object code" means any non-source
104 | form of a work.
105 |
106 | A "Standard Interface" means an interface that either is an official
107 | standard defined by a recognized standards body, or, in the case of
108 | interfaces specified for a particular programming language, one that
109 | is widely used among developers working in that language.
110 |
111 | The "System Libraries" of an executable work include anything, other
112 | than the work as a whole, that (a) is included in the normal form of
113 | packaging a Major Component, but which is not part of that Major
114 | Component, and (b) serves only to enable use of the work with that
115 | Major Component, or to implement a Standard Interface for which an
116 | implementation is available to the public in source code form. A
117 | "Major Component", in this context, means a major essential component
118 | (kernel, window system, and so on) of the specific operating system
119 | (if any) on which the executable work runs, or a compiler used to
120 | produce the work, or an object code interpreter used to run it.
121 |
122 | The "Corresponding Source" for a work in object code form means all
123 | the source code needed to generate, install, and (for an executable
124 | work) run the object code and to modify the work, including scripts to
125 | control those activities. However, it does not include the work's
126 | System Libraries, or general-purpose tools or generally available free
127 | programs which are used unmodified in performing those activities but
128 | which are not part of the work. For example, Corresponding Source
129 | includes interface definition files associated with source files for
130 | the work, and the source code for shared libraries and dynamically
131 | linked subprograms that the work is specifically designed to require,
132 | such as by intimate data communication or control flow between those
133 | subprograms and other parts of the work.
134 |
135 | The Corresponding Source need not include anything that users
136 | can regenerate automatically from other parts of the Corresponding
137 | Source.
138 |
139 | The Corresponding Source for a work in source code form is that
140 | same work.
141 |
142 | 2. Basic Permissions.
143 |
144 | All rights granted under this License are granted for the term of
145 | copyright on the Program, and are irrevocable provided the stated
146 | conditions are met. This License explicitly affirms your unlimited
147 | permission to run the unmodified Program. The output from running a
148 | covered work is covered by this License only if the output, given its
149 | content, constitutes a covered work. This License acknowledges your
150 | rights of fair use or other equivalent, as provided by copyright law.
151 |
152 | You may make, run and propagate covered works that you do not
153 | convey, without conditions so long as your license otherwise remains
154 | in force. You may convey covered works to others for the sole purpose
155 | of having them make modifications exclusively for you, or provide you
156 | with facilities for running those works, provided that you comply with
157 | the terms of this License in conveying all material for which you do
158 | not control copyright. Those thus making or running the covered works
159 | for you must do so exclusively on your behalf, under your direction
160 | and control, on terms that prohibit them from making any copies of
161 | your copyrighted material outside their relationship with you.
162 |
163 | Conveying under any other circumstances is permitted solely under
164 | the conditions stated below. Sublicensing is not allowed; section 10
165 | makes it unnecessary.
166 |
167 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
168 |
169 | No covered work shall be deemed part of an effective technological
170 | measure under any applicable law fulfilling obligations under article
171 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
172 | similar laws prohibiting or restricting circumvention of such
173 | measures.
174 |
175 | When you convey a covered work, you waive any legal power to forbid
176 | circumvention of technological measures to the extent such circumvention
177 | is effected by exercising rights under this License with respect to
178 | the covered work, and you disclaim any intention to limit operation or
179 | modification of the work as a means of enforcing, against the work's
180 | users, your or third parties' legal rights to forbid circumvention of
181 | technological measures.
182 |
183 | 4. Conveying Verbatim Copies.
184 |
185 | You may convey verbatim copies of the Program's source code as you
186 | receive it, in any medium, provided that you conspicuously and
187 | appropriately publish on each copy an appropriate copyright notice;
188 | keep intact all notices stating that this License and any
189 | non-permissive terms added in accord with section 7 apply to the code;
190 | keep intact all notices of the absence of any warranty; and give all
191 | recipients a copy of this License along with the Program.
192 |
193 | You may charge any price or no price for each copy that you convey,
194 | and you may offer support or warranty protection for a fee.
195 |
196 | 5. Conveying Modified Source Versions.
197 |
198 | You may convey a work based on the Program, or the modifications to
199 | produce it from the Program, in the form of source code under the
200 | terms of section 4, provided that you also meet all of these conditions:
201 |
202 | a) The work must carry prominent notices stating that you modified
203 | it, and giving a relevant date.
204 |
205 | b) The work must carry prominent notices stating that it is
206 | released under this License and any conditions added under section
207 | 7. This requirement modifies the requirement in section 4 to
208 | "keep intact all notices".
209 |
210 | c) You must license the entire work, as a whole, under this
211 | License to anyone who comes into possession of a copy. This
212 | License will therefore apply, along with any applicable section 7
213 | additional terms, to the whole of the work, and all its parts,
214 | regardless of how they are packaged. This License gives no
215 | permission to license the work in any other way, but it does not
216 | invalidate such permission if you have separately received it.
217 |
218 | d) If the work has interactive user interfaces, each must display
219 | Appropriate Legal Notices; however, if the Program has interactive
220 | interfaces that do not display Appropriate Legal Notices, your
221 | work need not make them do so.
222 |
223 | A compilation of a covered work with other separate and independent
224 | works, which are not by their nature extensions of the covered work,
225 | and which are not combined with it such as to form a larger program,
226 | in or on a volume of a storage or distribution medium, is called an
227 | "aggregate" if the compilation and its resulting copyright are not
228 | used to limit the access or legal rights of the compilation's users
229 | beyond what the individual works permit. Inclusion of a covered work
230 | in an aggregate does not cause this License to apply to the other
231 | parts of the aggregate.
232 |
233 | 6. Conveying Non-Source Forms.
234 |
235 | You may convey a covered work in object code form under the terms
236 | of sections 4 and 5, provided that you also convey the
237 | machine-readable Corresponding Source under the terms of this License,
238 | in one of these ways:
239 |
240 | a) Convey the object code in, or embodied in, a physical product
241 | (including a physical distribution medium), accompanied by the
242 | Corresponding Source fixed on a durable physical medium
243 | customarily used for software interchange.
244 |
245 | b) Convey the object code in, or embodied in, a physical product
246 | (including a physical distribution medium), accompanied by a
247 | written offer, valid for at least three years and valid for as
248 | long as you offer spare parts or customer support for that product
249 | model, to give anyone who possesses the object code either (1) a
250 | copy of the Corresponding Source for all the software in the
251 | product that is covered by this License, on a durable physical
252 | medium customarily used for software interchange, for a price no
253 | more than your reasonable cost of physically performing this
254 | conveying of source, or (2) access to copy the
255 | Corresponding Source from a network server at no charge.
256 |
257 | c) Convey individual copies of the object code with a copy of the
258 | written offer to provide the Corresponding Source. This
259 | alternative is allowed only occasionally and noncommercially, and
260 | only if you received the object code with such an offer, in accord
261 | with subsection 6b.
262 |
263 | d) Convey the object code by offering access from a designated
264 | place (gratis or for a charge), and offer equivalent access to the
265 | Corresponding Source in the same way through the same place at no
266 | further charge. You need not require recipients to copy the
267 | Corresponding Source along with the object code. If the place to
268 | copy the object code is a network server, the Corresponding Source
269 | may be on a different server (operated by you or a third party)
270 | that supports equivalent copying facilities, provided you maintain
271 | clear directions next to the object code saying where to find the
272 | Corresponding Source. Regardless of what server hosts the
273 | Corresponding Source, you remain obligated to ensure that it is
274 | available for as long as needed to satisfy these requirements.
275 |
276 | e) Convey the object code using peer-to-peer transmission, provided
277 | you inform other peers where the object code and Corresponding
278 | Source of the work are being offered to the general public at no
279 | charge under subsection 6d.
280 |
281 | A separable portion of the object code, whose source code is excluded
282 | from the Corresponding Source as a System Library, need not be
283 | included in conveying the object code work.
284 |
285 | A "User Product" is either (1) a "consumer product", which means any
286 | tangible personal property which is normally used for personal, family,
287 | or household purposes, or (2) anything designed or sold for incorporation
288 | into a dwelling. In determining whether a product is a consumer product,
289 | doubtful cases shall be resolved in favor of coverage. For a particular
290 | product received by a particular user, "normally used" refers to a
291 | typical or common use of that class of product, regardless of the status
292 | of the particular user or of the way in which the particular user
293 | actually uses, or expects or is expected to use, the product. A product
294 | is a consumer product regardless of whether the product has substantial
295 | commercial, industrial or non-consumer uses, unless such uses represent
296 | the only significant mode of use of the product.
297 |
298 | "Installation Information" for a User Product means any methods,
299 | procedures, authorization keys, or other information required to install
300 | and execute modified versions of a covered work in that User Product from
301 | a modified version of its Corresponding Source. The information must
302 | suffice to ensure that the continued functioning of the modified object
303 | code is in no case prevented or interfered with solely because
304 | modification has been made.
305 |
306 | If you convey an object code work under this section in, or with, or
307 | specifically for use in, a User Product, and the conveying occurs as
308 | part of a transaction in which the right of possession and use of the
309 | User Product is transferred to the recipient in perpetuity or for a
310 | fixed term (regardless of how the transaction is characterized), the
311 | Corresponding Source conveyed under this section must be accompanied
312 | by the Installation Information. But this requirement does not apply
313 | if neither you nor any third party retains the ability to install
314 | modified object code on the User Product (for example, the work has
315 | been installed in ROM).
316 |
317 | The requirement to provide Installation Information does not include a
318 | requirement to continue to provide support service, warranty, or updates
319 | for a work that has been modified or installed by the recipient, or for
320 | the User Product in which it has been modified or installed. Access to a
321 | network may be denied when the modification itself materially and
322 | adversely affects the operation of the network or violates the rules and
323 | protocols for communication across the network.
324 |
325 | Corresponding Source conveyed, and Installation Information provided,
326 | in accord with this section must be in a format that is publicly
327 | documented (and with an implementation available to the public in
328 | source code form), and must require no special password or key for
329 | unpacking, reading or copying.
330 |
331 | 7. Additional Terms.
332 |
333 | "Additional permissions" are terms that supplement the terms of this
334 | License by making exceptions from one or more of its conditions.
335 | Additional permissions that are applicable to the entire Program shall
336 | be treated as though they were included in this License, to the extent
337 | that they are valid under applicable law. If additional permissions
338 | apply only to part of the Program, that part may be used separately
339 | under those permissions, but the entire Program remains governed by
340 | this License without regard to the additional permissions.
341 |
342 | When you convey a copy of a covered work, you may at your option
343 | remove any additional permissions from that copy, or from any part of
344 | it. (Additional permissions may be written to require their own
345 | removal in certain cases when you modify the work.) You may place
346 | additional permissions on material, added by you to a covered work,
347 | for which you have or can give appropriate copyright permission.
348 |
349 | Notwithstanding any other provision of this License, for material you
350 | add to a covered work, you may (if authorized by the copyright holders of
351 | that material) supplement the terms of this License with terms:
352 |
353 | a) Disclaiming warranty or limiting liability differently from the
354 | terms of sections 15 and 16 of this License; or
355 |
356 | b) Requiring preservation of specified reasonable legal notices or
357 | author attributions in that material or in the Appropriate Legal
358 | Notices displayed by works containing it; or
359 |
360 | c) Prohibiting misrepresentation of the origin of that material, or
361 | requiring that modified versions of such material be marked in
362 | reasonable ways as different from the original version; or
363 |
364 | d) Limiting the use for publicity purposes of names of licensors or
365 | authors of the material; or
366 |
367 | e) Declining to grant rights under trademark law for use of some
368 | trade names, trademarks, or service marks; or
369 |
370 | f) Requiring indemnification of licensors and authors of that
371 | material by anyone who conveys the material (or modified versions of
372 | it) with contractual assumptions of liability to the recipient, for
373 | any liability that these contractual assumptions directly impose on
374 | those licensors and authors.
375 |
376 | All other non-permissive additional terms are considered "further
377 | restrictions" within the meaning of section 10. If the Program as you
378 | received it, or any part of it, contains a notice stating that it is
379 | governed by this License along with a term that is a further
380 | restriction, you may remove that term. If a license document contains
381 | a further restriction but permits relicensing or conveying under this
382 | License, you may add to a covered work material governed by the terms
383 | of that license document, provided that the further restriction does
384 | not survive such relicensing or conveying.
385 |
386 | If you add terms to a covered work in accord with this section, you
387 | must place, in the relevant source files, a statement of the
388 | additional terms that apply to those files, or a notice indicating
389 | where to find the applicable terms.
390 |
391 | Additional terms, permissive or non-permissive, may be stated in the
392 | form of a separately written license, or stated as exceptions;
393 | the above requirements apply either way.
394 |
395 | 8. Termination.
396 |
397 | You may not propagate or modify a covered work except as expressly
398 | provided under this License. Any attempt otherwise to propagate or
399 | modify it is void, and will automatically terminate your rights under
400 | this License (including any patent licenses granted under the third
401 | paragraph of section 11).
402 |
403 | However, if you cease all violation of this License, then your
404 | license from a particular copyright holder is reinstated (a)
405 | provisionally, unless and until the copyright holder explicitly and
406 | finally terminates your license, and (b) permanently, if the copyright
407 | holder fails to notify you of the violation by some reasonable means
408 | prior to 60 days after the cessation.
409 |
410 | Moreover, your license from a particular copyright holder is
411 | reinstated permanently if the copyright holder notifies you of the
412 | violation by some reasonable means, this is the first time you have
413 | received notice of violation of this License (for any work) from that
414 | copyright holder, and you cure the violation prior to 30 days after
415 | your receipt of the notice.
416 |
417 | Termination of your rights under this section does not terminate the
418 | licenses of parties who have received copies or rights from you under
419 | this License. If your rights have been terminated and not permanently
420 | reinstated, you do not qualify to receive new licenses for the same
421 | material under section 10.
422 |
423 | 9. Acceptance Not Required for Having Copies.
424 |
425 | You are not required to accept this License in order to receive or
426 | run a copy of the Program. Ancillary propagation of a covered work
427 | occurring solely as a consequence of using peer-to-peer transmission
428 | to receive a copy likewise does not require acceptance. However,
429 | nothing other than this License grants you permission to propagate or
430 | modify any covered work. These actions infringe copyright if you do
431 | not accept this License. Therefore, by modifying or propagating a
432 | covered work, you indicate your acceptance of this License to do so.
433 |
434 | 10. Automatic Licensing of Downstream Recipients.
435 |
436 | Each time you convey a covered work, the recipient automatically
437 | receives a license from the original licensors, to run, modify and
438 | propagate that work, subject to this License. You are not responsible
439 | for enforcing compliance by third parties with this License.
440 |
441 | An "entity transaction" is a transaction transferring control of an
442 | organization, or substantially all assets of one, or subdividing an
443 | organization, or merging organizations. If propagation of a covered
444 | work results from an entity transaction, each party to that
445 | transaction who receives a copy of the work also receives whatever
446 | licenses to the work the party's predecessor in interest had or could
447 | give under the previous paragraph, plus a right to possession of the
448 | Corresponding Source of the work from the predecessor in interest, if
449 | the predecessor has it or can get it with reasonable efforts.
450 |
451 | You may not impose any further restrictions on the exercise of the
452 | rights granted or affirmed under this License. For example, you may
453 | not impose a license fee, royalty, or other charge for exercise of
454 | rights granted under this License, and you may not initiate litigation
455 | (including a cross-claim or counterclaim in a lawsuit) alleging that
456 | any patent claim is infringed by making, using, selling, offering for
457 | sale, or importing the Program or any portion of it.
458 |
459 | 11. Patents.
460 |
461 | A "contributor" is a copyright holder who authorizes use under this
462 | License of the Program or a work on which the Program is based. The
463 | work thus licensed is called the contributor's "contributor version".
464 |
465 | A contributor's "essential patent claims" are all patent claims
466 | owned or controlled by the contributor, whether already acquired or
467 | hereafter acquired, that would be infringed by some manner, permitted
468 | by this License, of making, using, or selling its contributor version,
469 | but do not include claims that would be infringed only as a
470 | consequence of further modification of the contributor version. For
471 | purposes of this definition, "control" includes the right to grant
472 | patent sublicenses in a manner consistent with the requirements of
473 | this License.
474 |
475 | Each contributor grants you a non-exclusive, worldwide, royalty-free
476 | patent license under the contributor's essential patent claims, to
477 | make, use, sell, offer for sale, import and otherwise run, modify and
478 | propagate the contents of its contributor version.
479 |
480 | In the following three paragraphs, a "patent license" is any express
481 | agreement or commitment, however denominated, not to enforce a patent
482 | (such as an express permission to practice a patent or covenant not to
483 | sue for patent infringement). To "grant" such a patent license to a
484 | party means to make such an agreement or commitment not to enforce a
485 | patent against the party.
486 |
487 | If you convey a covered work, knowingly relying on a patent license,
488 | and the Corresponding Source of the work is not available for anyone
489 | to copy, free of charge and under the terms of this License, through a
490 | publicly available network server or other readily accessible means,
491 | then you must either (1) cause the Corresponding Source to be so
492 | available, or (2) arrange to deprive yourself of the benefit of the
493 | patent license for this particular work, or (3) arrange, in a manner
494 | consistent with the requirements of this License, to extend the patent
495 | license to downstream recipients. "Knowingly relying" means you have
496 | actual knowledge that, but for the patent license, your conveying the
497 | covered work in a country, or your recipient's use of the covered work
498 | in a country, would infringe one or more identifiable patents in that
499 | country that you have reason to believe are valid.
500 |
501 | If, pursuant to or in connection with a single transaction or
502 | arrangement, you convey, or propagate by procuring conveyance of, a
503 | covered work, and grant a patent license to some of the parties
504 | receiving the covered work authorizing them to use, propagate, modify
505 | or convey a specific copy of the covered work, then the patent license
506 | you grant is automatically extended to all recipients of the covered
507 | work and works based on it.
508 |
509 | A patent license is "discriminatory" if it does not include within
510 | the scope of its coverage, prohibits the exercise of, or is
511 | conditioned on the non-exercise of one or more of the rights that are
512 | specifically granted under this License. You may not convey a covered
513 | work if you are a party to an arrangement with a third party that is
514 | in the business of distributing software, under which you make payment
515 | to the third party based on the extent of your activity of conveying
516 | the work, and under which the third party grants, to any of the
517 | parties who would receive the covered work from you, a discriminatory
518 | patent license (a) in connection with copies of the covered work
519 | conveyed by you (or copies made from those copies), or (b) primarily
520 | for and in connection with specific products or compilations that
521 | contain the covered work, unless you entered into that arrangement,
522 | or that patent license was granted, prior to 28 March 2007.
523 |
524 | Nothing in this License shall be construed as excluding or limiting
525 | any implied license or other defenses to infringement that may
526 | otherwise be available to you under applicable patent law.
527 |
528 | 12. No Surrender of Others' Freedom.
529 |
530 | If conditions are imposed on you (whether by court order, agreement or
531 | otherwise) that contradict the conditions of this License, they do not
532 | excuse you from the conditions of this License. If you cannot convey a
533 | covered work so as to satisfy simultaneously your obligations under this
534 | License and any other pertinent obligations, then as a consequence you may
535 | not convey it at all. For example, if you agree to terms that obligate you
536 | to collect a royalty for further conveying from those to whom you convey
537 | the Program, the only way you could satisfy both those terms and this
538 | License would be to refrain entirely from conveying the Program.
539 |
540 | 13. Remote Network Interaction; Use with the GNU General Public License.
541 |
542 | Notwithstanding any other provision of this License, if you modify the
543 | Program, your modified version must prominently offer all users
544 | interacting with it remotely through a computer network (if your version
545 | supports such interaction) an opportunity to receive the Corresponding
546 | Source of your version by providing access to the Corresponding Source
547 | from a network server at no charge, through some standard or customary
548 | means of facilitating copying of software. This Corresponding Source
549 | shall include the Corresponding Source for any work covered by version 3
550 | of the GNU General Public License that is incorporated pursuant to the
551 | following paragraph.
552 |
553 | Notwithstanding any other provision of this License, you have
554 | permission to link or combine any covered work with a work licensed
555 | under version 3 of the GNU General Public License into a single
556 | combined work, and to convey the resulting work. The terms of this
557 | License will continue to apply to the part which is the covered work,
558 | but the work with which it is combined will remain governed by version
559 | 3 of the GNU General Public License.
560 |
561 | 14. Revised Versions of this License.
562 |
563 | The Free Software Foundation may publish revised and/or new versions of
564 | the GNU Affero General Public License from time to time. Such new versions
565 | will be similar in spirit to the present version, but may differ in detail to
566 | address new problems or concerns.
567 |
568 | Each version is given a distinguishing version number. If the
569 | Program specifies that a certain numbered version of the GNU Affero General
570 | Public License "or any later version" applies to it, you have the
571 | option of following the terms and conditions either of that numbered
572 | version or of any later version published by the Free Software
573 | Foundation. If the Program does not specify a version number of the
574 | GNU Affero General Public License, you may choose any version ever published
575 | by the Free Software Foundation.
576 |
577 | If the Program specifies that a proxy can decide which future
578 | versions of the GNU Affero General Public License can be used, that proxy's
579 | public statement of acceptance of a version permanently authorizes you
580 | to choose that version for the Program.
581 |
582 | Later license versions may give you additional or different
583 | permissions. However, no additional obligations are imposed on any
584 | author or copyright holder as a result of your choosing to follow a
585 | later version.
586 |
587 | 15. Disclaimer of Warranty.
588 |
589 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
590 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
591 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
592 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
593 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
594 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
595 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
596 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
597 |
598 | 16. Limitation of Liability.
599 |
600 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
601 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
602 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
603 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
604 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
605 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
606 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
607 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
608 | SUCH DAMAGES.
609 |
610 | 17. Interpretation of Sections 15 and 16.
611 |
612 | If the disclaimer of warranty and limitation of liability provided
613 | above cannot be given local legal effect according to their terms,
614 | reviewing courts shall apply local law that most closely approximates
615 | an absolute waiver of all civil liability in connection with the
616 | Program, unless a warranty or assumption of liability accompanies a
617 | copy of the Program in return for a fee.
618 |
619 | END OF TERMS AND CONDITIONS
620 |
621 | How to Apply These Terms to Your New Programs
622 |
623 | If you develop a new program, and you want it to be of the greatest
624 | possible use to the public, the best way to achieve this is to make it
625 | free software which everyone can redistribute and change under these terms.
626 |
627 | To do so, attach the following notices to the program. It is safest
628 | to attach them to the start of each source file to most effectively
629 | state the exclusion of warranty; and each file should have at least
630 | the "copyright" line and a pointer to where the full notice is found.
631 |
632 |
633 | Copyright (C)
634 |
635 | This program is free software: you can redistribute it and/or modify
636 | it under the terms of the GNU Affero General Public License as published
637 | by the Free Software Foundation, either version 3 of the License, or
638 | (at your option) any later version.
639 |
640 | This program is distributed in the hope that it will be useful,
641 | but WITHOUT ANY WARRANTY; without even the implied warranty of
642 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
643 | GNU Affero General Public License for more details.
644 |
645 | You should have received a copy of the GNU Affero General Public License
646 | along with this program. If not, see .
647 |
648 | Also add information on how to contact you by electronic and paper mail.
649 |
650 | If your software can interact with users remotely through a computer
651 | network, you should also make sure that it provides a way for users to
652 | get its source. For example, if your program is a web application, its
653 | interface could display a "Source" link that leads users to an archive
654 | of the code. There are many ways you could offer source, and different
655 | solutions will be better for different programs; see section 13 for the
656 | specific requirements.
657 |
658 | You should also get your employer (if you work as a programmer) or school,
659 | if any, to sign a "copyright disclaimer" for the program, if necessary.
660 | For more information on this, and how to apply and follow the GNU AGPL, see
661 | .
662 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Chat-Excel Project
2 |
3 | ## Project Introduction
4 | The `chat-excel` repository is a Python-based project utilizing LLamaIndex, designed to process Excel data with the help of large language models. The project can read Excel files and load worksheets as `DataFrame`. Users can input questions, and the project uses an agent to generate SQL queries to perform statistical analysis on Excel data.
5 |
6 | [中文 Chinese README](README.zh.md)
7 |
8 | ## Main Features
9 | - Read Excel files and load worksheet data.
10 | - Analyze user questions using `FunctionAgent` and generate SQL queries.
11 | - Execute SQL queries in batch and return analysis results.
12 | - Validate table compliance to avoid irregular format data affecting the analysis.
13 | - Support multi-worksheet queries.
14 | - Provide a Gradio interface for user interaction.
15 | - Support Markdown export, which can be opened and converted with Markdown editors.
16 | - Analyze non-standard tables with merged cells.
17 |
18 | ## Output Examples
19 | Screenshots:
20 | 
21 |
22 | 
23 |
24 | ## Core Code
25 | ### Main Program
26 | `main.py`: The main program responsible for reading files and handling user queries.
27 |
28 | ### Utility Functions
29 | Defines multiple utility functions, such as getting sheet names, checking table compliance, executing SQL queries, etc.
30 |
31 | ### Agent Configuration
32 | Configures the `FunctionAgent` to handle table-related queries.
33 |
34 | ## Installation and Usage
35 | ### Install Dependencies
36 | ```bash
37 | pip install -r requirements.txt
38 | ```
39 | Command to generate `requirements.txt`:
40 | ```bash
41 | pipreqs ./ --encoding=utf8 --force
42 | ```
43 |
44 | ### Set Environment Variables
45 | Create a `.env` file and set the following environment variables:
46 | ```bash
47 | OPENAI_API_KEY=your_key
48 | OPENAI_API_BASE=api_address
49 | OPENAI_MODEL_NAME=primary_model
50 | ANALYZE_LLM_MODEL_NAME=table_analysis_model (usually deepseek-v3)
51 | ```
52 |
53 | ### Run the Project
54 | ```bash
55 | python main.py
56 | ```
57 |
58 | ## Notes
59 | - Ensure the Excel file path is correct.
60 | - Ensure the file is compliant to avoid data format errors; merged cells are not allowed.
61 | - Ensure environment variables are set correctly.
62 |
63 | ## TODO
64 | - Enhance the user interface experience.
65 | - Support more features.
--------------------------------------------------------------------------------
/README.zh.md:
--------------------------------------------------------------------------------
1 | # Chat-Excel 项目
2 |
3 | ## 项目介绍
4 | 此仓库 `chat-excel` 是一个基于Python使用了LLamaIndex实现的项目,旨在借助大语言模型处理Excel数据。它能读取Excel文件,将各工作表加载为 `DataFrame`。用户可输入问题,项目会利用代理生成SQL查询,对Excel数据开展统计分析。
5 |
6 | [English README](README.md)
7 |
8 | ## 主要功能
9 | - 读取Excel文件,加载工作表数据。
10 | - 借助 `FunctionAgent` 分析用户问题,生成SQL查询。
11 | - 批量执行SQL查询,返回分析结果。
12 | - 验证表格规范性,避免不规则格式数据影响分析。
13 | - 支持多工作表查询。
14 | - 支持gradio界面,方便用户交互。
15 | - 支持Markdown格式导出,可以用Markdown编辑器打开和转换。、
16 | - 支持带有合并单元格的非正规表分析
17 |
18 | ## 输出示例
19 | 截图如下:
20 | 
21 |
22 | 
23 |
24 | ## 核心代码
25 | ### 主程序
26 | `main.py`:主程序,负责读取文件、处理用户问题。
27 |
28 | ### 工具函数
29 | 定义多个工具函数,如获取表名、判断表格规范性、执行SQL查询等。
30 |
31 | ### 代理配置
32 | 配置 `FunctionAgent`,指导其处理表格相关问题。
33 |
34 | ## 安装与使用
35 | ### 安装依赖
36 | ```bash
37 | pip install -r requirements.txt
38 | ```
39 | requirements.txt的生成命令:
40 | ```bash
41 | pipreqs ./ --encoding=utf8 --force
42 | ```
43 |
44 | ### 设置环境变量
45 | 创建 `.env` 文件中设置以下环境变量:
46 | ```bash
47 | OPENAI_API_KEY=密钥
48 | OPENAI_API_BASE=api地址
49 | OPENAI_MODEL_NAME=主大弄下
50 | ANALYZE_LLM_MODEL_NAME=表格分析大模型一般用deepseek-v3
51 | ```
52 |
53 | ### 运行项目
54 | ```bash
55 | python main.py
56 | ```
57 | ## 注意事项
58 | - 确保Excel文件路径正确。
59 | - 确保文件规范性,避免数据格式错误,不允许合并单元格。
60 | - 确保正确设置了环境变量。
61 |
62 | ## todo
63 | - 优化交互界面体验
64 | - 支持更多的功能
--------------------------------------------------------------------------------
/agents/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/18 14:11
5 | * @FileName: __init__.py.py
6 | **************************************
7 | """
8 |
--------------------------------------------------------------------------------
/agents/markdown_table_agent.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/18 14:13
5 | * @FileName: markdown_table_agent.py
6 | **************************************
7 | """
8 | from llama_index.core.agent.workflow import FunctionAgent
9 |
10 | from core.agent import BaseAgent
11 | from tools.analyze_tool import analyze_table
12 | from tools.quickchart_tool import generate_bar_chart, generate_pie_chart
13 | from tools.table_tool import get_table_data_to_markdown
14 |
15 |
16 | def get_markdown_table_agent(llm):
17 | # 分析表格干什么的代理
18 | markdown_table_agent = FunctionAgent(
19 | name="markdown_table_agent",
20 | llm=llm,
21 | description="你是一个有用的非正规表格分析助手。",
22 | system_prompt=(
23 | """
24 | # 非正规表格分析与报告助手
25 | ## 功能描述
26 | 你是一个专业的表格统计分析建议生成助手,也是数据洞察助手,擅长输出图文并茂的数据报告。
27 |
28 | ## 工具使用说明
29 | - analyze_tool 工具用于分析表格数据,返回分析结果,你应该使用这个工具去分析表格数据不需要你自己分析。
30 | - 在收到analyze_tool的结果后你使用你需要对报告进行整理结合图形化工具生成图片并插入正文。
31 | - generate_bar_chart 工具用于生成条形图,generate_pie_chart 工具用于生成饼图,返回图片url请你自己插入正文。
32 | - 对于分析的数据你应该考虑调用图形工具去生成图片并插入正文。
33 | - 请你一定要使用图片工具去生成图片,不要自己乱生成。
34 | - 你不能说什么任务已成功转交给`markdown_table_agent`这种话,你就是markdown_table_agent,你应该完成任务。
35 |
36 | ## 注意事项
37 | - 表格数据和表格信息都来自 get_excel_info_tool 工具获取的,你应该使用这个工具去分析表格数据,不要尝试反问我拿数据。
38 | - 你应该正确的考虑使用什么图形化工具去生成图片(条形图好还是饼图好),不要一个劲的只使用一种。
39 | - 所有的数据和图表不能自己乱编造。
40 |
41 | # 输出要求
42 | - 仅回答与表格相关的问题,对于表格无关的问题请直接拒绝回答。
43 | - 依据表格中的数据,生成有针对性的统计分析建议。
44 | - 针对每个数据如果能够生成条形图应该都去调用一次工具去生成图片。
45 | - 输出数据报告用Markdown格式,要图文并茂。
46 | - 不能无中生有乱造数据和图片。
47 | - 尽量文字结合图片回答,不要能生成图片却不生成图片,可以多次使用图形工具。
48 | """
49 |
50 | ),
51 | tools=[analyze_table, generate_bar_chart, generate_pie_chart],
52 | verbose=True
53 | )
54 | return markdown_table_agent
55 |
56 |
57 | class MarkdownTableAgent(BaseAgent):
58 | def __init__(self, llm):
59 | super().__init__(llm)
60 | self.agent = get_markdown_table_agent(llm)
61 | self.get_agent()
62 |
63 | def get_agent(self):
64 | return self.agent
65 |
66 | def get_agent_name(self):
67 | return self.agent.name
68 |
69 |
--------------------------------------------------------------------------------
/agents/pandasql_agent.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/18 14:42
5 | * @FileName: pandasql_agent.py
6 | **************************************
7 | """
8 | from llama_index.core.agent.workflow import FunctionAgent
9 |
10 | from core.agent import BaseAgent
11 | from tools.quickchart_tool import generate_bar_chart, generate_pie_chart
12 | from tools.table_tool import run_sql_queries, get_excel_info_tool, re_parse_table_head, get_table_head_data_to_markdown
13 |
14 |
15 | def get_sql_agent(llm):
16 | # 分析表格干什么的代理
17 | sql_table_agent = FunctionAgent(
18 | name="sql_table_agent",
19 | llm=llm,
20 | description="你是一个有用的正规表格分析与报告助手",
21 | system_prompt=(
22 | """
23 | # sql_table_agent正规表格分析与报告助手
24 | ## 功能描述
25 | - 你是一个专业的利用sql分析表格,并给出分析报告,也是数据洞察助手,擅长输出图文并茂全面的数据报告。
26 |
27 | ## 工具使用说明
28 | - get_table_head_data_to_markdown 工具获取sql表格信息和表名,同时会返回表格的少部分的样本数据,调用后你应该立即判断表格的header当前是否正确。
29 | - 当你调用get_table_head_data_to_markdown后发现某个sheet第一行不是表头的时候你应该立即调用`re_parse_table_head`工具重新定位修复表头,可以多次调用。
30 | - 你可以去猜测正确的字段名在哪一行,然后调用 re_parse_table_head 工具重新定位表头,把表头(字段名所在行)指向正确的行。
31 | - generate_bar_chart 工具用于生成条形图,generate_pie_chart 工具用于生成饼图。
32 | - run_sql_queries 工具用于执行 SQL 查询,返回查询结果。
33 | - 请你一定要使用图片工具去生成图片,不要自己乱生成。
34 |
35 | ## 注意事项
36 | - 根据用户提出的问题进行分析,生成严格遵守 SQLite3 SQL 规范的语句(可生成多条),避免执行出错。
37 | - 单个 SQL 查询语句的最大返回条数需控制在 20 条以内,防止单个查询返回过多数据。
38 | - 注意只要你分析出sql语句,就可以直接执行sql语句,不要去问客户端是否需要执行sql语句。
39 | - 注意每次执行前你都应该先调用 `get_table_head_data_to_markdown` 工具获取表格信息,当发生sql错误时你更加应该重新调用工具获取表信息,然后再根据表格信息生成sql语句。
40 | - 你应该正确的考虑使用什么图形化工具去生成图片(条形图好还是饼图好),不要一个劲的只使用一种。
41 | - 由于字段名会有空格,所以你需要使用反引号包裹字段名。
42 | - 表名不要任何包裹,字段名才需要用反引号包裹字段名。
43 | - 所有的数据和图表应该都是采用工具得出,不能自己乱编造。
44 | - 报告应该要尽量全面,你应该先思考规划要从哪些维度去分析,再去开始你的报告。
45 | - 如果多次调用 `re_parse_table_head` 工具都没有效果,那可能是表格数据有问题,你应该考虑结束任务。
46 |
47 | ## 行动指南
48 | - 先planning,然后再行动。
49 | - 先分析表格内容,判断表格的类型和作用和字段。
50 | - 再生成要分析的内容。
51 | - 最后利用工具去获取数据并生成报告。
52 |
53 | ## 输出要求
54 | - 要求输出图文并茂的报告,针对每个数据如果能够生成条形图应该都去调用一次工具去生成图片。
55 | - 输出报告面向普通用户,sql语句只是你的工具功能,禁止报告中出现sql语句。
56 | - 输出数据报告用Markdown格式,要图文并茂,注意检查输出格式,避免markdown需要换行的地方你没有正确换行。
57 | - 不能无中生有乱造数据和图片。
58 |
59 | """
60 |
61 | ),
62 | tools=[run_sql_queries, re_parse_table_head, get_table_head_data_to_markdown, generate_bar_chart, generate_pie_chart],
63 | verbose=True
64 | )
65 | return sql_table_agent
66 |
67 |
68 | class SqlTableAgent(BaseAgent):
69 | def __init__(self, llm):
70 | super().__init__(llm)
71 | self.agent = get_sql_agent(llm)
72 | self.get_agent()
73 |
74 | def get_agent(self):
75 | return self.agent
76 |
77 | def get_agent_name(self):
78 | return self.agent.name
79 |
--------------------------------------------------------------------------------
/agents/router_agent.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/18 15:54
5 | * @FileName: router_agent.py
6 | **************************************
7 | """
8 | from llama_index.core.agent.workflow import FunctionAgent
9 |
10 | from core.agent import BaseAgent
11 | from tools.table_tool import get_table_head_data_to_markdown
12 |
13 |
14 | def get_router_agent(llm):
15 | # 分析表格干什么的代理
16 | agent = FunctionAgent(
17 | name="table_agent",
18 | llm=llm,
19 | description="你是一个表格分类助手,表格数据我传到get_table_head_data_to_markdown这个工具了你去拿",
20 | system_prompt=(
21 | """
22 | # 你是一个表格分类助手
23 | ## 功能描述
24 | - 你是一个专业的表格分类助手,擅长将表格分类为不同的类型,擅长把表格路由到sql分析或者markdown分析。
25 | - 用户表格数据已经放在`get_table_head_data_to_markdown`这个工具中,你去拿,不要尝试反问我要数据。
26 |
27 | ## 行动指南
28 | - 调用工具"get_table_head_data_to_markdown"获取表格数据。
29 | - 分析表格内容,判断表格的类型。
30 | - 给出充分的理由。
31 | - 转交任务给相应的agent处理。
32 |
33 | ## 分类说明
34 | 表格应该分为以下几种类型:
35 | - 正规表格(sql分析)。
36 | - 非常规表格(markdown分析)。
37 |
38 | ## 正规表格说明(全部满足以下需求)
39 | - 整张表可以直接或者简单的去掉几行后就可以导入pandasql分析。
40 | - 表内容导入后适合sql分析。
41 | - 总之不适合直接"pd.DataFrame(data, columns=header)"一次性加载并且直接写sql就能正确分析的sheet都不属于正规表格。
42 | - 如果去掉不正规的表头,剩下的表格内容就正规了,可以直接导入pandas分析,那也算正规表。
43 | - 如果列名字段名重复会导致转化成sql时会报错,所以应该当作非正规表格对待。
44 | - 如果有sheet字数超过3000,那直接交给sql_table_agent处理。
45 |
46 | ## 非常规表格说明(全部满足以下需求)
47 | - 正规表格的反例。
48 |
49 | ## handoff转交说明
50 | - 非正规表转交给markdown_table_agent处理。
51 | - 正规表转交给sql_table_agent处理。
52 | - 你不能直接处理和分析表格数据,因为你的任务是判断表格的类型,而不是分析表格数据。
53 | - handoff的reason,请说 具体理由 + ”请你结合历史消息和问题来正确完成任务“ + 具体的任务。
54 |
55 | """
56 |
57 | ),
58 | tools=[get_table_head_data_to_markdown],
59 | can_handoff_to=["markdown_table_agent", "sql_table_agent"],
60 | verbose=True
61 | )
62 | return agent
63 |
64 |
65 | class RouterAgent(BaseAgent):
66 | def __init__(self, llm):
67 | super().__init__(llm)
68 | self.agent = get_router_agent(llm)
69 | self.get_agent()
70 |
71 | def get_agent(self):
72 | return self.agent
73 |
74 | def get_agent_name(self):
75 | return self.agent.name
76 |
--------------------------------------------------------------------------------
/asserts/gradio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/asserts/gradio.png
--------------------------------------------------------------------------------
/asserts/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/asserts/img.png
--------------------------------------------------------------------------------
/core/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/18 10:59
5 | * @FileName: __init__.py.py
6 | **************************************
7 | """
8 |
--------------------------------------------------------------------------------
/core/agent.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/18 14:45
5 | * @FileName: Agent.py
6 | **************************************
7 | """
8 |
9 |
10 | class BaseAgent:
11 | def __init__(self, llm):
12 | self.llm = llm
13 | self.agent = None
14 |
15 | # 定义一个虚函数 其它类必须继承
16 | def get_agent(self):
17 | raise NotImplementedError("get_agent() 方法必须在子类中实现")
18 |
19 | def get_agent_name(self):
20 | raise NotImplementedError("get_agent_name() 方法必须在子类中实现")
21 |
--------------------------------------------------------------------------------
/core/excel_table.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/18 11:00
5 | * @FileName: excel_table.py
6 | **************************************
7 | """
8 | # excel文件类
9 |
10 | from utils.excel_loader import load_excel_from_file
11 |
12 |
13 | class ExcelTable:
14 | def __init__(self, file_path, merge_cells=False):
15 | self.file_path = file_path
16 | self.merge_cells = merge_cells
17 | self.sheets_db = load_excel_from_file(file_path, merge_cells)
18 |
19 | def set_sheets_db(self, sheets_db):
20 | self.sheets_db = sheets_db
21 |
22 | def is_regular_table(self):
23 | """判断是否是常规表格"""
24 | for sheet_name, df in self.sheets_db.items():
25 | if not df.empty:
26 | return True
27 |
28 | def show_markdown(self):
29 | """展示表格"""
30 | print(self.get_markdown())
31 |
32 | def get_markdown(self):
33 | """展示表格"""
34 | markdown_text = ""
35 | for sheet_name, df in self.sheets_db.items():
36 | markdown_text += f"## 表格(sheet)名称: {sheet_name}\n"
37 | markdown_text += df.to_markdown() + "\n\n"
38 | return markdown_text
39 |
40 | # 获取markdown格式前100行
41 | def get_markdown_head(self):
42 | """展示表格"""
43 | markdown_text = ""
44 | for sheet_name, df in self.sheets_db.items():
45 | markdown_text += f"## 表格(sheet)名称: {sheet_name}\n"
46 | markdown_text += f"表格总字数: {len(df.to_markdown())}\n"
47 | markdown_text += df.head(20).to_markdown() + "\n\n"
48 | return markdown_text
49 |
50 | def get_sheets_db(self):
51 | return self.sheets_db
52 |
53 |
--------------------------------------------------------------------------------
/core/openai_like_llm.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/15 14:25
5 | * @FileName: openai_like_llm.py
6 | **************************************
7 | """
8 | import os
9 |
10 | from llama_index.core.base.llms.types import LLMMetadata, MessageRole
11 | from llama_index.llms.openai import OpenAI
12 | from dotenv import load_dotenv
13 |
14 | # 加载 .env 文件中的环境变量
15 | load_dotenv()
16 |
17 | CONTEXT_WINDOW = 128000
18 |
19 | # print("所有环境变量:")
20 | # for key, value in os.environ.items():
21 | # print(f"{key}: {value}")
22 |
23 | # 如果没有设置环境变量,报错
24 | if "OPENAI_API_BASE" not in os.environ:
25 | raise ValueError("OPENAI_API_BASE 环境变量未设置")
26 |
27 | OPENAI_API_BASE = os.environ["OPENAI_API_BASE"]
28 | OPENAI_MODEL_NAME = os.environ["OPENAI_MODEL_NAME"]
29 | OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
30 | ANALYZE_LLM_MODEL_NAME = os.environ["ANALYZE_LLM_MODEL_NAME"]
31 |
32 |
33 | class OpenAILikeLLM(OpenAI):
34 | @property
35 | def metadata(self) -> LLMMetadata:
36 | return LLMMetadata(
37 | context_window=CONTEXT_WINDOW,
38 | num_output=self.max_tokens or -1,
39 | is_chat_model=True,
40 | is_function_calling_model=True,
41 | model_name=self.model,
42 | system_role=MessageRole.SYSTEM,
43 | )
44 |
45 |
--------------------------------------------------------------------------------
/data/SuperStoreUS-2015.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/data/SuperStoreUS-2015.xlsx
--------------------------------------------------------------------------------
/data/daily-min-temperatures.csv:
--------------------------------------------------------------------------------
1 | "Date","Temp"
2 | "1981-01-01",20.7
3 | "1981-01-02",17.9
4 | "1981-01-03",18.8
5 | "1981-01-04",14.6
6 | "1981-01-05",15.8
7 | "1981-01-06",15.8
8 | "1981-01-07",15.8
9 | "1981-01-08",17.4
10 | "1981-01-09",21.8
11 | "1981-01-10",20.0
12 | "1981-01-11",16.2
13 | "1981-01-12",13.3
14 | "1981-01-13",16.7
15 | "1981-01-14",21.5
16 | "1981-01-15",25.0
17 | "1981-01-16",20.7
18 | "1981-01-17",20.6
19 | "1981-01-18",24.8
20 | "1981-01-19",17.7
21 | "1981-01-20",15.5
22 | "1981-01-21",18.2
23 | "1981-01-22",12.1
24 | "1981-01-23",14.4
25 | "1981-01-24",16.0
26 | "1981-01-25",16.5
27 | "1981-01-26",18.7
28 | "1981-01-27",19.4
29 | "1981-01-28",17.2
30 | "1981-01-29",15.5
31 | "1981-01-30",15.1
32 | "1981-01-31",15.4
33 | "1981-02-01",15.3
34 | "1981-02-02",18.8
35 | "1981-02-03",21.9
36 | "1981-02-04",19.9
37 | "1981-02-05",16.6
38 | "1981-02-06",16.8
39 | "1981-02-07",14.6
40 | "1981-02-08",17.1
41 | "1981-02-09",25.0
42 | "1981-02-10",15.0
43 | "1981-02-11",13.7
44 | "1981-02-12",13.9
45 | "1981-02-13",18.3
46 | "1981-02-14",22.0
47 | "1981-02-15",22.1
48 | "1981-02-16",21.2
49 | "1981-02-17",18.4
50 | "1981-02-18",16.6
51 | "1981-02-19",16.1
52 | "1981-02-20",15.7
53 | "1981-02-21",16.6
54 | "1981-02-22",16.5
55 | "1981-02-23",14.4
56 | "1981-02-24",14.4
57 | "1981-02-25",18.5
58 | "1981-02-26",16.9
59 | "1981-02-27",17.5
60 | "1981-02-28",21.2
61 | "1981-03-01",17.8
62 | "1981-03-02",18.6
63 | "1981-03-03",17.0
64 | "1981-03-04",16.0
65 | "1981-03-05",13.3
66 | "1981-03-06",14.3
67 | "1981-03-07",11.4
68 | "1981-03-08",16.3
69 | "1981-03-09",16.1
70 | "1981-03-10",11.8
71 | "1981-03-11",12.2
72 | "1981-03-12",14.7
73 | "1981-03-13",11.8
74 | "1981-03-14",11.3
75 | "1981-03-15",10.6
76 | "1981-03-16",11.7
77 | "1981-03-17",14.2
78 | "1981-03-18",11.2
79 | "1981-03-19",16.9
80 | "1981-03-20",16.7
81 | "1981-03-21",8.1
82 | "1981-03-22",8.0
83 | "1981-03-23",8.8
84 | "1981-03-24",13.4
85 | "1981-03-25",10.9
86 | "1981-03-26",13.4
87 | "1981-03-27",11.0
88 | "1981-03-28",15.0
89 | "1981-03-29",15.7
90 | "1981-03-30",14.5
91 | "1981-03-31",15.8
92 | "1981-04-01",16.7
93 | "1981-04-02",16.8
94 | "1981-04-03",17.5
95 | "1981-04-04",17.1
96 | "1981-04-05",18.1
97 | "1981-04-06",16.6
98 | "1981-04-07",10.0
99 | "1981-04-08",14.9
100 | "1981-04-09",15.9
101 | "1981-04-10",13.0
102 | "1981-04-11",7.6
103 | "1981-04-12",11.5
104 | "1981-04-13",13.5
105 | "1981-04-14",13.0
106 | "1981-04-15",13.3
107 | "1981-04-16",12.1
108 | "1981-04-17",12.4
109 | "1981-04-18",13.2
110 | "1981-04-19",13.8
111 | "1981-04-20",10.6
112 | "1981-04-21",9.0
113 | "1981-04-22",10.0
114 | "1981-04-23",9.8
115 | "1981-04-24",11.5
116 | "1981-04-25",8.9
117 | "1981-04-26",7.4
118 | "1981-04-27",9.9
119 | "1981-04-28",9.3
120 | "1981-04-29",9.9
121 | "1981-04-30",7.4
122 | "1981-05-01",8.6
123 | "1981-05-02",11.9
124 | "1981-05-03",14.0
125 | "1981-05-04",8.6
126 | "1981-05-05",10.0
127 | "1981-05-06",13.5
128 | "1981-05-07",12.0
129 | "1981-05-08",10.5
130 | "1981-05-09",10.7
131 | "1981-05-10",8.1
132 | "1981-05-11",10.1
133 | "1981-05-12",10.6
134 | "1981-05-13",5.3
135 | "1981-05-14",6.6
136 | "1981-05-15",8.5
137 | "1981-05-16",11.2
138 | "1981-05-17",9.8
139 | "1981-05-18",5.9
140 | "1981-05-19",3.2
141 | "1981-05-20",2.1
142 | "1981-05-21",3.4
143 | "1981-05-22",5.4
144 | "1981-05-23",9.6
145 | "1981-05-24",11.5
146 | "1981-05-25",12.3
147 | "1981-05-26",12.6
148 | "1981-05-27",11.0
149 | "1981-05-28",11.2
150 | "1981-05-29",11.4
151 | "1981-05-30",11.8
152 | "1981-05-31",12.8
153 | "1981-06-01",11.6
154 | "1981-06-02",10.6
155 | "1981-06-03",9.8
156 | "1981-06-04",11.2
157 | "1981-06-05",5.7
158 | "1981-06-06",7.1
159 | "1981-06-07",2.5
160 | "1981-06-08",3.5
161 | "1981-06-09",4.6
162 | "1981-06-10",11.0
163 | "1981-06-11",5.7
164 | "1981-06-12",7.7
165 | "1981-06-13",10.4
166 | "1981-06-14",11.4
167 | "1981-06-15",9.2
168 | "1981-06-16",6.1
169 | "1981-06-17",2.7
170 | "1981-06-18",4.3
171 | "1981-06-19",6.3
172 | "1981-06-20",3.8
173 | "1981-06-21",4.4
174 | "1981-06-22",7.1
175 | "1981-06-23",4.8
176 | "1981-06-24",5.8
177 | "1981-06-25",6.2
178 | "1981-06-26",7.3
179 | "1981-06-27",9.2
180 | "1981-06-28",10.2
181 | "1981-06-29",9.5
182 | "1981-06-30",9.5
183 | "1981-07-01",10.7
184 | "1981-07-02",10.0
185 | "1981-07-03",6.5
186 | "1981-07-04",7.0
187 | "1981-07-05",7.4
188 | "1981-07-06",8.1
189 | "1981-07-07",6.6
190 | "1981-07-08",8.3
191 | "1981-07-09",8.9
192 | "1981-07-10",4.6
193 | "1981-07-11",6.8
194 | "1981-07-12",5.7
195 | "1981-07-13",6.1
196 | "1981-07-14",7.0
197 | "1981-07-15",7.2
198 | "1981-07-16",6.3
199 | "1981-07-17",8.8
200 | "1981-07-18",5.0
201 | "1981-07-19",7.4
202 | "1981-07-20",10.1
203 | "1981-07-21",12.0
204 | "1981-07-22",9.0
205 | "1981-07-23",8.9
206 | "1981-07-24",9.8
207 | "1981-07-25",9.0
208 | "1981-07-26",9.2
209 | "1981-07-27",7.7
210 | "1981-07-28",8.0
211 | "1981-07-29",6.1
212 | "1981-07-30",3.5
213 | "1981-07-31",3.2
214 | "1981-08-01",5.7
215 | "1981-08-02",7.7
216 | "1981-08-03",9.0
217 | "1981-08-04",10.0
218 | "1981-08-05",6.2
219 | "1981-08-06",6.9
220 | "1981-08-07",6.5
221 | "1981-08-08",6.8
222 | "1981-08-09",7.0
223 | "1981-08-10",5.2
224 | "1981-08-11",3.0
225 | "1981-08-12",5.6
226 | "1981-08-13",7.9
227 | "1981-08-14",9.0
228 | "1981-08-15",8.6
229 | "1981-08-16",10.3
230 | "1981-08-17",10.5
231 | "1981-08-18",7.6
232 | "1981-08-19",9.7
233 | "1981-08-20",12.5
234 | "1981-08-21",7.4
235 | "1981-08-22",7.9
236 | "1981-08-23",3.9
237 | "1981-08-24",6.6
238 | "1981-08-25",4.6
239 | "1981-08-26",7.0
240 | "1981-08-27",6.0
241 | "1981-08-28",5.5
242 | "1981-08-29",8.1
243 | "1981-08-30",5.5
244 | "1981-08-31",6.2
245 | "1981-09-01",8.0
246 | "1981-09-02",10.3
247 | "1981-09-03",9.8
248 | "1981-09-04",9.6
249 | "1981-09-05",8.5
250 | "1981-09-06",7.5
251 | "1981-09-07",11.2
252 | "1981-09-08",14.6
253 | "1981-09-09",11.7
254 | "1981-09-10",7.8
255 | "1981-09-11",12.3
256 | "1981-09-12",10.1
257 | "1981-09-13",11.5
258 | "1981-09-14",7.3
259 | "1981-09-15",10.9
260 | "1981-09-16",14.1
261 | "1981-09-17",10.7
262 | "1981-09-18",16.9
263 | "1981-09-19",10.5
264 | "1981-09-20",6.5
265 | "1981-09-21",11.0
266 | "1981-09-22",6.3
267 | "1981-09-23",10.5
268 | "1981-09-24",7.2
269 | "1981-09-25",7.6
270 | "1981-09-26",10.7
271 | "1981-09-27",7.8
272 | "1981-09-28",9.6
273 | "1981-09-29",11.4
274 | "1981-09-30",12.4
275 | "1981-10-01",8.9
276 | "1981-10-02",13.2
277 | "1981-10-03",8.6
278 | "1981-10-04",6.2
279 | "1981-10-05",11.4
280 | "1981-10-06",13.2
281 | "1981-10-07",14.3
282 | "1981-10-08",7.3
283 | "1981-10-09",12.9
284 | "1981-10-10",7.8
285 | "1981-10-11",6.2
286 | "1981-10-12",5.6
287 | "1981-10-13",10.0
288 | "1981-10-14",13.3
289 | "1981-10-15",8.3
290 | "1981-10-16",10.2
291 | "1981-10-17",8.6
292 | "1981-10-18",7.3
293 | "1981-10-19",10.4
294 | "1981-10-20",11.2
295 | "1981-10-21",13.2
296 | "1981-10-22",11.4
297 | "1981-10-23",9.1
298 | "1981-10-24",6.6
299 | "1981-10-25",8.4
300 | "1981-10-26",9.7
301 | "1981-10-27",13.2
302 | "1981-10-28",12.5
303 | "1981-10-29",11.0
304 | "1981-10-30",11.0
305 | "1981-10-31",11.7
306 | "1981-11-01",9.2
307 | "1981-11-02",11.5
308 | "1981-11-03",13.6
309 | "1981-11-04",13.7
310 | "1981-11-05",10.4
311 | "1981-11-06",11.5
312 | "1981-11-07",7.6
313 | "1981-11-08",9.6
314 | "1981-11-09",14.2
315 | "1981-11-10",15.7
316 | "1981-11-11",10.5
317 | "1981-11-12",10.5
318 | "1981-11-13",9.7
319 | "1981-11-14",9.5
320 | "1981-11-15",11.3
321 | "1981-11-16",8.9
322 | "1981-11-17",9.4
323 | "1981-11-18",11.9
324 | "1981-11-19",11.7
325 | "1981-11-20",13.4
326 | "1981-11-21",12.6
327 | "1981-11-22",10.1
328 | "1981-11-23",15.8
329 | "1981-11-24",13.6
330 | "1981-11-25",11.9
331 | "1981-11-26",9.9
332 | "1981-11-27",12.6
333 | "1981-11-28",17.8
334 | "1981-11-29",15.0
335 | "1981-11-30",13.6
336 | "1981-12-01",13.4
337 | "1981-12-02",10.5
338 | "1981-12-03",14.2
339 | "1981-12-04",11.5
340 | "1981-12-05",13.0
341 | "1981-12-06",15.0
342 | "1981-12-07",14.7
343 | "1981-12-08",12.6
344 | "1981-12-09",12.5
345 | "1981-12-10",13.5
346 | "1981-12-11",14.8
347 | "1981-12-12",17.2
348 | "1981-12-13",9.7
349 | "1981-12-14",12.1
350 | "1981-12-15",12.8
351 | "1981-12-16",11.2
352 | "1981-12-17",16.4
353 | "1981-12-18",15.6
354 | "1981-12-19",13.3
355 | "1981-12-20",11.0
356 | "1981-12-21",11.1
357 | "1981-12-22",15.0
358 | "1981-12-23",12.8
359 | "1981-12-24",15.0
360 | "1981-12-25",14.2
361 | "1981-12-26",14.0
362 | "1981-12-27",15.5
363 | "1981-12-28",13.3
364 | "1981-12-29",15.6
365 | "1981-12-30",15.2
366 | "1981-12-31",17.4
367 | "1982-01-01",17.0
368 | "1982-01-02",15.0
369 | "1982-01-03",13.5
370 | "1982-01-04",15.2
371 | "1982-01-05",13.0
372 | "1982-01-06",12.5
373 | "1982-01-07",14.1
374 | "1982-01-08",14.8
375 | "1982-01-09",16.2
376 | "1982-01-10",15.8
377 | "1982-01-11",19.1
378 | "1982-01-12",22.2
379 | "1982-01-13",15.9
380 | "1982-01-14",13.0
381 | "1982-01-15",14.1
382 | "1982-01-16",15.8
383 | "1982-01-17",24.0
384 | "1982-01-18",18.0
385 | "1982-01-19",19.7
386 | "1982-01-20",25.2
387 | "1982-01-21",20.5
388 | "1982-01-22",19.3
389 | "1982-01-23",15.8
390 | "1982-01-24",17.0
391 | "1982-01-25",18.4
392 | "1982-01-26",13.3
393 | "1982-01-27",14.6
394 | "1982-01-28",12.5
395 | "1982-01-29",17.0
396 | "1982-01-30",17.1
397 | "1982-01-31",14.0
398 | "1982-02-01",14.6
399 | "1982-02-02",13.3
400 | "1982-02-03",14.8
401 | "1982-02-04",15.1
402 | "1982-02-05",13.1
403 | "1982-02-06",13.6
404 | "1982-02-07",19.5
405 | "1982-02-08",22.7
406 | "1982-02-09",17.2
407 | "1982-02-10",13.5
408 | "1982-02-11",15.4
409 | "1982-02-12",17.0
410 | "1982-02-13",19.2
411 | "1982-02-14",22.8
412 | "1982-02-15",26.3
413 | "1982-02-16",18.2
414 | "1982-02-17",17.0
415 | "1982-02-18",14.8
416 | "1982-02-19",12.8
417 | "1982-02-20",15.5
418 | "1982-02-21",15.6
419 | "1982-02-22",13.1
420 | "1982-02-23",15.2
421 | "1982-02-24",14.1
422 | "1982-02-25",12.5
423 | "1982-02-26",14.6
424 | "1982-02-27",10.4
425 | "1982-02-28",13.9
426 | "1982-03-01",11.9
427 | "1982-03-02",13.5
428 | "1982-03-03",9.8
429 | "1982-03-04",14.0
430 | "1982-03-05",21.5
431 | "1982-03-06",19.5
432 | "1982-03-07",16.7
433 | "1982-03-08",19.1
434 | "1982-03-09",11.0
435 | "1982-03-10",9.0
436 | "1982-03-11",10.0
437 | "1982-03-12",14.6
438 | "1982-03-13",12.5
439 | "1982-03-14",17.2
440 | "1982-03-15",19.2
441 | "1982-03-16",22.2
442 | "1982-03-17",15.7
443 | "1982-03-18",14.2
444 | "1982-03-19",9.8
445 | "1982-03-20",14.0
446 | "1982-03-21",17.5
447 | "1982-03-22",20.7
448 | "1982-03-23",15.6
449 | "1982-03-24",13.2
450 | "1982-03-25",14.5
451 | "1982-03-26",16.8
452 | "1982-03-27",17.2
453 | "1982-03-28",13.4
454 | "1982-03-29",14.2
455 | "1982-03-30",14.3
456 | "1982-03-31",10.2
457 | "1982-04-01",10.4
458 | "1982-04-02",12.3
459 | "1982-04-03",11.9
460 | "1982-04-04",11.2
461 | "1982-04-05",8.5
462 | "1982-04-06",12.0
463 | "1982-04-07",12.4
464 | "1982-04-08",12.9
465 | "1982-04-09",10.1
466 | "1982-04-10",15.0
467 | "1982-04-11",13.6
468 | "1982-04-12",12.4
469 | "1982-04-13",13.6
470 | "1982-04-14",16.1
471 | "1982-04-15",19.5
472 | "1982-04-16",14.2
473 | "1982-04-17",9.3
474 | "1982-04-18",10.1
475 | "1982-04-19",7.4
476 | "1982-04-20",8.6
477 | "1982-04-21",7.8
478 | "1982-04-22",9.1
479 | "1982-04-23",13.0
480 | "1982-04-24",16.5
481 | "1982-04-25",12.9
482 | "1982-04-26",6.9
483 | "1982-04-27",6.9
484 | "1982-04-28",8.7
485 | "1982-04-29",10.0
486 | "1982-04-30",10.8
487 | "1982-05-01",7.5
488 | "1982-05-02",6.3
489 | "1982-05-03",11.9
490 | "1982-05-04",13.8
491 | "1982-05-05",11.8
492 | "1982-05-06",11.0
493 | "1982-05-07",10.1
494 | "1982-05-08",8.5
495 | "1982-05-09",5.5
496 | "1982-05-10",7.6
497 | "1982-05-11",8.7
498 | "1982-05-12",10.8
499 | "1982-05-13",11.2
500 | "1982-05-14",9.1
501 | "1982-05-15",3.7
502 | "1982-05-16",4.6
503 | "1982-05-17",6.6
504 | "1982-05-18",13.2
505 | "1982-05-19",15.2
506 | "1982-05-20",7.6
507 | "1982-05-21",8.4
508 | "1982-05-22",6.0
509 | "1982-05-23",8.3
510 | "1982-05-24",8.6
511 | "1982-05-25",11.1
512 | "1982-05-26",12.1
513 | "1982-05-27",12.9
514 | "1982-05-28",14.0
515 | "1982-05-29",12.5
516 | "1982-05-30",11.5
517 | "1982-05-31",7.0
518 | "1982-06-01",7.1
519 | "1982-06-02",9.0
520 | "1982-06-03",3.1
521 | "1982-06-04",2.5
522 | "1982-06-05",0.0
523 | "1982-06-06",1.6
524 | "1982-06-07",2.6
525 | "1982-06-08",5.7
526 | "1982-06-09",2.3
527 | "1982-06-10",4.5
528 | "1982-06-11",8.2
529 | "1982-06-12",6.9
530 | "1982-06-13",7.3
531 | "1982-06-14",6.0
532 | "1982-06-15",7.3
533 | "1982-06-16",7.6
534 | "1982-06-17",8.0
535 | "1982-06-18",8.0
536 | "1982-06-19",6.8
537 | "1982-06-20",7.3
538 | "1982-06-21",6.2
539 | "1982-06-22",6.9
540 | "1982-06-23",8.9
541 | "1982-06-24",4.0
542 | "1982-06-25",1.3
543 | "1982-06-26",0.8
544 | "1982-06-27",4.3
545 | "1982-06-28",7.3
546 | "1982-06-29",7.7
547 | "1982-06-30",9.0
548 | "1982-07-01",4.2
549 | "1982-07-02",1.6
550 | "1982-07-03",2.6
551 | "1982-07-04",3.4
552 | "1982-07-05",3.9
553 | "1982-07-06",7.0
554 | "1982-07-07",7.8
555 | "1982-07-08",5.3
556 | "1982-07-09",2.4
557 | "1982-07-10",2.8
558 | "1982-07-11",4.0
559 | "1982-07-12",7.5
560 | "1982-07-13",7.8
561 | "1982-07-14",5.6
562 | "1982-07-15",3.3
563 | "1982-07-16",5.0
564 | "1982-07-17",3.7
565 | "1982-07-18",3.9
566 | "1982-07-19",5.2
567 | "1982-07-20",0.2
568 | "1982-07-21",0.8
569 | "1982-07-22",0.9
570 | "1982-07-23",3.5
571 | "1982-07-24",6.6
572 | "1982-07-25",9.5
573 | "1982-07-26",9.0
574 | "1982-07-27",3.5
575 | "1982-07-28",4.5
576 | "1982-07-29",5.7
577 | "1982-07-30",5.6
578 | "1982-07-31",7.1
579 | "1982-08-01",9.7
580 | "1982-08-02",8.3
581 | "1982-08-03",9.1
582 | "1982-08-04",2.8
583 | "1982-08-05",2.2
584 | "1982-08-06",4.5
585 | "1982-08-07",3.8
586 | "1982-08-08",3.8
587 | "1982-08-09",6.2
588 | "1982-08-10",11.5
589 | "1982-08-11",10.2
590 | "1982-08-12",7.9
591 | "1982-08-13",9.0
592 | "1982-08-14",9.5
593 | "1982-08-15",6.0
594 | "1982-08-16",8.2
595 | "1982-08-17",9.2
596 | "1982-08-18",4.3
597 | "1982-08-19",6.6
598 | "1982-08-20",9.4
599 | "1982-08-21",13.2
600 | "1982-08-22",6.6
601 | "1982-08-23",5.1
602 | "1982-08-24",12.1
603 | "1982-08-25",11.2
604 | "1982-08-26",8.5
605 | "1982-08-27",4.6
606 | "1982-08-28",7.0
607 | "1982-08-29",14.2
608 | "1982-08-30",12.7
609 | "1982-08-31",7.6
610 | "1982-09-01",4.0
611 | "1982-09-02",10.0
612 | "1982-09-03",10.5
613 | "1982-09-04",5.0
614 | "1982-09-05",4.5
615 | "1982-09-06",8.2
616 | "1982-09-07",4.3
617 | "1982-09-08",9.8
618 | "1982-09-09",5.8
619 | "1982-09-10",5.0
620 | "1982-09-11",8.5
621 | "1982-09-12",9.0
622 | "1982-09-13",3.6
623 | "1982-09-14",6.7
624 | "1982-09-15",6.7
625 | "1982-09-16",10.1
626 | "1982-09-17",15.0
627 | "1982-09-18",8.9
628 | "1982-09-19",5.7
629 | "1982-09-20",4.2
630 | "1982-09-21",4.0
631 | "1982-09-22",5.3
632 | "1982-09-23",6.3
633 | "1982-09-24",8.5
634 | "1982-09-25",11.5
635 | "1982-09-26",7.7
636 | "1982-09-27",9.2
637 | "1982-09-28",7.8
638 | "1982-09-29",6.3
639 | "1982-09-30",6.3
640 | "1982-10-01",8.6
641 | "1982-10-02",6.1
642 | "1982-10-03",13.2
643 | "1982-10-04",9.9
644 | "1982-10-05",4.7
645 | "1982-10-06",5.8
646 | "1982-10-07",14.9
647 | "1982-10-08",10.7
648 | "1982-10-09",8.6
649 | "1982-10-10",9.4
650 | "1982-10-11",5.7
651 | "1982-10-12",10.9
652 | "1982-10-13",13.1
653 | "1982-10-14",10.4
654 | "1982-10-15",8.2
655 | "1982-10-16",9.8
656 | "1982-10-17",7.5
657 | "1982-10-18",5.8
658 | "1982-10-19",9.8
659 | "1982-10-20",7.9
660 | "1982-10-21",8.7
661 | "1982-10-22",10.0
662 | "1982-10-23",10.6
663 | "1982-10-24",8.0
664 | "1982-10-25",10.2
665 | "1982-10-26",15.1
666 | "1982-10-27",13.9
667 | "1982-10-28",9.2
668 | "1982-10-29",9.0
669 | "1982-10-30",13.2
670 | "1982-10-31",7.0
671 | "1982-11-01",10.6
672 | "1982-11-02",6.9
673 | "1982-11-03",9.5
674 | "1982-11-04",12.5
675 | "1982-11-05",13.6
676 | "1982-11-06",17.7
677 | "1982-11-07",16.0
678 | "1982-11-08",11.3
679 | "1982-11-09",10.5
680 | "1982-11-10",14.4
681 | "1982-11-11",10.3
682 | "1982-11-12",9.0
683 | "1982-11-13",11.1
684 | "1982-11-14",14.5
685 | "1982-11-15",18.0
686 | "1982-11-16",12.8
687 | "1982-11-17",10.7
688 | "1982-11-18",9.1
689 | "1982-11-19",8.7
690 | "1982-11-20",12.4
691 | "1982-11-21",12.6
692 | "1982-11-22",10.3
693 | "1982-11-23",13.7
694 | "1982-11-24",16.0
695 | "1982-11-25",15.8
696 | "1982-11-26",12.1
697 | "1982-11-27",12.5
698 | "1982-11-28",12.2
699 | "1982-11-29",13.7
700 | "1982-11-30",16.1
701 | "1982-12-01",15.5
702 | "1982-12-02",10.3
703 | "1982-12-03",10.5
704 | "1982-12-04",11.0
705 | "1982-12-05",11.9
706 | "1982-12-06",13.0
707 | "1982-12-07",12.2
708 | "1982-12-08",10.6
709 | "1982-12-09",13.0
710 | "1982-12-10",13.0
711 | "1982-12-11",12.2
712 | "1982-12-12",12.6
713 | "1982-12-13",18.7
714 | "1982-12-14",15.2
715 | "1982-12-15",15.3
716 | "1982-12-16",13.9
717 | "1982-12-17",15.8
718 | "1982-12-18",13.0
719 | "1982-12-19",13.0
720 | "1982-12-20",13.7
721 | "1982-12-21",12.0
722 | "1982-12-22",10.8
723 | "1982-12-23",15.6
724 | "1982-12-24",15.3
725 | "1982-12-25",13.9
726 | "1982-12-26",13.0
727 | "1982-12-27",15.3
728 | "1982-12-28",16.3
729 | "1982-12-29",15.8
730 | "1982-12-30",17.7
731 | "1982-12-31",16.3
732 | "1983-01-01",18.4
733 | "1983-01-02",15.0
734 | "1983-01-03",10.9
735 | "1983-01-04",11.4
736 | "1983-01-05",14.8
737 | "1983-01-06",12.1
738 | "1983-01-07",12.8
739 | "1983-01-08",16.2
740 | "1983-01-09",15.5
741 | "1983-01-10",13.0
742 | "1983-01-11",10.5
743 | "1983-01-12",9.1
744 | "1983-01-13",10.5
745 | "1983-01-14",11.8
746 | "1983-01-15",12.7
747 | "1983-01-16",12.7
748 | "1983-01-17",11.5
749 | "1983-01-18",13.8
750 | "1983-01-19",13.3
751 | "1983-01-20",11.6
752 | "1983-01-21",15.4
753 | "1983-01-22",12.4
754 | "1983-01-23",16.9
755 | "1983-01-24",14.7
756 | "1983-01-25",10.6
757 | "1983-01-26",15.6
758 | "1983-01-27",10.7
759 | "1983-01-28",12.6
760 | "1983-01-29",13.8
761 | "1983-01-30",14.3
762 | "1983-01-31",14.0
763 | "1983-02-01",18.1
764 | "1983-02-02",17.3
765 | "1983-02-03",13.0
766 | "1983-02-04",16.0
767 | "1983-02-05",14.9
768 | "1983-02-06",16.2
769 | "1983-02-07",20.3
770 | "1983-02-08",22.5
771 | "1983-02-09",17.2
772 | "1983-02-10",15.9
773 | "1983-02-11",16.8
774 | "1983-02-12",13.8
775 | "1983-02-13",12.8
776 | "1983-02-14",14.0
777 | "1983-02-15",17.5
778 | "1983-02-16",21.5
779 | "1983-02-17",16.8
780 | "1983-02-18",13.6
781 | "1983-02-19",14.5
782 | "1983-02-20",14.2
783 | "1983-02-21",15.7
784 | "1983-02-22",19.7
785 | "1983-02-23",17.4
786 | "1983-02-24",14.4
787 | "1983-02-25",16.9
788 | "1983-02-26",19.1
789 | "1983-02-27",20.4
790 | "1983-02-28",20.1
791 | "1983-03-01",19.9
792 | "1983-03-02",22.0
793 | "1983-03-03",20.5
794 | "1983-03-04",22.1
795 | "1983-03-05",20.6
796 | "1983-03-06",15.0
797 | "1983-03-07",20.6
798 | "1983-03-08",21.5
799 | "1983-03-09",16.2
800 | "1983-03-10",14.1
801 | "1983-03-11",14.5
802 | "1983-03-12",21.1
803 | "1983-03-13",15.9
804 | "1983-03-14",15.2
805 | "1983-03-15",13.1
806 | "1983-03-16",13.2
807 | "1983-03-17",12.5
808 | "1983-03-18",15.2
809 | "1983-03-19",17.6
810 | "1983-03-20",15.5
811 | "1983-03-21",16.7
812 | "1983-03-22",16.3
813 | "1983-03-23",15.1
814 | "1983-03-24",12.7
815 | "1983-03-25",10.0
816 | "1983-03-26",11.4
817 | "1983-03-27",12.6
818 | "1983-03-28",10.7
819 | "1983-03-29",10.0
820 | "1983-03-30",13.9
821 | "1983-03-31",13.4
822 | "1983-04-01",12.5
823 | "1983-04-02",12.8
824 | "1983-04-03",7.8
825 | "1983-04-04",11.1
826 | "1983-04-05",10.7
827 | "1983-04-06",7.1
828 | "1983-04-07",6.7
829 | "1983-04-08",5.7
830 | "1983-04-09",9.1
831 | "1983-04-10",15.2
832 | "1983-04-11",15.5
833 | "1983-04-12",11.1
834 | "1983-04-13",11.7
835 | "1983-04-14",11.5
836 | "1983-04-15",9.8
837 | "1983-04-16",6.2
838 | "1983-04-17",6.7
839 | "1983-04-18",7.5
840 | "1983-04-19",8.8
841 | "1983-04-20",8.0
842 | "1983-04-21",10.4
843 | "1983-04-22",14.5
844 | "1983-04-23",16.5
845 | "1983-04-24",14.1
846 | "1983-04-25",10.5
847 | "1983-04-26",12.6
848 | "1983-04-27",13.0
849 | "1983-04-28",8.7
850 | "1983-04-29",10.1
851 | "1983-04-30",12.0
852 | "1983-05-01",12.5
853 | "1983-05-02",13.5
854 | "1983-05-03",13.7
855 | "1983-05-04",13.5
856 | "1983-05-05",10.7
857 | "1983-05-06",13.0
858 | "1983-05-07",11.6
859 | "1983-05-08",13.0
860 | "1983-05-09",11.2
861 | "1983-05-10",13.5
862 | "1983-05-11",12.9
863 | "1983-05-12",6.8
864 | "1983-05-13",10.0
865 | "1983-05-14",14.5
866 | "1983-05-15",11.7
867 | "1983-05-16",6.7
868 | "1983-05-17",4.6
869 | "1983-05-18",4.9
870 | "1983-05-19",7.4
871 | "1983-05-20",8.3
872 | "1983-05-21",7.5
873 | "1983-05-22",6.2
874 | "1983-05-23",7.8
875 | "1983-05-24",13.2
876 | "1983-05-25",11.9
877 | "1983-05-26",6.5
878 | "1983-05-27",8.3
879 | "1983-05-28",12.1
880 | "1983-05-29",9.3
881 | "1983-05-30",7.5
882 | "1983-05-31",9.3
883 | "1983-06-01",11.0
884 | "1983-06-02",10.8
885 | "1983-06-03",5.3
886 | "1983-06-04",7.6
887 | "1983-06-05",5.6
888 | "1983-06-06",7.2
889 | "1983-06-07",9.6
890 | "1983-06-08",7.0
891 | "1983-06-09",8.3
892 | "1983-06-10",7.8
893 | "1983-06-11",4.7
894 | "1983-06-12",6.8
895 | "1983-06-13",7.2
896 | "1983-06-14",8.3
897 | "1983-06-15",9.5
898 | "1983-06-16",4.7
899 | "1983-06-17",3.0
900 | "1983-06-18",1.5
901 | "1983-06-19",2.5
902 | "1983-06-20",6.2
903 | "1983-06-21",11.6
904 | "1983-06-22",6.6
905 | "1983-06-23",6.6
906 | "1983-06-24",8.0
907 | "1983-06-25",7.9
908 | "1983-06-26",3.3
909 | "1983-06-27",3.9
910 | "1983-06-28",6.0
911 | "1983-06-29",4.0
912 | "1983-06-30",5.5
913 | "1983-07-01",8.5
914 | "1983-07-02",9.8
915 | "1983-07-03",9.5
916 | "1983-07-04",7.2
917 | "1983-07-05",8.1
918 | "1983-07-06",8.0
919 | "1983-07-07",8.5
920 | "1983-07-08",8.8
921 | "1983-07-09",8.3
922 | "1983-07-10",2.4
923 | "1983-07-11",4.9
924 | "1983-07-12",5.9
925 | "1983-07-13",6.7
926 | "1983-07-14",8.4
927 | "1983-07-15",6.5
928 | "1983-07-16",7.9
929 | "1983-07-17",4.1
930 | "1983-07-18",5.4
931 | "1983-07-19",7.5
932 | "1983-07-20",3.9
933 | "1983-07-21",2.5
934 | "1983-07-22",5.3
935 | "1983-07-23",6.6
936 | "1983-07-24",0.0
937 | "1983-07-25",0.7
938 | "1983-07-26",7.6
939 | "1983-07-27",12.3
940 | "1983-07-28",9.2
941 | "1983-07-29",9.6
942 | "1983-07-30",9.5
943 | "1983-07-31",10.0
944 | "1983-08-01",7.7
945 | "1983-08-02",8.0
946 | "1983-08-03",8.3
947 | "1983-08-04",8.3
948 | "1983-08-05",4.5
949 | "1983-08-06",6.5
950 | "1983-08-07",9.4
951 | "1983-08-08",9.4
952 | "1983-08-09",10.5
953 | "1983-08-10",10.7
954 | "1983-08-11",9.9
955 | "1983-08-12",7.6
956 | "1983-08-13",5.8
957 | "1983-08-14",8.5
958 | "1983-08-15",13.8
959 | "1983-08-16",14.3
960 | "1983-08-17",8.3
961 | "1983-08-18",5.3
962 | "1983-08-19",3.0
963 | "1983-08-20",5.2
964 | "1983-08-21",10.3
965 | "1983-08-22",11.1
966 | "1983-08-23",10.5
967 | "1983-08-24",9.0
968 | "1983-08-25",13.0
969 | "1983-08-26",6.4
970 | "1983-08-27",8.4
971 | "1983-08-28",6.7
972 | "1983-08-29",8.3
973 | "1983-08-30",11.2
974 | "1983-08-31",10.0
975 | "1983-09-01",10.1
976 | "1983-09-02",10.6
977 | "1983-09-03",10.9
978 | "1983-09-04",5.7
979 | "1983-09-05",9.5
980 | "1983-09-06",10.4
981 | "1983-09-07",11.1
982 | "1983-09-08",12.2
983 | "1983-09-09",10.6
984 | "1983-09-10",8.8
985 | "1983-09-11",9.2
986 | "1983-09-12",5.5
987 | "1983-09-13",7.1
988 | "1983-09-14",6.5
989 | "1983-09-15",4.3
990 | "1983-09-16",5.0
991 | "1983-09-17",11.2
992 | "1983-09-18",7.5
993 | "1983-09-19",12.0
994 | "1983-09-20",13.6
995 | "1983-09-21",8.3
996 | "1983-09-22",8.5
997 | "1983-09-23",12.9
998 | "1983-09-24",7.7
999 | "1983-09-25",7.6
1000 | "1983-09-26",3.5
1001 | "1983-09-27",10.4
1002 | "1983-09-28",15.4
1003 | "1983-09-29",10.6
1004 | "1983-09-30",9.6
1005 | "1983-10-01",9.3
1006 | "1983-10-02",13.9
1007 | "1983-10-03",7.7
1008 | "1983-10-04",9.5
1009 | "1983-10-05",7.6
1010 | "1983-10-06",6.9
1011 | "1983-10-07",6.8
1012 | "1983-10-08",5.8
1013 | "1983-10-09",6.0
1014 | "1983-10-10",8.3
1015 | "1983-10-11",9.1
1016 | "1983-10-12",12.5
1017 | "1983-10-13",13.2
1018 | "1983-10-14",16.2
1019 | "1983-10-15",12.5
1020 | "1983-10-16",11.8
1021 | "1983-10-17",10.6
1022 | "1983-10-18",10.0
1023 | "1983-10-19",12.2
1024 | "1983-10-20",8.9
1025 | "1983-10-21",10.3
1026 | "1983-10-22",7.5
1027 | "1983-10-23",11.6
1028 | "1983-10-24",12.6
1029 | "1983-10-25",12.9
1030 | "1983-10-26",11.7
1031 | "1983-10-27",14.0
1032 | "1983-10-28",12.3
1033 | "1983-10-29",9.0
1034 | "1983-10-30",9.2
1035 | "1983-10-31",9.8
1036 | "1983-11-01",11.8
1037 | "1983-11-02",10.6
1038 | "1983-11-03",12.6
1039 | "1983-11-04",11.0
1040 | "1983-11-05",8.2
1041 | "1983-11-06",7.5
1042 | "1983-11-07",13.6
1043 | "1983-11-08",14.8
1044 | "1983-11-09",10.9
1045 | "1983-11-10",7.7
1046 | "1983-11-11",10.2
1047 | "1983-11-12",10.8
1048 | "1983-11-13",10.8
1049 | "1983-11-14",12.5
1050 | "1983-11-15",13.2
1051 | "1983-11-16",8.7
1052 | "1983-11-17",5.7
1053 | "1983-11-18",9.8
1054 | "1983-11-19",7.3
1055 | "1983-11-20",10.8
1056 | "1983-11-21",10.0
1057 | "1983-11-22",16.2
1058 | "1983-11-23",15.0
1059 | "1983-11-24",14.5
1060 | "1983-11-25",15.9
1061 | "1983-11-26",14.9
1062 | "1983-11-27",14.2
1063 | "1983-11-28",15.8
1064 | "1983-11-29",17.2
1065 | "1983-11-30",17.6
1066 | "1983-12-01",12.1
1067 | "1983-12-02",11.4
1068 | "1983-12-03",13.0
1069 | "1983-12-04",13.2
1070 | "1983-12-05",12.0
1071 | "1983-12-06",15.3
1072 | "1983-12-07",12.7
1073 | "1983-12-08",12.1
1074 | "1983-12-09",13.8
1075 | "1983-12-10",10.9
1076 | "1983-12-11",12.0
1077 | "1983-12-12",16.5
1078 | "1983-12-13",15.0
1079 | "1983-12-14",11.2
1080 | "1983-12-15",13.9
1081 | "1983-12-16",15.0
1082 | "1983-12-17",14.8
1083 | "1983-12-18",15.0
1084 | "1983-12-19",13.3
1085 | "1983-12-20",20.4
1086 | "1983-12-21",18.0
1087 | "1983-12-22",12.2
1088 | "1983-12-23",16.7
1089 | "1983-12-24",13.8
1090 | "1983-12-25",17.5
1091 | "1983-12-26",15.0
1092 | "1983-12-27",13.9
1093 | "1983-12-28",11.1
1094 | "1983-12-29",16.1
1095 | "1983-12-30",20.4
1096 | "1983-12-31",18.0
1097 | "1984-01-01",19.5
1098 | "1984-01-02",17.1
1099 | "1984-01-03",17.1
1100 | "1984-01-04",12.0
1101 | "1984-01-05",11.0
1102 | "1984-01-06",16.3
1103 | "1984-01-07",16.1
1104 | "1984-01-08",13.0
1105 | "1984-01-09",13.4
1106 | "1984-01-10",15.2
1107 | "1984-01-11",12.5
1108 | "1984-01-12",14.3
1109 | "1984-01-13",16.5
1110 | "1984-01-14",18.6
1111 | "1984-01-15",18.0
1112 | "1984-01-16",18.2
1113 | "1984-01-17",11.4
1114 | "1984-01-18",11.9
1115 | "1984-01-19",12.2
1116 | "1984-01-20",14.8
1117 | "1984-01-21",13.1
1118 | "1984-01-22",12.7
1119 | "1984-01-23",10.5
1120 | "1984-01-24",13.8
1121 | "1984-01-25",18.8
1122 | "1984-01-26",13.9
1123 | "1984-01-27",11.2
1124 | "1984-01-28",10.6
1125 | "1984-01-29",14.7
1126 | "1984-01-30",13.1
1127 | "1984-01-31",12.1
1128 | "1984-02-01",14.7
1129 | "1984-02-02",11.1
1130 | "1984-02-03",13.0
1131 | "1984-02-04",15.6
1132 | "1984-02-05",14.2
1133 | "1984-02-06",15.5
1134 | "1984-02-07",18.0
1135 | "1984-02-08",15.0
1136 | "1984-02-09",15.9
1137 | "1984-02-10",15.5
1138 | "1984-02-11",15.8
1139 | "1984-02-12",16.6
1140 | "1984-02-13",13.6
1141 | "1984-02-14",13.8
1142 | "1984-02-15",14.6
1143 | "1984-02-16",15.6
1144 | "1984-02-17",16.6
1145 | "1984-02-18",14.3
1146 | "1984-02-19",16.3
1147 | "1984-02-20",18.9
1148 | "1984-02-21",18.7
1149 | "1984-02-22",14.5
1150 | "1984-02-23",16.5
1151 | "1984-02-24",14.1
1152 | "1984-02-25",13.5
1153 | "1984-02-26",11.7
1154 | "1984-02-27",15.1
1155 | "1984-02-28",11.2
1156 | "1984-02-29",13.5
1157 | "1984-03-01",12.6
1158 | "1984-03-02",8.8
1159 | "1984-03-03",10.5
1160 | "1984-03-04",12.1
1161 | "1984-03-05",14.5
1162 | "1984-03-06",19.5
1163 | "1984-03-07",14.0
1164 | "1984-03-08",13.8
1165 | "1984-03-09",10.5
1166 | "1984-03-10",13.8
1167 | "1984-03-11",11.4
1168 | "1984-03-12",15.6
1169 | "1984-03-13",11.1
1170 | "1984-03-14",12.1
1171 | "1984-03-15",14.2
1172 | "1984-03-16",10.9
1173 | "1984-03-17",14.2
1174 | "1984-03-18",13.8
1175 | "1984-03-19",15.1
1176 | "1984-03-20",14.0
1177 | "1984-03-21",12.1
1178 | "1984-03-22",13.8
1179 | "1984-03-23",16.6
1180 | "1984-03-24",17.8
1181 | "1984-03-25",9.4
1182 | "1984-03-26",10.2
1183 | "1984-03-27",7.4
1184 | "1984-03-28",8.7
1185 | "1984-03-29",14.0
1186 | "1984-03-30",15.3
1187 | "1984-03-31",11.1
1188 | "1984-04-01",9.7
1189 | "1984-04-02",10.3
1190 | "1984-04-03",9.2
1191 | "1984-04-04",8.2
1192 | "1984-04-05",9.7
1193 | "1984-04-06",12.4
1194 | "1984-04-07",12.5
1195 | "1984-04-08",9.0
1196 | "1984-04-09",9.7
1197 | "1984-04-10",10.1
1198 | "1984-04-11",11.2
1199 | "1984-04-12",12.0
1200 | "1984-04-13",11.1
1201 | "1984-04-14",10.8
1202 | "1984-04-15",12.8
1203 | "1984-04-16",9.8
1204 | "1984-04-17",13.7
1205 | "1984-04-18",11.0
1206 | "1984-04-19",13.2
1207 | "1984-04-20",13.0
1208 | "1984-04-21",10.2
1209 | "1984-04-22",13.2
1210 | "1984-04-23",9.3
1211 | "1984-04-24",11.1
1212 | "1984-04-25",10.3
1213 | "1984-04-26",8.7
1214 | "1984-04-27",11.7
1215 | "1984-04-28",12.5
1216 | "1984-04-29",6.5
1217 | "1984-04-30",9.6
1218 | "1984-05-01",13.8
1219 | "1984-05-02",14.7
1220 | "1984-05-03",9.1
1221 | "1984-05-04",4.8
1222 | "1984-05-05",3.3
1223 | "1984-05-06",3.5
1224 | "1984-05-07",5.7
1225 | "1984-05-08",5.5
1226 | "1984-05-09",7.0
1227 | "1984-05-10",9.5
1228 | "1984-05-11",9.9
1229 | "1984-05-12",4.9
1230 | "1984-05-13",6.3
1231 | "1984-05-14",4.8
1232 | "1984-05-15",6.2
1233 | "1984-05-16",7.1
1234 | "1984-05-17",7.5
1235 | "1984-05-18",9.4
1236 | "1984-05-19",8.7
1237 | "1984-05-20",9.5
1238 | "1984-05-21",12.1
1239 | "1984-05-22",9.5
1240 | "1984-05-23",9.3
1241 | "1984-05-24",8.5
1242 | "1984-05-25",8.0
1243 | "1984-05-26",9.8
1244 | "1984-05-27",6.2
1245 | "1984-05-28",7.3
1246 | "1984-05-29",10.9
1247 | "1984-05-30",10.0
1248 | "1984-05-31",8.7
1249 | "1984-06-01",9.0
1250 | "1984-06-02",10.8
1251 | "1984-06-03",12.4
1252 | "1984-06-04",7.2
1253 | "1984-06-05",7.2
1254 | "1984-06-06",11.1
1255 | "1984-06-07",9.3
1256 | "1984-06-08",10.1
1257 | "1984-06-09",3.9
1258 | "1984-06-10",5.0
1259 | "1984-06-11",8.2
1260 | "1984-06-12",2.8
1261 | "1984-06-13",4.3
1262 | "1984-06-14",8.1
1263 | "1984-06-15",11.1
1264 | "1984-06-16",4.7
1265 | "1984-06-17",5.3
1266 | "1984-06-18",10.0
1267 | "1984-06-19",5.6
1268 | "1984-06-20",2.2
1269 | "1984-06-21",7.1
1270 | "1984-06-22",8.3
1271 | "1984-06-23",8.6
1272 | "1984-06-24",10.1
1273 | "1984-06-25",8.3
1274 | "1984-06-26",7.2
1275 | "1984-06-27",7.7
1276 | "1984-06-28",7.8
1277 | "1984-06-29",9.1
1278 | "1984-06-30",9.4
1279 | "1984-07-01",7.8
1280 | "1984-07-02",2.6
1281 | "1984-07-03",2.4
1282 | "1984-07-04",3.9
1283 | "1984-07-05",1.3
1284 | "1984-07-06",2.1
1285 | "1984-07-07",7.4
1286 | "1984-07-08",7.2
1287 | "1984-07-09",8.8
1288 | "1984-07-10",8.9
1289 | "1984-07-11",8.8
1290 | "1984-07-12",8.0
1291 | "1984-07-13",0.7
1292 | "1984-07-14",0.1
1293 | "1984-07-15",0.9
1294 | "1984-07-16",7.8
1295 | "1984-07-17",7.2
1296 | "1984-07-18",8.0
1297 | "1984-07-19",4.6
1298 | "1984-07-20",5.2
1299 | "1984-07-21",5.8
1300 | "1984-07-22",6.8
1301 | "1984-07-23",8.1
1302 | "1984-07-24",7.5
1303 | "1984-07-25",5.4
1304 | "1984-07-26",4.6
1305 | "1984-07-27",6.4
1306 | "1984-07-28",9.7
1307 | "1984-07-29",7.0
1308 | "1984-07-30",10.0
1309 | "1984-07-31",10.6
1310 | "1984-08-01",11.5
1311 | "1984-08-02",10.2
1312 | "1984-08-03",11.1
1313 | "1984-08-04",11.0
1314 | "1984-08-05",8.9
1315 | "1984-08-06",9.9
1316 | "1984-08-07",11.7
1317 | "1984-08-08",11.6
1318 | "1984-08-09",9.0
1319 | "1984-08-10",6.3
1320 | "1984-08-11",8.7
1321 | "1984-08-12",8.5
1322 | "1984-08-13",8.5
1323 | "1984-08-14",8.0
1324 | "1984-08-15",6.0
1325 | "1984-08-16",8.0
1326 | "1984-08-17",8.5
1327 | "1984-08-18",7.7
1328 | "1984-08-19",8.4
1329 | "1984-08-20",9.0
1330 | "1984-08-21",8.3
1331 | "1984-08-22",6.8
1332 | "1984-08-23",9.3
1333 | "1984-08-24",6.7
1334 | "1984-08-25",9.0
1335 | "1984-08-26",7.3
1336 | "1984-08-27",6.3
1337 | "1984-08-28",7.9
1338 | "1984-08-29",5.2
1339 | "1984-08-30",9.0
1340 | "1984-08-31",11.3
1341 | "1984-09-01",9.2
1342 | "1984-09-02",11.3
1343 | "1984-09-03",7.0
1344 | "1984-09-04",8.0
1345 | "1984-09-05",4.6
1346 | "1984-09-06",8.5
1347 | "1984-09-07",9.5
1348 | "1984-09-08",9.4
1349 | "1984-09-09",10.5
1350 | "1984-09-10",9.7
1351 | "1984-09-11",4.9
1352 | "1984-09-12",8.0
1353 | "1984-09-13",5.8
1354 | "1984-09-14",5.5
1355 | "1984-09-15",10.9
1356 | "1984-09-16",11.7
1357 | "1984-09-17",9.2
1358 | "1984-09-18",8.9
1359 | "1984-09-19",11.3
1360 | "1984-09-20",8.6
1361 | "1984-09-21",6.2
1362 | "1984-09-22",6.6
1363 | "1984-09-23",9.1
1364 | "1984-09-24",6.1
1365 | "1984-09-25",7.5
1366 | "1984-09-26",10.7
1367 | "1984-09-27",6.3
1368 | "1984-09-28",5.5
1369 | "1984-09-29",6.7
1370 | "1984-09-30",4.2
1371 | "1984-10-01",11.3
1372 | "1984-10-02",16.3
1373 | "1984-10-03",10.5
1374 | "1984-10-04",10.3
1375 | "1984-10-05",7.9
1376 | "1984-10-06",7.7
1377 | "1984-10-07",16.0
1378 | "1984-10-08",14.6
1379 | "1984-10-09",12.5
1380 | "1984-10-10",8.1
1381 | "1984-10-11",12.2
1382 | "1984-10-12",17.2
1383 | "1984-10-13",9.4
1384 | "1984-10-14",8.7
1385 | "1984-10-15",5.9
1386 | "1984-10-16",4.8
1387 | "1984-10-17",7.4
1388 | "1984-10-18",9.4
1389 | "1984-10-19",9.7
1390 | "1984-10-20",9.9
1391 | "1984-10-21",6.5
1392 | "1984-10-22",9.8
1393 | "1984-10-23",18.2
1394 | "1984-10-24",11.3
1395 | "1984-10-25",9.1
1396 | "1984-10-26",9.6
1397 | "1984-10-27",13.5
1398 | "1984-10-28",10.7
1399 | "1984-10-29",10.0
1400 | "1984-10-30",8.5
1401 | "1984-10-31",12.6
1402 | "1984-11-01",16.6
1403 | "1984-11-02",11.6
1404 | "1984-11-03",12.2
1405 | "1984-11-04",11.2
1406 | "1984-11-05",9.2
1407 | "1984-11-06",9.9
1408 | "1984-11-07",11.9
1409 | "1984-11-08",15.6
1410 | "1984-11-09",19.0
1411 | "1984-11-10",12.8
1412 | "1984-11-11",12.2
1413 | "1984-11-12",12.0
1414 | "1984-11-13",11.1
1415 | "1984-11-14",11.8
1416 | "1984-11-15",7.6
1417 | "1984-11-16",13.0
1418 | "1984-11-17",12.7
1419 | "1984-11-18",16.0
1420 | "1984-11-19",14.8
1421 | "1984-11-20",14.2
1422 | "1984-11-21",10.0
1423 | "1984-11-22",8.8
1424 | "1984-11-23",11.6
1425 | "1984-11-24",8.6
1426 | "1984-11-25",14.6
1427 | "1984-11-26",24.3
1428 | "1984-11-27",11.6
1429 | "1984-11-28",10.8
1430 | "1984-11-29",12.0
1431 | "1984-11-30",11.0
1432 | "1984-12-01",12.6
1433 | "1984-12-02",10.8
1434 | "1984-12-03",9.1
1435 | "1984-12-04",11.0
1436 | "1984-12-05",13.0
1437 | "1984-12-06",12.8
1438 | "1984-12-07",9.9
1439 | "1984-12-08",11.6
1440 | "1984-12-09",10.5
1441 | "1984-12-10",15.9
1442 | "1984-12-11",12.2
1443 | "1984-12-12",13.0
1444 | "1984-12-13",12.5
1445 | "1984-12-14",12.5
1446 | "1984-12-15",11.4
1447 | "1984-12-16",12.1
1448 | "1984-12-17",16.8
1449 | "1984-12-18",12.1
1450 | "1984-12-19",11.3
1451 | "1984-12-20",10.4
1452 | "1984-12-21",14.2
1453 | "1984-12-22",11.4
1454 | "1984-12-23",13.7
1455 | "1984-12-24",16.5
1456 | "1984-12-25",12.8
1457 | "1984-12-26",12.2
1458 | "1984-12-27",12.0
1459 | "1984-12-28",12.6
1460 | "1984-12-29",16.0
1461 | "1984-12-30",16.4
1462 | "1985-01-01",13.3
1463 | "1985-01-02",15.2
1464 | "1985-01-03",13.1
1465 | "1985-01-04",12.7
1466 | "1985-01-05",14.6
1467 | "1985-01-06",11.0
1468 | "1985-01-07",13.2
1469 | "1985-01-08",12.2
1470 | "1985-01-09",14.4
1471 | "1985-01-10",13.7
1472 | "1985-01-11",14.5
1473 | "1985-01-12",14.1
1474 | "1985-01-13",14.4
1475 | "1985-01-14",19.7
1476 | "1985-01-15",16.5
1477 | "1985-01-16",15.9
1478 | "1985-01-17",11.8
1479 | "1985-01-18",12.0
1480 | "1985-01-19",11.4
1481 | "1985-01-20",14.4
1482 | "1985-01-21",12.4
1483 | "1985-01-22",15.1
1484 | "1985-01-23",15.6
1485 | "1985-01-24",15.2
1486 | "1985-01-25",12.8
1487 | "1985-01-26",13.3
1488 | "1985-01-27",17.5
1489 | "1985-01-28",15.4
1490 | "1985-01-29",13.5
1491 | "1985-01-30",16.7
1492 | "1985-01-31",15.2
1493 | "1985-02-01",14.9
1494 | "1985-02-02",10.2
1495 | "1985-02-03",13.6
1496 | "1985-02-04",19.0
1497 | "1985-02-05",15.7
1498 | "1985-02-06",18.0
1499 | "1985-02-07",14.8
1500 | "1985-02-08",13.9
1501 | "1985-02-09",13.0
1502 | "1985-02-10",15.3
1503 | "1985-02-11",14.3
1504 | "1985-02-12",15.6
1505 | "1985-02-13",16.0
1506 | "1985-02-14",14.9
1507 | "1985-02-15",11.1
1508 | "1985-02-16",14.8
1509 | "1985-02-17",13.0
1510 | "1985-02-18",12.2
1511 | "1985-02-19",10.9
1512 | "1985-02-20",14.6
1513 | "1985-02-21",16.6
1514 | "1985-02-22",18.1
1515 | "1985-02-23",13.4
1516 | "1985-02-24",10.3
1517 | "1985-02-25",13.6
1518 | "1985-02-26",13.8
1519 | "1985-02-27",10.3
1520 | "1985-02-28",11.0
1521 | "1985-03-01",14.3
1522 | "1985-03-02",15.5
1523 | "1985-03-03",14.7
1524 | "1985-03-04",12.7
1525 | "1985-03-05",10.7
1526 | "1985-03-06",12.6
1527 | "1985-03-07",9.8
1528 | "1985-03-08",13.2
1529 | "1985-03-09",15.2
1530 | "1985-03-10",16.6
1531 | "1985-03-11",21.0
1532 | "1985-03-12",22.4
1533 | "1985-03-13",17.0
1534 | "1985-03-14",21.7
1535 | "1985-03-15",21.4
1536 | "1985-03-16",18.6
1537 | "1985-03-17",16.2
1538 | "1985-03-18",16.8
1539 | "1985-03-19",17.0
1540 | "1985-03-20",18.4
1541 | "1985-03-21",17.2
1542 | "1985-03-22",18.4
1543 | "1985-03-23",18.8
1544 | "1985-03-24",16.5
1545 | "1985-03-25",13.3
1546 | "1985-03-26",12.2
1547 | "1985-03-27",11.3
1548 | "1985-03-28",13.8
1549 | "1985-03-29",16.6
1550 | "1985-03-30",14.0
1551 | "1985-03-31",14.3
1552 | "1985-04-01",16.4
1553 | "1985-04-02",11.9
1554 | "1985-04-03",15.7
1555 | "1985-04-04",17.6
1556 | "1985-04-05",17.5
1557 | "1985-04-06",15.9
1558 | "1985-04-07",16.2
1559 | "1985-04-08",16.0
1560 | "1985-04-09",15.9
1561 | "1985-04-10",16.2
1562 | "1985-04-11",16.2
1563 | "1985-04-12",19.5
1564 | "1985-04-13",18.2
1565 | "1985-04-14",21.8
1566 | "1985-04-15",15.1
1567 | "1985-04-16",11.0
1568 | "1985-04-17",8.1
1569 | "1985-04-18",9.5
1570 | "1985-04-19",9.3
1571 | "1985-04-20",10.6
1572 | "1985-04-21",6.3
1573 | "1985-04-22",8.6
1574 | "1985-04-23",6.8
1575 | "1985-04-24",8.7
1576 | "1985-04-25",8.4
1577 | "1985-04-26",9.3
1578 | "1985-04-27",10.0
1579 | "1985-04-28",10.5
1580 | "1985-04-29",12.0
1581 | "1985-04-30",10.1
1582 | "1985-05-01",9.4
1583 | "1985-05-02",10.1
1584 | "1985-05-03",8.0
1585 | "1985-05-04",10.6
1586 | "1985-05-05",13.6
1587 | "1985-05-06",15.4
1588 | "1985-05-07",9.0
1589 | "1985-05-08",10.4
1590 | "1985-05-09",11.0
1591 | "1985-05-10",12.1
1592 | "1985-05-11",13.4
1593 | "1985-05-12",11.3
1594 | "1985-05-13",6.7
1595 | "1985-05-14",9.8
1596 | "1985-05-15",10.8
1597 | "1985-05-16",7.8
1598 | "1985-05-17",4.5
1599 | "1985-05-18",7.6
1600 | "1985-05-19",6.9
1601 | "1985-05-20",7.5
1602 | "1985-05-21",8.5
1603 | "1985-05-22",5.5
1604 | "1985-05-23",9.5
1605 | "1985-05-24",7.3
1606 | "1985-05-25",5.4
1607 | "1985-05-26",5.5
1608 | "1985-05-27",8.1
1609 | "1985-05-28",11.2
1610 | "1985-05-29",13.4
1611 | "1985-05-30",11.6
1612 | "1985-05-31",10.1
1613 | "1985-06-01",4.3
1614 | "1985-06-02",5.5
1615 | "1985-06-03",4.4
1616 | "1985-06-04",5.9
1617 | "1985-06-05",5.7
1618 | "1985-06-06",8.2
1619 | "1985-06-07",8.2
1620 | "1985-06-08",4.2
1621 | "1985-06-09",6.5
1622 | "1985-06-10",10.0
1623 | "1985-06-11",8.8
1624 | "1985-06-12",6.6
1625 | "1985-06-13",7.8
1626 | "1985-06-14",10.1
1627 | "1985-06-15",7.1
1628 | "1985-06-16",7.7
1629 | "1985-06-17",8.5
1630 | "1985-06-18",7.3
1631 | "1985-06-19",6.9
1632 | "1985-06-20",8.4
1633 | "1985-06-21",7.1
1634 | "1985-06-22",6.3
1635 | "1985-06-23",0.6
1636 | "1985-06-24",1.6
1637 | "1985-06-25",7.0
1638 | "1985-06-26",8.3
1639 | "1985-06-27",8.0
1640 | "1985-06-28",10.2
1641 | "1985-06-29",10.6
1642 | "1985-06-30",10.4
1643 | "1985-07-01",11.6
1644 | "1985-07-02",11.0
1645 | "1985-07-03",10.7
1646 | "1985-07-04",7.3
1647 | "1985-07-05",4.2
1648 | "1985-07-06",4.7
1649 | "1985-07-07",5.6
1650 | "1985-07-08",7.7
1651 | "1985-07-09",7.5
1652 | "1985-07-10",4.9
1653 | "1985-07-11",5.9
1654 | "1985-07-12",7.8
1655 | "1985-07-13",5.8
1656 | "1985-07-14",7.0
1657 | "1985-07-15",8.4
1658 | "1985-07-16",6.2
1659 | "1985-07-17",7.5
1660 | "1985-07-18",4.8
1661 | "1985-07-19",3.3
1662 | "1985-07-20",3.2
1663 | "1985-07-21",7.0
1664 | "1985-07-22",8.4
1665 | "1985-07-23",0.3
1666 | "1985-07-24",0.3
1667 | "1985-07-25",2.1
1668 | "1985-07-26",8.5
1669 | "1985-07-27",1.4
1670 | "1985-07-28",4.1
1671 | "1985-07-29",10.3
1672 | "1985-07-30",6.6
1673 | "1985-07-31",6.1
1674 | "1985-08-01",7.0
1675 | "1985-08-02",5.1
1676 | "1985-08-03",6.3
1677 | "1985-08-04",6.9
1678 | "1985-08-05",11.4
1679 | "1985-08-06",10.4
1680 | "1985-08-07",10.3
1681 | "1985-08-08",9.2
1682 | "1985-08-09",7.2
1683 | "1985-08-10",7.5
1684 | "1985-08-11",4.0
1685 | "1985-08-12",5.6
1686 | "1985-08-13",6.7
1687 | "1985-08-14",8.4
1688 | "1985-08-15",11.0
1689 | "1985-08-16",8.4
1690 | "1985-08-17",8.8
1691 | "1985-08-18",8.6
1692 | "1985-08-19",8.3
1693 | "1985-08-20",4.0
1694 | "1985-08-21",3.6
1695 | "1985-08-22",5.7
1696 | "1985-08-23",10.6
1697 | "1985-08-24",6.9
1698 | "1985-08-25",10.0
1699 | "1985-08-26",9.8
1700 | "1985-08-27",7.2
1701 | "1985-08-28",10.5
1702 | "1985-08-29",3.6
1703 | "1985-08-30",5.3
1704 | "1985-08-31",8.4
1705 | "1985-09-01",10.3
1706 | "1985-09-02",7.9
1707 | "1985-09-03",8.5
1708 | "1985-09-04",7.9
1709 | "1985-09-05",8.0
1710 | "1985-09-06",9.8
1711 | "1985-09-07",6.7
1712 | "1985-09-08",4.8
1713 | "1985-09-09",9.9
1714 | "1985-09-10",12.8
1715 | "1985-09-11",10.9
1716 | "1985-09-12",11.7
1717 | "1985-09-13",11.7
1718 | "1985-09-14",11.0
1719 | "1985-09-15",8.2
1720 | "1985-09-16",7.5
1721 | "1985-09-17",5.4
1722 | "1985-09-18",7.2
1723 | "1985-09-19",9.7
1724 | "1985-09-20",8.4
1725 | "1985-09-21",9.0
1726 | "1985-09-22",8.7
1727 | "1985-09-23",6.6
1728 | "1985-09-24",11.6
1729 | "1985-09-25",13.1
1730 | "1985-09-26",6.7
1731 | "1985-09-27",6.5
1732 | "1985-09-28",7.7
1733 | "1985-09-29",8.7
1734 | "1985-09-30",7.2
1735 | "1985-10-01",10.5
1736 | "1985-10-02",8.6
1737 | "1985-10-03",7.2
1738 | "1985-10-04",11.4
1739 | "1985-10-05",16.2
1740 | "1985-10-06",6.1
1741 | "1985-10-07",9.6
1742 | "1985-10-08",11.1
1743 | "1985-10-09",13.6
1744 | "1985-10-10",10.7
1745 | "1985-10-11",14.7
1746 | "1985-10-12",11.6
1747 | "1985-10-13",7.3
1748 | "1985-10-14",8.0
1749 | "1985-10-15",9.6
1750 | "1985-10-16",16.0
1751 | "1985-10-17",15.1
1752 | "1985-10-18",12.8
1753 | "1985-10-19",6.2
1754 | "1985-10-20",7.1
1755 | "1985-10-21",8.4
1756 | "1985-10-22",10.0
1757 | "1985-10-23",12.7
1758 | "1985-10-24",10.0
1759 | "1985-10-25",10.2
1760 | "1985-10-26",6.5
1761 | "1985-10-27",9.2
1762 | "1985-10-28",11.9
1763 | "1985-10-29",14.7
1764 | "1985-10-30",11.4
1765 | "1985-10-31",6.8
1766 | "1985-11-01",7.4
1767 | "1985-11-02",11.2
1768 | "1985-11-03",9.2
1769 | "1985-11-04",12.6
1770 | "1985-11-05",16.0
1771 | "1985-11-06",17.1
1772 | "1985-11-07",15.3
1773 | "1985-11-08",13.3
1774 | "1985-11-09",15.4
1775 | "1985-11-10",13.2
1776 | "1985-11-11",14.4
1777 | "1985-11-12",14.0
1778 | "1985-11-13",15.5
1779 | "1985-11-14",21.0
1780 | "1985-11-15",10.0
1781 | "1985-11-16",9.6
1782 | "1985-11-17",12.0
1783 | "1985-11-18",12.2
1784 | "1985-11-19",11.3
1785 | "1985-11-20",13.2
1786 | "1985-11-21",10.5
1787 | "1985-11-22",10.1
1788 | "1985-11-23",8.8
1789 | "1985-11-24",13.7
1790 | "1985-11-25",16.2
1791 | "1985-11-26",16.0
1792 | "1985-11-27",14.0
1793 | "1985-11-28",13.7
1794 | "1985-11-29",12.5
1795 | "1985-11-30",12.8
1796 | "1985-12-01",12.3
1797 | "1985-12-02",15.2
1798 | "1985-12-03",15.0
1799 | "1985-12-04",16.4
1800 | "1985-12-05",16.1
1801 | "1985-12-06",14.6
1802 | "1985-12-07",18.2
1803 | "1985-12-08",16.4
1804 | "1985-12-09",16.6
1805 | "1985-12-10",14.7
1806 | "1985-12-11",15.8
1807 | "1985-12-12",14.1
1808 | "1985-12-13",13.5
1809 | "1985-12-14",13.6
1810 | "1985-12-15",13.7
1811 | "1985-12-16",13.6
1812 | "1985-12-17",12.1
1813 | "1985-12-18",12.7
1814 | "1985-12-19",13.3
1815 | "1985-12-20",14.2
1816 | "1985-12-21",15.0
1817 | "1985-12-22",13.7
1818 | "1985-12-23",12.0
1819 | "1985-12-24",13.1
1820 | "1985-12-25",13.2
1821 | "1985-12-26",13.3
1822 | "1985-12-27",11.5
1823 | "1985-12-28",10.8
1824 | "1985-12-29",12.0
1825 | "1985-12-30",16.3
1826 | "1985-12-31",14.4
1827 | "1986-01-01",12.9
1828 | "1986-01-02",13.8
1829 | "1986-01-03",10.6
1830 | "1986-01-04",12.6
1831 | "1986-01-05",13.7
1832 | "1986-01-06",12.6
1833 | "1986-01-07",13.1
1834 | "1986-01-08",15.4
1835 | "1986-01-09",11.9
1836 | "1986-01-10",13.8
1837 | "1986-01-11",14.4
1838 | "1986-01-12",15.2
1839 | "1986-01-13",12.5
1840 | "1986-01-14",12.2
1841 | "1986-01-15",16.1
1842 | "1986-01-16",14.6
1843 | "1986-01-17",11.6
1844 | "1986-01-18",13.1
1845 | "1986-01-19",12.8
1846 | "1986-01-20",15.2
1847 | "1986-01-21",13.8
1848 | "1986-01-22",15.0
1849 | "1986-01-23",13.5
1850 | "1986-01-24",11.8
1851 | "1986-01-25",15.3
1852 | "1986-01-26",13.5
1853 | "1986-01-27",15.3
1854 | "1986-01-28",13.8
1855 | "1986-01-29",15.8
1856 | "1986-01-30",17.4
1857 | "1986-01-31",15.3
1858 | "1986-02-01",14.6
1859 | "1986-02-02",14.8
1860 | "1986-02-03",10.7
1861 | "1986-02-04",11.6
1862 | "1986-02-05",13.6
1863 | "1986-02-06",14.4
1864 | "1986-02-07",11.8
1865 | "1986-02-08",15.8
1866 | "1986-02-09",16.0
1867 | "1986-02-10",11.8
1868 | "1986-02-11",14.5
1869 | "1986-02-12",10.7
1870 | "1986-02-13",14.2
1871 | "1986-02-14",19.5
1872 | "1986-02-15",21.4
1873 | "1986-02-16",17.9
1874 | "1986-02-17",17.4
1875 | "1986-02-18",12.7
1876 | "1986-02-19",13.8
1877 | "1986-02-20",14.0
1878 | "1986-02-21",15.0
1879 | "1986-02-22",14.5
1880 | "1986-02-23",13.1
1881 | "1986-02-24",11.4
1882 | "1986-02-25",12.5
1883 | "1986-02-26",12.0
1884 | "1986-02-27",13.4
1885 | "1986-02-28",14.4
1886 | "1986-03-01",17.7
1887 | "1986-03-02",13.9
1888 | "1986-03-03",13.3
1889 | "1986-03-04",14.6
1890 | "1986-03-05",16.4
1891 | "1986-03-06",16.8
1892 | "1986-03-07",20.0
1893 | "1986-03-08",12.5
1894 | "1986-03-09",12.7
1895 | "1986-03-10",11.7
1896 | "1986-03-11",12.7
1897 | "1986-03-12",8.6
1898 | "1986-03-13",11.9
1899 | "1986-03-14",16.0
1900 | "1986-03-15",15.2
1901 | "1986-03-16",13.4
1902 | "1986-03-17",11.6
1903 | "1986-03-18",11.1
1904 | "1986-03-19",15.6
1905 | "1986-03-20",17.0
1906 | "1986-03-21",18.5
1907 | "1986-03-22",17.4
1908 | "1986-03-23",16.5
1909 | "1986-03-24",16.2
1910 | "1986-03-25",16.1
1911 | "1986-03-26",13.2
1912 | "1986-03-27",18.0
1913 | "1986-03-28",12.8
1914 | "1986-03-29",11.7
1915 | "1986-03-30",16.7
1916 | "1986-03-31",15.6
1917 | "1986-04-01",10.2
1918 | "1986-04-02",10.3
1919 | "1986-04-03",15.0
1920 | "1986-04-04",18.0
1921 | "1986-04-05",13.8
1922 | "1986-04-06",10.5
1923 | "1986-04-07",11.8
1924 | "1986-04-08",7.2
1925 | "1986-04-09",11.6
1926 | "1986-04-10",7.4
1927 | "1986-04-11",14.2
1928 | "1986-04-12",12.2
1929 | "1986-04-13",9.0
1930 | "1986-04-14",12.3
1931 | "1986-04-15",19.7
1932 | "1986-04-16",12.8
1933 | "1986-04-17",12.4
1934 | "1986-04-18",12.0
1935 | "1986-04-19",12.0
1936 | "1986-04-20",11.1
1937 | "1986-04-21",12.7
1938 | "1986-04-22",14.2
1939 | "1986-04-23",11.6
1940 | "1986-04-24",12.0
1941 | "1986-04-25",11.5
1942 | "1986-04-26",8.3
1943 | "1986-04-27",10.5
1944 | "1986-04-28",9.0
1945 | "1986-04-29",6.9
1946 | "1986-04-30",9.4
1947 | "1986-05-01",11.1
1948 | "1986-05-02",9.1
1949 | "1986-05-03",7.7
1950 | "1986-05-04",10.0
1951 | "1986-05-05",10.4
1952 | "1986-05-06",8.0
1953 | "1986-05-07",9.8
1954 | "1986-05-08",12.4
1955 | "1986-05-09",12.9
1956 | "1986-05-10",12.3
1957 | "1986-05-11",6.9
1958 | "1986-05-12",10.5
1959 | "1986-05-13",11.0
1960 | "1986-05-14",9.7
1961 | "1986-05-15",11.1
1962 | "1986-05-16",11.5
1963 | "1986-05-17",13.4
1964 | "1986-05-18",10.9
1965 | "1986-05-19",12.0
1966 | "1986-05-20",12.1
1967 | "1986-05-21",10.4
1968 | "1986-05-22",10.0
1969 | "1986-05-23",9.6
1970 | "1986-05-24",11.3
1971 | "1986-05-25",8.5
1972 | "1986-05-26",6.3
1973 | "1986-05-27",8.2
1974 | "1986-05-28",10.7
1975 | "1986-05-29",10.3
1976 | "1986-05-30",9.5
1977 | "1986-05-31",10.9
1978 | "1986-06-01",10.9
1979 | "1986-06-02",4.3
1980 | "1986-06-03",5.2
1981 | "1986-06-04",11.0
1982 | "1986-06-05",11.6
1983 | "1986-06-06",10.6
1984 | "1986-06-07",9.4
1985 | "1986-06-08",10.0
1986 | "1986-06-09",9.6
1987 | "1986-06-10",9.5
1988 | "1986-06-11",9.7
1989 | "1986-06-12",9.6
1990 | "1986-06-13",7.0
1991 | "1986-06-14",7.0
1992 | "1986-06-15",6.8
1993 | "1986-06-16",6.9
1994 | "1986-06-17",8.0
1995 | "1986-06-18",7.6
1996 | "1986-06-19",8.6
1997 | "1986-06-20",5.7
1998 | "1986-06-21",5.5
1999 | "1986-06-22",5.7
2000 | "1986-06-23",5.7
2001 | "1986-06-24",6.6
2002 | "1986-06-25",6.0
2003 | "1986-06-26",6.9
2004 | "1986-06-27",7.7
2005 | "1986-06-28",8.0
2006 | "1986-06-29",3.9
2007 | "1986-06-30",0.8
2008 | "1986-07-01",2.8
2009 | "1986-07-02",8.0
2010 | "1986-07-03",9.8
2011 | "1986-07-04",11.4
2012 | "1986-07-05",8.6
2013 | "1986-07-06",5.2
2014 | "1986-07-07",6.6
2015 | "1986-07-08",5.7
2016 | "1986-07-09",4.6
2017 | "1986-07-10",5.8
2018 | "1986-07-11",7.0
2019 | "1986-07-12",4.8
2020 | "1986-07-13",4.4
2021 | "1986-07-14",4.4
2022 | "1986-07-15",7.9
2023 | "1986-07-16",10.6
2024 | "1986-07-17",5.0
2025 | "1986-07-18",7.6
2026 | "1986-07-19",9.2
2027 | "1986-07-20",9.7
2028 | "1986-07-21",8.8
2029 | "1986-07-22",6.8
2030 | "1986-07-23",9.4
2031 | "1986-07-24",11.0
2032 | "1986-07-25",2.5
2033 | "1986-07-26",2.1
2034 | "1986-07-27",5.4
2035 | "1986-07-28",6.2
2036 | "1986-07-29",7.8
2037 | "1986-07-30",7.4
2038 | "1986-07-31",9.3
2039 | "1986-08-01",9.3
2040 | "1986-08-02",9.5
2041 | "1986-08-03",8.5
2042 | "1986-08-04",10.0
2043 | "1986-08-05",7.7
2044 | "1986-08-06",9.3
2045 | "1986-08-07",9.1
2046 | "1986-08-08",3.5
2047 | "1986-08-09",3.6
2048 | "1986-08-10",2.5
2049 | "1986-08-11",1.7
2050 | "1986-08-12",2.7
2051 | "1986-08-13",2.9
2052 | "1986-08-14",5.3
2053 | "1986-08-15",7.7
2054 | "1986-08-16",9.1
2055 | "1986-08-17",9.4
2056 | "1986-08-18",7.3
2057 | "1986-08-19",8.4
2058 | "1986-08-20",9.2
2059 | "1986-08-21",6.6
2060 | "1986-08-22",9.7
2061 | "1986-08-23",12.4
2062 | "1986-08-24",10.2
2063 | "1986-08-25",5.9
2064 | "1986-08-26",7.1
2065 | "1986-08-27",7.5
2066 | "1986-08-28",9.7
2067 | "1986-08-29",12.2
2068 | "1986-08-30",5.6
2069 | "1986-08-31",5.4
2070 | "1986-09-01",8.3
2071 | "1986-09-02",10.6
2072 | "1986-09-03",9.1
2073 | "1986-09-04",11.3
2074 | "1986-09-05",10.9
2075 | "1986-09-06",8.9
2076 | "1986-09-07",6.3
2077 | "1986-09-08",9.0
2078 | "1986-09-09",6.1
2079 | "1986-09-10",9.1
2080 | "1986-09-11",9.6
2081 | "1986-09-12",6.0
2082 | "1986-09-13",10.0
2083 | "1986-09-14",11.0
2084 | "1986-09-15",6.2
2085 | "1986-09-16",8.3
2086 | "1986-09-17",11.3
2087 | "1986-09-18",11.3
2088 | "1986-09-19",6.7
2089 | "1986-09-20",6.6
2090 | "1986-09-21",11.4
2091 | "1986-09-22",6.9
2092 | "1986-09-23",10.6
2093 | "1986-09-24",8.6
2094 | "1986-09-25",11.3
2095 | "1986-09-26",12.5
2096 | "1986-09-27",9.9
2097 | "1986-09-28",6.9
2098 | "1986-09-29",5.5
2099 | "1986-09-30",7.8
2100 | "1986-10-01",11.0
2101 | "1986-10-02",16.2
2102 | "1986-10-03",9.9
2103 | "1986-10-04",8.7
2104 | "1986-10-05",10.5
2105 | "1986-10-06",12.2
2106 | "1986-10-07",10.6
2107 | "1986-10-08",8.3
2108 | "1986-10-09",5.5
2109 | "1986-10-10",9.0
2110 | "1986-10-11",6.4
2111 | "1986-10-12",7.2
2112 | "1986-10-13",12.9
2113 | "1986-10-14",12.0
2114 | "1986-10-15",7.3
2115 | "1986-10-16",9.7
2116 | "1986-10-17",8.4
2117 | "1986-10-18",14.7
2118 | "1986-10-19",9.5
2119 | "1986-10-20",7.9
2120 | "1986-10-21",6.8
2121 | "1986-10-22",12.6
2122 | "1986-10-23",5.2
2123 | "1986-10-24",7.5
2124 | "1986-10-25",8.7
2125 | "1986-10-26",7.6
2126 | "1986-10-27",9.0
2127 | "1986-10-28",7.2
2128 | "1986-10-29",10.7
2129 | "1986-10-30",13.1
2130 | "1986-10-31",13.9
2131 | "1986-11-01",10.8
2132 | "1986-11-02",10.4
2133 | "1986-11-03",9.1
2134 | "1986-11-04",16.0
2135 | "1986-11-05",21.0
2136 | "1986-11-06",16.2
2137 | "1986-11-07",8.6
2138 | "1986-11-08",9.2
2139 | "1986-11-09",12.5
2140 | "1986-11-10",9.7
2141 | "1986-11-11",12.5
2142 | "1986-11-12",10.3
2143 | "1986-11-13",12.0
2144 | "1986-11-14",11.0
2145 | "1986-11-15",14.8
2146 | "1986-11-16",15.0
2147 | "1986-11-17",15.3
2148 | "1986-11-18",10.3
2149 | "1986-11-19",10.7
2150 | "1986-11-20",10.5
2151 | "1986-11-21",8.9
2152 | "1986-11-22",8.1
2153 | "1986-11-23",11.5
2154 | "1986-11-24",12.8
2155 | "1986-11-25",9.1
2156 | "1986-11-26",14.6
2157 | "1986-11-27",11.6
2158 | "1986-11-28",11.2
2159 | "1986-11-29",12.6
2160 | "1986-11-30",7.5
2161 | "1986-12-01",11.0
2162 | "1986-12-02",14.5
2163 | "1986-12-03",18.5
2164 | "1986-12-04",15.4
2165 | "1986-12-05",13.1
2166 | "1986-12-06",16.3
2167 | "1986-12-07",20.2
2168 | "1986-12-08",11.5
2169 | "1986-12-09",12.4
2170 | "1986-12-10",10.9
2171 | "1986-12-11",12.7
2172 | "1986-12-12",12.2
2173 | "1986-12-13",12.4
2174 | "1986-12-14",9.8
2175 | "1986-12-15",8.5
2176 | "1986-12-16",14.7
2177 | "1986-12-17",12.0
2178 | "1986-12-18",10.3
2179 | "1986-12-19",11.0
2180 | "1986-12-20",10.2
2181 | "1986-12-21",12.6
2182 | "1986-12-22",11.6
2183 | "1986-12-23",9.7
2184 | "1986-12-24",13.4
2185 | "1986-12-25",10.5
2186 | "1986-12-26",14.7
2187 | "1986-12-27",14.6
2188 | "1986-12-28",14.2
2189 | "1986-12-29",13.2
2190 | "1986-12-30",11.7
2191 | "1986-12-31",17.2
2192 | "1987-01-01",12.3
2193 | "1987-01-02",13.8
2194 | "1987-01-03",15.3
2195 | "1987-01-04",15.6
2196 | "1987-01-05",16.2
2197 | "1987-01-06",16.3
2198 | "1987-01-07",16.8
2199 | "1987-01-08",11.0
2200 | "1987-01-09",8.5
2201 | "1987-01-10",13.2
2202 | "1987-01-11",13.0
2203 | "1987-01-12",12.4
2204 | "1987-01-13",13.0
2205 | "1987-01-14",16.6
2206 | "1987-01-15",12.0
2207 | "1987-01-16",12.4
2208 | "1987-01-17",15.0
2209 | "1987-01-18",11.8
2210 | "1987-01-19",11.6
2211 | "1987-01-20",12.2
2212 | "1987-01-21",13.7
2213 | "1987-01-22",11.2
2214 | "1987-01-23",12.4
2215 | "1987-01-24",11.5
2216 | "1987-01-25",13.8
2217 | "1987-01-26",15.7
2218 | "1987-01-27",12.9
2219 | "1987-01-28",11.5
2220 | "1987-01-29",11.0
2221 | "1987-01-30",12.7
2222 | "1987-01-31",14.9
2223 | "1987-02-01",16.5
2224 | "1987-02-02",12.8
2225 | "1987-02-03",12.7
2226 | "1987-02-04",12.7
2227 | "1987-02-05",11.6
2228 | "1987-02-06",13.3
2229 | "1987-02-07",15.2
2230 | "1987-02-08",16.4
2231 | "1987-02-09",11.9
2232 | "1987-02-10",15.1
2233 | "1987-02-11",10.6
2234 | "1987-02-12",13.6
2235 | "1987-02-13",12.1
2236 | "1987-02-14",16.0
2237 | "1987-02-15",16.8
2238 | "1987-02-16",16.6
2239 | "1987-02-17",15.6
2240 | "1987-02-18",15.2
2241 | "1987-02-19",17.7
2242 | "1987-02-20",21.0
2243 | "1987-02-21",13.4
2244 | "1987-02-22",10.5
2245 | "1987-02-23",9.5
2246 | "1987-02-24",12.0
2247 | "1987-02-25",10.4
2248 | "1987-02-26",11.5
2249 | "1987-02-27",13.2
2250 | "1987-02-28",15.0
2251 | "1987-03-01",14.1
2252 | "1987-03-02",12.4
2253 | "1987-03-03",13.4
2254 | "1987-03-04",12.5
2255 | "1987-03-05",14.3
2256 | "1987-03-06",17.6
2257 | "1987-03-07",10.4
2258 | "1987-03-08",9.9
2259 | "1987-03-09",10.2
2260 | "1987-03-10",11.3
2261 | "1987-03-11",9.5
2262 | "1987-03-12",11.8
2263 | "1987-03-13",11.5
2264 | "1987-03-14",10.5
2265 | "1987-03-15",10.8
2266 | "1987-03-16",13.0
2267 | "1987-03-17",18.5
2268 | "1987-03-18",18.7
2269 | "1987-03-19",15.0
2270 | "1987-03-20",13.0
2271 | "1987-03-21",11.3
2272 | "1987-03-22",13.0
2273 | "1987-03-23",13.3
2274 | "1987-03-24",11.0
2275 | "1987-03-25",10.3
2276 | "1987-03-26",13.0
2277 | "1987-03-27",12.3
2278 | "1987-03-28",15.6
2279 | "1987-03-29",10.2
2280 | "1987-03-30",10.8
2281 | "1987-03-31",12.0
2282 | "1987-04-01",13.3
2283 | "1987-04-02",11.7
2284 | "1987-04-03",12.5
2285 | "1987-04-04",13.7
2286 | "1987-04-05",14.9
2287 | "1987-04-06",20.2
2288 | "1987-04-07",16.3
2289 | "1987-04-08",13.9
2290 | "1987-04-09",10.1
2291 | "1987-04-10",7.3
2292 | "1987-04-11",14.0
2293 | "1987-04-12",17.7
2294 | "1987-04-13",16.3
2295 | "1987-04-14",10.6
2296 | "1987-04-15",9.7
2297 | "1987-04-16",7.8
2298 | "1987-04-17",10.4
2299 | "1987-04-18",10.4
2300 | "1987-04-19",14.1
2301 | "1987-04-20",7.1
2302 | "1987-04-21",8.1
2303 | "1987-04-22",7.8
2304 | "1987-04-23",10.6
2305 | "1987-04-24",9.1
2306 | "1987-04-25",9.0
2307 | "1987-04-26",11.9
2308 | "1987-04-27",17.1
2309 | "1987-04-28",16.8
2310 | "1987-04-29",13.5
2311 | "1987-04-30",11.6
2312 | "1987-05-01",7.0
2313 | "1987-05-02",9.7
2314 | "1987-05-03",9.9
2315 | "1987-05-04",11.2
2316 | "1987-05-05",11.3
2317 | "1987-05-06",11.8
2318 | "1987-05-07",9.9
2319 | "1987-05-08",7.1
2320 | "1987-05-09",9.6
2321 | "1987-05-10",9.8
2322 | "1987-05-11",10.6
2323 | "1987-05-12",12.8
2324 | "1987-05-13",16.5
2325 | "1987-05-14",11.7
2326 | "1987-05-15",12.3
2327 | "1987-05-16",12.2
2328 | "1987-05-17",11.8
2329 | "1987-05-18",10.7
2330 | "1987-05-19",10.2
2331 | "1987-05-20",10.0
2332 | "1987-05-21",8.3
2333 | "1987-05-22",6.6
2334 | "1987-05-23",9.5
2335 | "1987-05-24",12.3
2336 | "1987-05-25",7.6
2337 | "1987-05-26",9.3
2338 | "1987-05-27",5.0
2339 | "1987-05-28",4.3
2340 | "1987-05-29",6.4
2341 | "1987-05-30",10.8
2342 | "1987-05-31",7.8
2343 | "1987-06-01",8.5
2344 | "1987-06-02",9.7
2345 | "1987-06-03",10.0
2346 | "1987-06-04",11.0
2347 | "1987-06-05",10.2
2348 | "1987-06-06",6.6
2349 | "1987-06-07",6.1
2350 | "1987-06-08",5.9
2351 | "1987-06-09",8.9
2352 | "1987-06-10",13.0
2353 | "1987-06-11",12.6
2354 | "1987-06-12",5.4
2355 | "1987-06-13",6.0
2356 | "1987-06-14",7.8
2357 | "1987-06-15",9.0
2358 | "1987-06-16",4.2
2359 | "1987-06-17",3.0
2360 | "1987-06-18",4.5
2361 | "1987-06-19",6.2
2362 | "1987-06-20",11.9
2363 | "1987-06-21",11.8
2364 | "1987-06-22",9.4
2365 | "1987-06-23",9.6
2366 | "1987-06-24",9.4
2367 | "1987-06-25",7.0
2368 | "1987-06-26",8.9
2369 | "1987-06-27",9.3
2370 | "1987-06-28",6.8
2371 | "1987-06-29",7.5
2372 | "1987-06-30",8.0
2373 | "1987-07-01",8.3
2374 | "1987-07-02",2.7
2375 | "1987-07-03",3.9
2376 | "1987-07-04",4.1
2377 | "1987-07-05",5.0
2378 | "1987-07-06",5.8
2379 | "1987-07-07",4.4
2380 | "1987-07-08",4.1
2381 | "1987-07-09",5.8
2382 | "1987-07-10",9.1
2383 | "1987-07-11",7.9
2384 | "1987-07-12",5.0
2385 | "1987-07-13",2.8
2386 | "1987-07-14",4.7
2387 | "1987-07-15",8.9
2388 | "1987-07-16",5.4
2389 | "1987-07-17",7.1
2390 | "1987-07-18",9.0
2391 | "1987-07-19",9.4
2392 | "1987-07-20",6.3
2393 | "1987-07-21",7.0
2394 | "1987-07-22",6.4
2395 | "1987-07-23",6.7
2396 | "1987-07-24",1.5
2397 | "1987-07-25",2.9
2398 | "1987-07-26",4.8
2399 | "1987-07-27",6.3
2400 | "1987-07-28",5.7
2401 | "1987-07-29",7.0
2402 | "1987-07-30",8.8
2403 | "1987-07-31",8.7
2404 | "1987-08-01",9.0
2405 | "1987-08-02",9.6
2406 | "1987-08-03",8.0
2407 | "1987-08-04",8.4
2408 | "1987-08-05",8.1
2409 | "1987-08-06",9.0
2410 | "1987-08-07",5.3
2411 | "1987-08-08",8.9
2412 | "1987-08-09",8.7
2413 | "1987-08-10",4.9
2414 | "1987-08-11",7.0
2415 | "1987-08-12",7.5
2416 | "1987-08-13",7.0
2417 | "1987-08-14",9.1
2418 | "1987-08-15",11.8
2419 | "1987-08-16",9.9
2420 | "1987-08-17",5.6
2421 | "1987-08-18",4.2
2422 | "1987-08-19",4.3
2423 | "1987-08-20",8.0
2424 | "1987-08-21",5.1
2425 | "1987-08-22",9.4
2426 | "1987-08-23",9.1
2427 | "1987-08-24",9.7
2428 | "1987-08-25",10.6
2429 | "1987-08-26",8.6
2430 | "1987-08-27",10.1
2431 | "1987-08-28",11.0
2432 | "1987-08-29",9.7
2433 | "1987-08-30",5.0
2434 | "1987-08-31",6.1
2435 | "1987-09-01",5.4
2436 | "1987-09-02",5.8
2437 | "1987-09-03",7.3
2438 | "1987-09-04",6.3
2439 | "1987-09-05",4.8
2440 | "1987-09-06",7.6
2441 | "1987-09-07",8.1
2442 | "1987-09-08",9.5
2443 | "1987-09-09",10.3
2444 | "1987-09-10",7.0
2445 | "1987-09-11",9.0
2446 | "1987-09-12",10.2
2447 | "1987-09-13",6.8
2448 | "1987-09-14",9.3
2449 | "1987-09-15",9.8
2450 | "1987-09-16",10.7
2451 | "1987-09-17",7.8
2452 | "1987-09-18",9.2
2453 | "1987-09-19",15.0
2454 | "1987-09-20",7.8
2455 | "1987-09-21",5.3
2456 | "1987-09-22",9.5
2457 | "1987-09-23",7.6
2458 | "1987-09-24",14.0
2459 | "1987-09-25",14.9
2460 | "1987-09-26",14.9
2461 | "1987-09-27",19.2
2462 | "1987-09-28",17.0
2463 | "1987-09-29",13.0
2464 | "1987-09-30",11.2
2465 | "1987-10-01",9.5
2466 | "1987-10-02",10.3
2467 | "1987-10-03",9.3
2468 | "1987-10-04",11.3
2469 | "1987-10-05",6.5
2470 | "1987-10-06",12.0
2471 | "1987-10-07",8.3
2472 | "1987-10-08",8.7
2473 | "1987-10-09",8.7
2474 | "1987-10-10",10.2
2475 | "1987-10-11",6.9
2476 | "1987-10-12",4.9
2477 | "1987-10-13",10.0
2478 | "1987-10-14",7.6
2479 | "1987-10-15",14.5
2480 | "1987-10-16",13.2
2481 | "1987-10-17",9.9
2482 | "1987-10-18",10.1
2483 | "1987-10-19",11.3
2484 | "1987-10-20",10.4
2485 | "1987-10-21",10.9
2486 | "1987-10-22",9.2
2487 | "1987-10-23",10.5
2488 | "1987-10-24",11.4
2489 | "1987-10-25",13.5
2490 | "1987-10-26",9.8
2491 | "1987-10-27",13.1
2492 | "1987-10-28",9.7
2493 | "1987-10-29",11.4
2494 | "1987-10-30",9.9
2495 | "1987-10-31",14.4
2496 | "1987-11-01",19.0
2497 | "1987-11-02",23.0
2498 | "1987-11-03",15.4
2499 | "1987-11-04",9.6
2500 | "1987-11-05",10.8
2501 | "1987-11-06",12.1
2502 | "1987-11-07",11.0
2503 | "1987-11-08",12.6
2504 | "1987-11-09",14.7
2505 | "1987-11-10",11.1
2506 | "1987-11-11",10.1
2507 | "1987-11-12",11.4
2508 | "1987-11-13",13.0
2509 | "1987-11-14",11.9
2510 | "1987-11-15",9.5
2511 | "1987-11-16",13.5
2512 | "1987-11-17",15.2
2513 | "1987-11-18",18.4
2514 | "1987-11-19",24.1
2515 | "1987-11-20",14.1
2516 | "1987-11-21",10.7
2517 | "1987-11-22",8.7
2518 | "1987-11-23",13.3
2519 | "1987-11-24",11.6
2520 | "1987-11-25",9.9
2521 | "1987-11-26",10.8
2522 | "1987-11-27",11.5
2523 | "1987-11-28",10.0
2524 | "1987-11-29",13.9
2525 | "1987-11-30",13.6
2526 | "1987-12-01",11.9
2527 | "1987-12-02",11.1
2528 | "1987-12-03",8.2
2529 | "1987-12-04",9.4
2530 | "1987-12-05",12.7
2531 | "1987-12-06",11.6
2532 | "1987-12-07",11.0
2533 | "1987-12-08",11.3
2534 | "1987-12-09",13.4
2535 | "1987-12-10",14.9
2536 | "1987-12-11",15.2
2537 | "1987-12-12",13.9
2538 | "1987-12-13",15.0
2539 | "1987-12-14",16.2
2540 | "1987-12-15",17.7
2541 | "1987-12-16",20.5
2542 | "1987-12-17",14.7
2543 | "1987-12-18",12.5
2544 | "1987-12-19",10.9
2545 | "1987-12-20",12.8
2546 | "1987-12-21",12.7
2547 | "1987-12-22",11.2
2548 | "1987-12-23",11.4
2549 | "1987-12-24",11.2
2550 | "1987-12-25",12.1
2551 | "1987-12-26",12.7
2552 | "1987-12-27",16.2
2553 | "1987-12-28",14.2
2554 | "1987-12-29",14.3
2555 | "1987-12-30",13.3
2556 | "1987-12-31",16.7
2557 | "1988-01-01",15.3
2558 | "1988-01-02",14.3
2559 | "1988-01-03",13.5
2560 | "1988-01-04",15.0
2561 | "1988-01-05",13.6
2562 | "1988-01-06",15.2
2563 | "1988-01-07",17.0
2564 | "1988-01-08",18.7
2565 | "1988-01-09",16.5
2566 | "1988-01-10",17.4
2567 | "1988-01-11",18.3
2568 | "1988-01-12",18.3
2569 | "1988-01-13",22.4
2570 | "1988-01-14",21.4
2571 | "1988-01-15",20.9
2572 | "1988-01-16",17.6
2573 | "1988-01-17",15.5
2574 | "1988-01-18",16.6
2575 | "1988-01-19",16.2
2576 | "1988-01-20",15.6
2577 | "1988-01-21",14.5
2578 | "1988-01-22",14.0
2579 | "1988-01-23",15.6
2580 | "1988-01-24",12.3
2581 | "1988-01-25",11.6
2582 | "1988-01-26",12.6
2583 | "1988-01-27",14.9
2584 | "1988-01-28",17.3
2585 | "1988-01-29",21.4
2586 | "1988-01-30",23.4
2587 | "1988-01-31",14.4
2588 | "1988-02-01",14.1
2589 | "1988-02-02",15.0
2590 | "1988-02-03",14.5
2591 | "1988-02-04",15.1
2592 | "1988-02-05",13.9
2593 | "1988-02-06",13.4
2594 | "1988-02-07",9.2
2595 | "1988-02-08",12.5
2596 | "1988-02-09",15.1
2597 | "1988-02-10",12.1
2598 | "1988-02-11",14.5
2599 | "1988-02-12",16.3
2600 | "1988-02-13",16.5
2601 | "1988-02-14",14.9
2602 | "1988-02-15",13.2
2603 | "1988-02-16",11.8
2604 | "1988-02-17",13.6
2605 | "1988-02-18",16.2
2606 | "1988-02-19",14.1
2607 | "1988-02-20",13.5
2608 | "1988-02-21",15.0
2609 | "1988-02-22",14.8
2610 | "1988-02-23",16.2
2611 | "1988-02-24",16.2
2612 | "1988-02-25",13.3
2613 | "1988-02-26",15.3
2614 | "1988-02-27",18.4
2615 | "1988-02-28",16.2
2616 | "1988-02-29",16.3
2617 | "1988-03-01",12.4
2618 | "1988-03-02",15.6
2619 | "1988-03-03",14.9
2620 | "1988-03-04",14.8
2621 | "1988-03-05",12.7
2622 | "1988-03-06",14.2
2623 | "1988-03-07",16.8
2624 | "1988-03-08",16.7
2625 | "1988-03-09",16.2
2626 | "1988-03-10",14.5
2627 | "1988-03-11",10.0
2628 | "1988-03-12",12.6
2629 | "1988-03-13",11.9
2630 | "1988-03-14",11.8
2631 | "1988-03-15",13.4
2632 | "1988-03-16",14.5
2633 | "1988-03-17",15.7
2634 | "1988-03-18",15.3
2635 | "1988-03-19",13.9
2636 | "1988-03-20",13.7
2637 | "1988-03-21",15.1
2638 | "1988-03-22",15.6
2639 | "1988-03-23",14.4
2640 | "1988-03-24",13.9
2641 | "1988-03-25",16.2
2642 | "1988-03-26",16.7
2643 | "1988-03-27",15.5
2644 | "1988-03-28",16.4
2645 | "1988-03-29",17.5
2646 | "1988-03-30",18.2
2647 | "1988-03-31",16.1
2648 | "1988-04-01",16.5
2649 | "1988-04-02",14.6
2650 | "1988-04-03",16.4
2651 | "1988-04-04",13.6
2652 | "1988-04-05",15.9
2653 | "1988-04-06",11.9
2654 | "1988-04-07",14.7
2655 | "1988-04-08",9.4
2656 | "1988-04-09",6.6
2657 | "1988-04-10",7.9
2658 | "1988-04-11",11.0
2659 | "1988-04-12",15.7
2660 | "1988-04-13",15.2
2661 | "1988-04-14",15.9
2662 | "1988-04-15",10.6
2663 | "1988-04-16",8.3
2664 | "1988-04-17",8.6
2665 | "1988-04-18",12.7
2666 | "1988-04-19",10.5
2667 | "1988-04-20",12.0
2668 | "1988-04-21",11.1
2669 | "1988-04-22",13.0
2670 | "1988-04-23",12.4
2671 | "1988-04-24",13.3
2672 | "1988-04-25",15.9
2673 | "1988-04-26",12.0
2674 | "1988-04-27",13.7
2675 | "1988-04-28",17.6
2676 | "1988-04-29",14.3
2677 | "1988-04-30",13.7
2678 | "1988-05-01",15.2
2679 | "1988-05-02",14.5
2680 | "1988-05-03",14.9
2681 | "1988-05-04",15.5
2682 | "1988-05-05",16.4
2683 | "1988-05-06",14.5
2684 | "1988-05-07",12.6
2685 | "1988-05-08",13.6
2686 | "1988-05-09",11.2
2687 | "1988-05-10",11.0
2688 | "1988-05-11",12.0
2689 | "1988-05-12",6.8
2690 | "1988-05-13",10.6
2691 | "1988-05-14",13.1
2692 | "1988-05-15",13.5
2693 | "1988-05-16",11.7
2694 | "1988-05-17",13.2
2695 | "1988-05-18",12.0
2696 | "1988-05-19",10.4
2697 | "1988-05-20",10.0
2698 | "1988-05-21",8.2
2699 | "1988-05-22",9.4
2700 | "1988-05-23",10.3
2701 | "1988-05-24",8.1
2702 | "1988-05-25",8.7
2703 | "1988-05-26",12.6
2704 | "1988-05-27",10.9
2705 | "1988-05-28",8.7
2706 | "1988-05-29",9.3
2707 | "1988-05-30",6.3
2708 | "1988-05-31",7.8
2709 | "1988-06-01",10.0
2710 | "1988-06-02",11.0
2711 | "1988-06-03",11.1
2712 | "1988-06-04",12.6
2713 | "1988-06-05",10.2
2714 | "1988-06-06",11.1
2715 | "1988-06-07",8.7
2716 | "1988-06-08",9.5
2717 | "1988-06-09",9.7
2718 | "1988-06-10",8.2
2719 | "1988-06-11",5.0
2720 | "1988-06-12",6.5
2721 | "1988-06-13",12.1
2722 | "1988-06-14",8.9
2723 | "1988-06-15",6.1
2724 | "1988-06-16",2.8
2725 | "1988-06-17",3.7
2726 | "1988-06-18",6.8
2727 | "1988-06-19",6.6
2728 | "1988-06-20",7.0
2729 | "1988-06-21",7.3
2730 | "1988-06-22",7.9
2731 | "1988-06-23",10.6
2732 | "1988-06-24",8.1
2733 | "1988-06-25",6.7
2734 | "1988-06-26",8.0
2735 | "1988-06-27",10.0
2736 | "1988-06-28",6.7
2737 | "1988-06-29",9.4
2738 | "1988-06-30",9.3
2739 | "1988-07-01",6.0
2740 | "1988-07-02",5.8
2741 | "1988-07-03",4.9
2742 | "1988-07-04",5.0
2743 | "1988-07-05",8.4
2744 | "1988-07-06",12.3
2745 | "1988-07-07",13.0
2746 | "1988-07-08",11.4
2747 | "1988-07-09",6.8
2748 | "1988-07-10",7.6
2749 | "1988-07-11",12.4
2750 | "1988-07-12",7.1
2751 | "1988-07-13",7.5
2752 | "1988-07-14",10.0
2753 | "1988-07-15",5.3
2754 | "1988-07-16",6.3
2755 | "1988-07-17",8.0
2756 | "1988-07-18",8.3
2757 | "1988-07-19",9.3
2758 | "1988-07-20",9.5
2759 | "1988-07-21",5.6
2760 | "1988-07-22",7.0
2761 | "1988-07-23",8.5
2762 | "1988-07-24",8.5
2763 | "1988-07-25",8.2
2764 | "1988-07-26",8.5
2765 | "1988-07-27",9.6
2766 | "1988-07-28",9.7
2767 | "1988-07-29",7.1
2768 | "1988-07-30",8.4
2769 | "1988-07-31",9.2
2770 | "1988-08-01",9.8
2771 | "1988-08-02",8.1
2772 | "1988-08-03",9.4
2773 | "1988-08-04",10.0
2774 | "1988-08-05",5.1
2775 | "1988-08-06",6.7
2776 | "1988-08-07",6.9
2777 | "1988-08-08",6.8
2778 | "1988-08-09",8.6
2779 | "1988-08-10",9.1
2780 | "1988-08-11",3.9
2781 | "1988-08-12",4.8
2782 | "1988-08-13",8.4
2783 | "1988-08-14",11.6
2784 | "1988-08-15",12.1
2785 | "1988-08-16",12.4
2786 | "1988-08-17",10.0
2787 | "1988-08-18",10.1
2788 | "1988-08-19",9.7
2789 | "1988-08-20",11.7
2790 | "1988-08-21",7.9
2791 | "1988-08-22",8.6
2792 | "1988-08-23",7.7
2793 | "1988-08-24",5.8
2794 | "1988-08-25",8.7
2795 | "1988-08-26",10.6
2796 | "1988-08-27",6.7
2797 | "1988-08-28",8.8
2798 | "1988-08-29",9.7
2799 | "1988-08-30",9.0
2800 | "1988-08-31",11.8
2801 | "1988-09-01",15.2
2802 | "1988-09-02",10.0
2803 | "1988-09-03",10.5
2804 | "1988-09-04",5.5
2805 | "1988-09-05",9.4
2806 | "1988-09-06",8.8
2807 | "1988-09-07",5.3
2808 | "1988-09-08",13.0
2809 | "1988-09-09",15.2
2810 | "1988-09-10",13.2
2811 | "1988-09-11",11.5
2812 | "1988-09-12",6.8
2813 | "1988-09-13",4.7
2814 | "1988-09-14",5.2
2815 | "1988-09-15",6.8
2816 | "1988-09-16",10.7
2817 | "1988-09-17",10.1
2818 | "1988-09-18",10.0
2819 | "1988-09-19",9.8
2820 | "1988-09-20",5.5
2821 | "1988-09-21",13.5
2822 | "1988-09-22",16.6
2823 | "1988-09-23",8.4
2824 | "1988-09-24",8.2
2825 | "1988-09-25",11.1
2826 | "1988-09-26",10.8
2827 | "1988-09-27",8.8
2828 | "1988-09-28",10.8
2829 | "1988-09-29",8.7
2830 | "1988-09-30",12.4
2831 | "1988-10-01",9.0
2832 | "1988-10-02",13.5
2833 | "1988-10-03",14.7
2834 | "1988-10-04",10.9
2835 | "1988-10-05",8.5
2836 | "1988-10-06",6.0
2837 | "1988-10-07",12.7
2838 | "1988-10-08",11.1
2839 | "1988-10-09",8.7
2840 | "1988-10-10",12.3
2841 | "1988-10-11",13.3
2842 | "1988-10-12",5.6
2843 | "1988-10-13",13.7
2844 | "1988-10-14",8.5
2845 | "1988-10-15",11.2
2846 | "1988-10-16",8.7
2847 | "1988-10-17",11.7
2848 | "1988-10-18",12.5
2849 | "1988-10-19",8.2
2850 | "1988-10-20",15.6
2851 | "1988-10-21",10.3
2852 | "1988-10-22",11.4
2853 | "1988-10-23",9.7
2854 | "1988-10-24",6.3
2855 | "1988-10-25",14.3
2856 | "1988-10-26",11.3
2857 | "1988-10-27",7.3
2858 | "1988-10-28",12.8
2859 | "1988-10-29",11.9
2860 | "1988-10-30",14.3
2861 | "1988-10-31",11.6
2862 | "1988-11-01",13.2
2863 | "1988-11-02",15.5
2864 | "1988-11-03",14.1
2865 | "1988-11-04",9.5
2866 | "1988-11-05",7.2
2867 | "1988-11-06",11.8
2868 | "1988-11-07",16.8
2869 | "1988-11-08",12.5
2870 | "1988-11-09",9.4
2871 | "1988-11-10",11.9
2872 | "1988-11-11",10.3
2873 | "1988-11-12",16.9
2874 | "1988-11-13",17.5
2875 | "1988-11-14",7.5
2876 | "1988-11-15",8.6
2877 | "1988-11-16",11.1
2878 | "1988-11-17",11.5
2879 | "1988-11-18",10.7
2880 | "1988-11-19",15.7
2881 | "1988-11-20",12.8
2882 | "1988-11-21",13.0
2883 | "1988-11-22",12.9
2884 | "1988-11-23",14.3
2885 | "1988-11-24",13.7
2886 | "1988-11-25",12.1
2887 | "1988-11-26",11.9
2888 | "1988-11-27",11.8
2889 | "1988-11-28",11.4
2890 | "1988-11-29",10.3
2891 | "1988-11-30",11.7
2892 | "1988-12-01",12.0
2893 | "1988-12-02",17.4
2894 | "1988-12-03",16.8
2895 | "1988-12-04",16.2
2896 | "1988-12-05",13.0
2897 | "1988-12-06",12.5
2898 | "1988-12-07",12.4
2899 | "1988-12-08",16.1
2900 | "1988-12-09",20.2
2901 | "1988-12-10",14.3
2902 | "1988-12-11",11.0
2903 | "1988-12-12",14.4
2904 | "1988-12-13",15.7
2905 | "1988-12-14",19.7
2906 | "1988-12-15",20.7
2907 | "1988-12-16",23.9
2908 | "1988-12-17",16.6
2909 | "1988-12-18",17.5
2910 | "1988-12-19",14.9
2911 | "1988-12-20",13.6
2912 | "1988-12-21",11.9
2913 | "1988-12-22",15.2
2914 | "1988-12-23",17.3
2915 | "1988-12-24",19.8
2916 | "1988-12-25",15.8
2917 | "1988-12-26",9.5
2918 | "1988-12-27",12.9
2919 | "1988-12-28",12.9
2920 | "1988-12-29",14.8
2921 | "1988-12-30",14.1
2922 | "1989-01-01",14.3
2923 | "1989-01-02",17.4
2924 | "1989-01-03",18.5
2925 | "1989-01-04",16.8
2926 | "1989-01-05",11.5
2927 | "1989-01-06",9.5
2928 | "1989-01-07",12.2
2929 | "1989-01-08",15.7
2930 | "1989-01-09",16.3
2931 | "1989-01-10",13.6
2932 | "1989-01-11",12.6
2933 | "1989-01-12",13.8
2934 | "1989-01-13",12.1
2935 | "1989-01-14",13.4
2936 | "1989-01-15",17.3
2937 | "1989-01-16",19.4
2938 | "1989-01-17",16.6
2939 | "1989-01-18",13.9
2940 | "1989-01-19",13.1
2941 | "1989-01-20",16.0
2942 | "1989-01-21",14.5
2943 | "1989-01-22",15.0
2944 | "1989-01-23",12.6
2945 | "1989-01-24",12.5
2946 | "1989-01-25",15.2
2947 | "1989-01-26",16.2
2948 | "1989-01-27",16.5
2949 | "1989-01-28",20.1
2950 | "1989-01-29",20.6
2951 | "1989-01-30",16.9
2952 | "1989-01-31",16.5
2953 | "1989-02-01",16.1
2954 | "1989-02-02",14.4
2955 | "1989-02-03",16.3
2956 | "1989-02-04",15.7
2957 | "1989-02-05",14.2
2958 | "1989-02-06",13.2
2959 | "1989-02-07",16.8
2960 | "1989-02-08",18.5
2961 | "1989-02-09",16.7
2962 | "1989-02-10",15.3
2963 | "1989-02-11",15.9
2964 | "1989-02-12",15.2
2965 | "1989-02-13",17.5
2966 | "1989-02-14",18.3
2967 | "1989-02-15",19.4
2968 | "1989-02-16",19.4
2969 | "1989-02-17",19.5
2970 | "1989-02-18",20.5
2971 | "1989-02-19",15.7
2972 | "1989-02-20",15.0
2973 | "1989-02-21",16.1
2974 | "1989-02-22",14.3
2975 | "1989-02-23",13.0
2976 | "1989-02-24",16.2
2977 | "1989-02-25",17.7
2978 | "1989-02-26",13.2
2979 | "1989-02-27",15.8
2980 | "1989-02-28",18.5
2981 | "1989-03-01",20.4
2982 | "1989-03-02",22.0
2983 | "1989-03-03",19.7
2984 | "1989-03-04",19.6
2985 | "1989-03-05",20.3
2986 | "1989-03-06",18.3
2987 | "1989-03-07",18.9
2988 | "1989-03-08",20.3
2989 | "1989-03-09",21.4
2990 | "1989-03-10",18.3
2991 | "1989-03-11",17.8
2992 | "1989-03-12",17.7
2993 | "1989-03-13",12.8
2994 | "1989-03-14",15.1
2995 | "1989-03-15",15.0
2996 | "1989-03-16",14.8
2997 | "1989-03-17",12.0
2998 | "1989-03-18",12.5
2999 | "1989-03-19",15.0
3000 | "1989-03-20",17.1
3001 | "1989-03-21",17.3
3002 | "1989-03-22",16.9
3003 | "1989-03-23",16.5
3004 | "1989-03-24",13.6
3005 | "1989-03-25",13.2
3006 | "1989-03-26",9.4
3007 | "1989-03-27",9.5
3008 | "1989-03-28",11.8
3009 | "1989-03-29",10.4
3010 | "1989-03-30",9.7
3011 | "1989-03-31",12.6
3012 | "1989-04-01",13.3
3013 | "1989-04-02",15.1
3014 | "1989-04-03",14.2
3015 | "1989-04-04",14.2
3016 | "1989-04-05",19.2
3017 | "1989-04-06",12.6
3018 | "1989-04-07",14.2
3019 | "1989-04-08",11.9
3020 | "1989-04-09",13.9
3021 | "1989-04-10",13.5
3022 | "1989-04-11",15.3
3023 | "1989-04-12",13.9
3024 | "1989-04-13",14.0
3025 | "1989-04-14",12.9
3026 | "1989-04-15",8.5
3027 | "1989-04-16",11.4
3028 | "1989-04-17",10.9
3029 | "1989-04-18",12.0
3030 | "1989-04-19",8.6
3031 | "1989-04-20",9.0
3032 | "1989-04-21",9.6
3033 | "1989-04-22",10.2
3034 | "1989-04-23",9.8
3035 | "1989-04-24",8.3
3036 | "1989-04-25",11.0
3037 | "1989-04-26",11.9
3038 | "1989-04-27",14.0
3039 | "1989-04-28",15.8
3040 | "1989-04-29",14.5
3041 | "1989-04-30",13.2
3042 | "1989-05-01",14.2
3043 | "1989-05-02",14.6
3044 | "1989-05-03",11.8
3045 | "1989-05-04",14.4
3046 | "1989-05-05",10.4
3047 | "1989-05-06",10.3
3048 | "1989-05-07",10.8
3049 | "1989-05-08",10.5
3050 | "1989-05-09",9.5
3051 | "1989-05-10",12.5
3052 | "1989-05-11",13.7
3053 | "1989-05-12",12.7
3054 | "1989-05-13",11.9
3055 | "1989-05-14",11.4
3056 | "1989-05-15",9.7
3057 | "1989-05-16",8.3
3058 | "1989-05-17",8.1
3059 | "1989-05-18",11.7
3060 | "1989-05-19",11.6
3061 | "1989-05-20",7.4
3062 | "1989-05-21",5.2
3063 | "1989-05-22",11.0
3064 | "1989-05-23",9.5
3065 | "1989-05-24",9.2
3066 | "1989-05-25",10.7
3067 | "1989-05-26",9.0
3068 | "1989-05-27",10.2
3069 | "1989-05-28",10.3
3070 | "1989-05-29",12.1
3071 | "1989-05-30",13.2
3072 | "1989-05-31",6.6
3073 | "1989-06-01",2.3
3074 | "1989-06-02",1.4
3075 | "1989-06-03",2.1
3076 | "1989-06-04",6.6
3077 | "1989-06-05",8.9
3078 | "1989-06-06",7.8
3079 | "1989-06-07",9.0
3080 | "1989-06-08",10.3
3081 | "1989-06-09",7.9
3082 | "1989-06-10",7.2
3083 | "1989-06-11",8.6
3084 | "1989-06-12",8.8
3085 | "1989-06-13",6.2
3086 | "1989-06-14",9.5
3087 | "1989-06-15",10.2
3088 | "1989-06-16",9.7
3089 | "1989-06-17",11.2
3090 | "1989-06-18",10.2
3091 | "1989-06-19",10.1
3092 | "1989-06-20",8.1
3093 | "1989-06-21",6.6
3094 | "1989-06-22",5.0
3095 | "1989-06-23",4.7
3096 | "1989-06-24",5.3
3097 | "1989-06-25",4.5
3098 | "1989-06-26",2.3
3099 | "1989-06-27",1.4
3100 | "1989-06-28",0.5
3101 | "1989-06-29",2.4
3102 | "1989-06-30",8.0
3103 | "1989-07-01",6.0
3104 | "1989-07-02",7.1
3105 | "1989-07-03",9.7
3106 | "1989-07-04",6.9
3107 | "1989-07-05",5.3
3108 | "1989-07-06",7.0
3109 | "1989-07-07",6.2
3110 | "1989-07-08",7.0
3111 | "1989-07-09",9.7
3112 | "1989-07-10",8.0
3113 | "1989-07-11",8.5
3114 | "1989-07-12",7.1
3115 | "1989-07-13",7.5
3116 | "1989-07-14",3.3
3117 | "1989-07-15",1.8
3118 | "1989-07-16",2.6
3119 | "1989-07-17",5.3
3120 | "1989-07-18",5.8
3121 | "1989-07-19",5.8
3122 | "1989-07-20",7.2
3123 | "1989-07-21",5.3
3124 | "1989-07-22",1.6
3125 | "1989-07-23",3.1
3126 | "1989-07-24",5.3
3127 | "1989-07-25",7.7
3128 | "1989-07-26",4.2
3129 | "1989-07-27",5.5
3130 | "1989-07-28",9.0
3131 | "1989-07-29",11.2
3132 | "1989-07-30",8.0
3133 | "1989-07-31",7.6
3134 | "1989-08-01",3.7
3135 | "1989-08-02",7.5
3136 | "1989-08-03",8.1
3137 | "1989-08-04",8.4
3138 | "1989-08-05",7.1
3139 | "1989-08-06",7.6
3140 | "1989-08-07",7.6
3141 | "1989-08-08",5.6
3142 | "1989-08-09",7.0
3143 | "1989-08-10",10.5
3144 | "1989-08-11",7.3
3145 | "1989-08-12",7.8
3146 | "1989-08-13",5.8
3147 | "1989-08-14",3.8
3148 | "1989-08-15",5.8
3149 | "1989-08-16",6.7
3150 | "1989-08-17",6.6
3151 | "1989-08-18",6.6
3152 | "1989-08-19",9.0
3153 | "1989-08-20",8.1
3154 | "1989-08-21",5.1
3155 | "1989-08-22",8.6
3156 | "1989-08-23",7.0
3157 | "1989-08-24",5.5
3158 | "1989-08-25",7.4
3159 | "1989-08-26",6.2
3160 | "1989-08-27",4.2
3161 | "1989-08-28",6.3
3162 | "1989-08-29",7.0
3163 | "1989-08-30",4.0
3164 | "1989-08-31",8.0
3165 | "1989-09-01",8.8
3166 | "1989-09-02",8.8
3167 | "1989-09-03",6.1
3168 | "1989-09-04",8.6
3169 | "1989-09-05",8.9
3170 | "1989-09-06",7.8
3171 | "1989-09-07",5.0
3172 | "1989-09-08",7.0
3173 | "1989-09-09",13.3
3174 | "1989-09-10",7.9
3175 | "1989-09-11",7.5
3176 | "1989-09-12",8.3
3177 | "1989-09-13",7.2
3178 | "1989-09-14",6.5
3179 | "1989-09-15",8.9
3180 | "1989-09-16",7.4
3181 | "1989-09-17",9.9
3182 | "1989-09-18",9.3
3183 | "1989-09-19",10.6
3184 | "1989-09-20",8.6
3185 | "1989-09-21",7.2
3186 | "1989-09-22",12.6
3187 | "1989-09-23",7.8
3188 | "1989-09-24",6.3
3189 | "1989-09-25",9.2
3190 | "1989-09-26",5.8
3191 | "1989-09-27",9.0
3192 | "1989-09-28",5.0
3193 | "1989-09-29",11.9
3194 | "1989-09-30",13.4
3195 | "1989-10-01",10.5
3196 | "1989-10-02",6.2
3197 | "1989-10-03",5.1
3198 | "1989-10-04",9.5
3199 | "1989-10-05",11.7
3200 | "1989-10-06",9.2
3201 | "1989-10-07",7.3
3202 | "1989-10-08",9.7
3203 | "1989-10-09",9.4
3204 | "1989-10-10",10.0
3205 | "1989-10-11",10.9
3206 | "1989-10-12",11.0
3207 | "1989-10-13",10.9
3208 | "1989-10-14",8.0
3209 | "1989-10-15",11.2
3210 | "1989-10-16",7.5
3211 | "1989-10-17",7.2
3212 | "1989-10-18",13.2
3213 | "1989-10-19",12.9
3214 | "1989-10-20",9.4
3215 | "1989-10-21",10.2
3216 | "1989-10-22",9.5
3217 | "1989-10-23",12.4
3218 | "1989-10-24",10.2
3219 | "1989-10-25",13.4
3220 | "1989-10-26",11.6
3221 | "1989-10-27",8.0
3222 | "1989-10-28",9.0
3223 | "1989-10-29",9.3
3224 | "1989-10-30",13.5
3225 | "1989-10-31",8.0
3226 | "1989-11-01",8.1
3227 | "1989-11-02",10.0
3228 | "1989-11-03",8.5
3229 | "1989-11-04",12.5
3230 | "1989-11-05",15.0
3231 | "1989-11-06",13.3
3232 | "1989-11-07",11.0
3233 | "1989-11-08",11.9
3234 | "1989-11-09",8.3
3235 | "1989-11-10",9.7
3236 | "1989-11-11",11.3
3237 | "1989-11-12",12.5
3238 | "1989-11-13",9.4
3239 | "1989-11-14",11.4
3240 | "1989-11-15",13.2
3241 | "1989-11-16",13.8
3242 | "1989-11-17",16.0
3243 | "1989-11-18",10.9
3244 | "1989-11-19",11.9
3245 | "1989-11-20",12.4
3246 | "1989-11-21",13.2
3247 | "1989-11-22",15.5
3248 | "1989-11-23",21.6
3249 | "1989-11-24",14.9
3250 | "1989-11-25",14.4
3251 | "1989-11-26",12.9
3252 | "1989-11-27",13.1
3253 | "1989-11-28",14.0
3254 | "1989-11-29",17.9
3255 | "1989-11-30",17.7
3256 | "1989-12-01",16.3
3257 | "1989-12-02",18.3
3258 | "1989-12-03",13.7
3259 | "1989-12-04",13.3
3260 | "1989-12-05",10.6
3261 | "1989-12-06",14.1
3262 | "1989-12-07",16.0
3263 | "1989-12-08",16.5
3264 | "1989-12-09",14.1
3265 | "1989-12-10",18.7
3266 | "1989-12-11",16.2
3267 | "1989-12-12",14.8
3268 | "1989-12-13",12.6
3269 | "1989-12-14",10.4
3270 | "1989-12-15",12.2
3271 | "1989-12-16",12.6
3272 | "1989-12-17",12.1
3273 | "1989-12-18",17.3
3274 | "1989-12-19",16.4
3275 | "1989-12-20",12.6
3276 | "1989-12-21",12.3
3277 | "1989-12-22",11.8
3278 | "1989-12-23",12.0
3279 | "1989-12-24",12.7
3280 | "1989-12-25",16.4
3281 | "1989-12-26",16.0
3282 | "1989-12-27",13.3
3283 | "1989-12-28",11.7
3284 | "1989-12-29",10.4
3285 | "1989-12-30",14.4
3286 | "1989-12-31",12.7
3287 | "1990-01-01",14.8
3288 | "1990-01-02",13.3
3289 | "1990-01-03",15.6
3290 | "1990-01-04",14.5
3291 | "1990-01-05",14.3
3292 | "1990-01-06",15.3
3293 | "1990-01-07",16.4
3294 | "1990-01-08",14.8
3295 | "1990-01-09",17.4
3296 | "1990-01-10",18.8
3297 | "1990-01-11",22.1
3298 | "1990-01-12",19.0
3299 | "1990-01-13",15.5
3300 | "1990-01-14",15.8
3301 | "1990-01-15",14.7
3302 | "1990-01-16",10.7
3303 | "1990-01-17",11.5
3304 | "1990-01-18",15.0
3305 | "1990-01-19",14.5
3306 | "1990-01-20",14.5
3307 | "1990-01-21",13.3
3308 | "1990-01-22",14.3
3309 | "1990-01-23",14.3
3310 | "1990-01-24",20.5
3311 | "1990-01-25",15.0
3312 | "1990-01-26",17.1
3313 | "1990-01-27",16.9
3314 | "1990-01-28",16.9
3315 | "1990-01-29",13.6
3316 | "1990-01-30",16.4
3317 | "1990-01-31",16.1
3318 | "1990-02-01",12.0
3319 | "1990-02-02",12.2
3320 | "1990-02-03",14.8
3321 | "1990-02-04",14.8
3322 | "1990-02-05",14.4
3323 | "1990-02-06",12.9
3324 | "1990-02-07",13.4
3325 | "1990-02-08",15.9
3326 | "1990-02-09",16.1
3327 | "1990-02-10",17.6
3328 | "1990-02-11",15.6
3329 | "1990-02-12",15.0
3330 | "1990-02-13",13.0
3331 | "1990-02-14",14.1
3332 | "1990-02-15",17.3
3333 | "1990-02-16",15.7
3334 | "1990-02-17",18.6
3335 | "1990-02-18",12.7
3336 | "1990-02-19",14.0
3337 | "1990-02-20",13.7
3338 | "1990-02-21",16.3
3339 | "1990-02-22",20.0
3340 | "1990-02-23",17.0
3341 | "1990-02-24",15.2
3342 | "1990-02-25",16.5
3343 | "1990-02-26",16.5
3344 | "1990-02-27",17.3
3345 | "1990-02-28",19.1
3346 | "1990-03-01",19.3
3347 | "1990-03-02",17.3
3348 | "1990-03-03",19.0
3349 | "1990-03-04",19.8
3350 | "1990-03-05",19.3
3351 | "1990-03-06",17.2
3352 | "1990-03-07",14.2
3353 | "1990-03-08",10.3
3354 | "1990-03-09",13.0
3355 | "1990-03-10",15.3
3356 | "1990-03-11",15.0
3357 | "1990-03-12",12.1
3358 | "1990-03-13",9.2
3359 | "1990-03-14",11.0
3360 | "1990-03-15",15.0
3361 | "1990-03-16",11.6
3362 | "1990-03-17",11.6
3363 | "1990-03-18",15.1
3364 | "1990-03-19",15.0
3365 | "1990-03-20",13.6
3366 | "1990-03-21",12.5
3367 | "1990-03-22",14.3
3368 | "1990-03-23",16.0
3369 | "1990-03-24",17.4
3370 | "1990-03-25",16.9
3371 | "1990-03-26",18.0
3372 | "1990-03-27",20.6
3373 | "1990-03-28",14.2
3374 | "1990-03-29",10.9
3375 | "1990-03-30",11.9
3376 | "1990-03-31",13.3
3377 | "1990-04-01",15.3
3378 | "1990-04-02",14.7
3379 | "1990-04-03",11.0
3380 | "1990-04-04",12.2
3381 | "1990-04-05",14.2
3382 | "1990-04-06",17.0
3383 | "1990-04-07",15.8
3384 | "1990-04-08",15.2
3385 | "1990-04-09",15.1
3386 | "1990-04-10",14.7
3387 | "1990-04-11",18.5
3388 | "1990-04-12",16.4
3389 | "1990-04-13",18.4
3390 | "1990-04-14",15.1
3391 | "1990-04-15",9.9
3392 | "1990-04-16",10.2
3393 | "1990-04-17",12.6
3394 | "1990-04-18",13.2
3395 | "1990-04-19",11.5
3396 | "1990-04-20",13.8
3397 | "1990-04-21",14.5
3398 | "1990-04-22",14.7
3399 | "1990-04-23",11.2
3400 | "1990-04-24",12.7
3401 | "1990-04-25",13.7
3402 | "1990-04-26",11.5
3403 | "1990-04-27",10.4
3404 | "1990-04-28",8.9
3405 | "1990-04-29",11.1
3406 | "1990-04-30",9.5
3407 | "1990-05-01",13.0
3408 | "1990-05-02",13.9
3409 | "1990-05-03",12.6
3410 | "1990-05-04",14.3
3411 | "1990-05-05",16.0
3412 | "1990-05-06",13.3
3413 | "1990-05-07",7.0
3414 | "1990-05-08",4.9
3415 | "1990-05-09",6.9
3416 | "1990-05-10",13.7
3417 | "1990-05-11",10.6
3418 | "1990-05-12",12.3
3419 | "1990-05-13",11.1
3420 | "1990-05-14",10.2
3421 | "1990-05-15",9.5
3422 | "1990-05-16",8.9
3423 | "1990-05-17",13.4
3424 | "1990-05-18",9.1
3425 | "1990-05-19",9.4
3426 | "1990-05-20",8.7
3427 | "1990-05-21",5.8
3428 | "1990-05-22",4.5
3429 | "1990-05-23",7.2
3430 | "1990-05-24",10.0
3431 | "1990-05-25",10.5
3432 | "1990-05-26",10.7
3433 | "1990-05-27",8.2
3434 | "1990-05-28",6.1
3435 | "1990-05-29",4.5
3436 | "1990-05-30",6.1
3437 | "1990-05-31",9.8
3438 | "1990-06-01",9.7
3439 | "1990-06-02",8.2
3440 | "1990-06-03",8.4
3441 | "1990-06-04",8.5
3442 | "1990-06-05",10.4
3443 | "1990-06-06",6.8
3444 | "1990-06-07",6.0
3445 | "1990-06-08",6.6
3446 | "1990-06-09",7.8
3447 | "1990-06-10",10.3
3448 | "1990-06-11",7.2
3449 | "1990-06-12",7.4
3450 | "1990-06-13",11.4
3451 | "1990-06-14",5.4
3452 | "1990-06-15",4.4
3453 | "1990-06-16",6.4
3454 | "1990-06-17",9.3
3455 | "1990-06-18",7.7
3456 | "1990-06-19",8.1
3457 | "1990-06-20",8.3
3458 | "1990-06-21",9.1
3459 | "1990-06-22",7.7
3460 | "1990-06-23",10.6
3461 | "1990-06-24",8.2
3462 | "1990-06-25",7.9
3463 | "1990-06-26",5.2
3464 | "1990-06-27",5.9
3465 | "1990-06-28",3.7
3466 | "1990-06-29",5.6
3467 | "1990-06-30",9.4
3468 | "1990-07-01",7.4
3469 | "1990-07-02",7.3
3470 | "1990-07-03",7.7
3471 | "1990-07-04",7.7
3472 | "1990-07-05",9.3
3473 | "1990-07-06",4.4
3474 | "1990-07-07",5.7
3475 | "1990-07-08",10.2
3476 | "1990-07-09",10.2
3477 | "1990-07-10",9.3
3478 | "1990-07-11",5.4
3479 | "1990-07-12",5.0
3480 | "1990-07-13",7.6
3481 | "1990-07-14",9.6
3482 | "1990-07-15",10.4
3483 | "1990-07-16",11.2
3484 | "1990-07-17",9.1
3485 | "1990-07-18",11.2
3486 | "1990-07-19",6.8
3487 | "1990-07-20",8.3
3488 | "1990-07-21",9.7
3489 | "1990-07-22",9.6
3490 | "1990-07-23",9.8
3491 | "1990-07-24",10.8
3492 | "1990-07-25",9.2
3493 | "1990-07-26",6.5
3494 | "1990-07-27",8.1
3495 | "1990-07-28",7.3
3496 | "1990-07-29",7.9
3497 | "1990-07-30",6.0
3498 | "1990-07-31",5.0
3499 | "1990-08-01",6.8
3500 | "1990-08-02",9.8
3501 | "1990-08-03",5.7
3502 | "1990-08-04",8.6
3503 | "1990-08-05",10.6
3504 | "1990-08-06",7.8
3505 | "1990-08-07",7.7
3506 | "1990-08-08",8.6
3507 | "1990-08-09",6.5
3508 | "1990-08-10",6.9
3509 | "1990-08-11",6.4
3510 | "1990-08-12",8.5
3511 | "1990-08-13",7.8
3512 | "1990-08-14",9.3
3513 | "1990-08-15",8.4
3514 | "1990-08-16",7.8
3515 | "1990-08-17",7.4
3516 | "1990-08-18",7.7
3517 | "1990-08-19",8.9
3518 | "1990-08-20",9.7
3519 | "1990-08-21",9.9
3520 | "1990-08-22",6.1
3521 | "1990-08-23",6.6
3522 | "1990-08-24",7.6
3523 | "1990-08-25",7.4
3524 | "1990-08-26",8.0
3525 | "1990-08-27",2.1
3526 | "1990-08-28",5.9
3527 | "1990-08-29",11.6
3528 | "1990-08-30",8.6
3529 | "1990-08-31",7.9
3530 | "1990-09-01",6.0
3531 | "1990-09-02",9.5
3532 | "1990-09-03",8.6
3533 | "1990-09-04",7.6
3534 | "1990-09-05",10.4
3535 | "1990-09-06",10.3
3536 | "1990-09-07",7.5
3537 | "1990-09-08",3.0
3538 | "1990-09-09",5.3
3539 | "1990-09-10",10.5
3540 | "1990-09-11",14.6
3541 | "1990-09-12",12.6
3542 | "1990-09-13",9.8
3543 | "1990-09-14",7.2
3544 | "1990-09-15",10.1
3545 | "1990-09-16",10.4
3546 | "1990-09-17",3.7
3547 | "1990-09-18",7.3
3548 | "1990-09-19",11.6
3549 | "1990-09-20",16.3
3550 | "1990-09-21",9.6
3551 | "1990-09-22",6.8
3552 | "1990-09-23",5.2
3553 | "1990-09-24",10.6
3554 | "1990-09-25",16.3
3555 | "1990-09-26",9.8
3556 | "1990-09-27",4.6
3557 | "1990-09-28",11.1
3558 | "1990-09-29",8.7
3559 | "1990-09-30",10.0
3560 | "1990-10-01",11.3
3561 | "1990-10-02",10.5
3562 | "1990-10-03",9.9
3563 | "1990-10-04",11.0
3564 | "1990-10-05",14.0
3565 | "1990-10-06",9.2
3566 | "1990-10-07",9.8
3567 | "1990-10-08",6.0
3568 | "1990-10-09",9.8
3569 | "1990-10-10",9.2
3570 | "1990-10-11",11.8
3571 | "1990-10-12",10.3
3572 | "1990-10-13",7.5
3573 | "1990-10-14",7.7
3574 | "1990-10-15",15.8
3575 | "1990-10-16",14.6
3576 | "1990-10-17",10.5
3577 | "1990-10-18",11.3
3578 | "1990-10-19",10.9
3579 | "1990-10-20",6.4
3580 | "1990-10-21",10.9
3581 | "1990-10-22",9.0
3582 | "1990-10-23",10.9
3583 | "1990-10-24",12.4
3584 | "1990-10-25",11.6
3585 | "1990-10-26",13.3
3586 | "1990-10-27",14.4
3587 | "1990-10-28",18.4
3588 | "1990-10-29",13.6
3589 | "1990-10-30",14.9
3590 | "1990-10-31",14.8
3591 | "1990-11-01",15.4
3592 | "1990-11-02",11.8
3593 | "1990-11-03",13.0
3594 | "1990-11-04",11.1
3595 | "1990-11-05",12.5
3596 | "1990-11-06",18.3
3597 | "1990-11-07",19.2
3598 | "1990-11-08",15.4
3599 | "1990-11-09",13.1
3600 | "1990-11-10",11.5
3601 | "1990-11-11",8.6
3602 | "1990-11-12",12.6
3603 | "1990-11-13",13.8
3604 | "1990-11-14",14.6
3605 | "1990-11-15",13.2
3606 | "1990-11-16",12.3
3607 | "1990-11-17",8.8
3608 | "1990-11-18",10.7
3609 | "1990-11-19",9.9
3610 | "1990-11-20",8.3
3611 | "1990-11-21",15.0
3612 | "1990-11-22",12.2
3613 | "1990-11-23",10.5
3614 | "1990-11-24",11.1
3615 | "1990-11-25",13.0
3616 | "1990-11-26",12.9
3617 | "1990-11-27",8.8
3618 | "1990-11-28",14.7
3619 | "1990-11-29",14.7
3620 | "1990-11-30",12.7
3621 | "1990-12-01",13.3
3622 | "1990-12-02",13.2
3623 | "1990-12-03",16.2
3624 | "1990-12-04",17.3
3625 | "1990-12-05",20.5
3626 | "1990-12-06",20.2
3627 | "1990-12-07",19.4
3628 | "1990-12-08",15.5
3629 | "1990-12-09",14.1
3630 | "1990-12-10",11.0
3631 | "1990-12-11",11.1
3632 | "1990-12-12",14.0
3633 | "1990-12-13",11.4
3634 | "1990-12-14",12.5
3635 | "1990-12-15",13.4
3636 | "1990-12-16",13.6
3637 | "1990-12-17",13.9
3638 | "1990-12-18",17.2
3639 | "1990-12-19",14.7
3640 | "1990-12-20",15.4
3641 | "1990-12-21",13.1
3642 | "1990-12-22",13.2
3643 | "1990-12-23",13.9
3644 | "1990-12-24",10.0
3645 | "1990-12-25",12.9
3646 | "1990-12-26",14.6
3647 | "1990-12-27",14.0
3648 | "1990-12-28",13.6
3649 | "1990-12-29",13.5
3650 | "1990-12-30",15.7
3651 | "1990-12-31",13.0
--------------------------------------------------------------------------------
/data/flightdata-head-hebing.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/data/flightdata-head-hebing.xlsx
--------------------------------------------------------------------------------
/data/flightdata-hebing.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/data/flightdata-hebing.xlsx
--------------------------------------------------------------------------------
/data/score.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/data/score.xlsx
--------------------------------------------------------------------------------
/data/score1.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/data/score1.xlsx
--------------------------------------------------------------------------------
/data/学生视力表.xls:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/data/学生视力表.xls
--------------------------------------------------------------------------------
/data/销售统计表2.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/data/销售统计表2.xlsx
--------------------------------------------------------------------------------
/fonts/arialuni.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/fonts/arialuni.ttf
--------------------------------------------------------------------------------
/fonts/fireflysung.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/fonts/fireflysung.ttf
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | import gradio as gr
2 | from llama_index.core.agent.workflow import AgentWorkflow, ToolCallResult, AgentOutput, ToolCall
3 | from llama_index.core.memory import ChatMemoryBuffer
4 | from llama_index.core.storage.chat_store import SimpleChatStore
5 | from llama_index.core.workflow import Context
6 |
7 | from agents.markdown_table_agent import MarkdownTableAgent
8 | from agents.pandasql_agent import SqlTableAgent
9 | from agents.router_agent import RouterAgent
10 | from core.excel_table import ExcelTable
11 | from utils.export_tools import export_to_markdown
12 | from core.openai_like_llm import OpenAILikeLLM, OPENAI_MODEL_NAME, OPENAI_API_BASE, OPENAI_API_KEY
13 | from tools.table_tool import get_all_table_names
14 | from view.view import get_loading_view
15 |
16 | # logging.basicConfig(level="DEBUG")
17 |
18 |
19 | llm = OpenAILikeLLM(model=OPENAI_MODEL_NAME, api_base=OPENAI_API_BASE, api_key=OPENAI_API_KEY)
20 | llm_function = OpenAILikeLLM(model=OPENAI_MODEL_NAME, api_base=OPENAI_API_BASE, api_key=OPENAI_API_KEY)
21 |
22 | # 是否上传了文档
23 | is_uploaded = False
24 | excel_table = None
25 |
26 | chat_store = SimpleChatStore()
27 | chat_memory = ChatMemoryBuffer.from_defaults(
28 | token_limit=8000,
29 | chat_store=chat_store,
30 | chat_store_key="user",
31 | )
32 |
33 |
34 | async def analyze_question(question):
35 | global is_uploaded
36 | global excel_table
37 | if not is_uploaded:
38 | gr.Warning("请先上传Excel文件")
39 | yield "请先上传Excel文件", ""
40 | return
41 |
42 | router_agent = RouterAgent(llm_function)
43 | markdown_table_agent = MarkdownTableAgent(llm)
44 | sql_agent = SqlTableAgent(llm)
45 | agent_workflow = AgentWorkflow(
46 | agents=[router_agent.get_agent(), markdown_table_agent.get_agent(), sql_agent.get_agent()],
47 | root_agent=router_agent.get_agent_name(),
48 | )
49 |
50 | ctx = Context(agent_workflow)
51 | await ctx.set("table", excel_table)
52 | # 当前工具调用次数
53 | call_count = 0
54 |
55 | handler = agent_workflow.run(
56 | user_msg=f'''
57 | ### 用户问题
58 | {question}
59 | ''',
60 | memory=chat_memory,
61 | ctx=ctx
62 | )
63 |
64 | current_agent = None
65 | final_output = ""
66 | router_output = ""
67 | thinking_msg_output = "## 任务执行\n"
68 |
69 | async for event in handler.stream_events():
70 | if (
71 | hasattr(event, "current_agent_name")
72 | and event.current_agent_name != current_agent
73 | ):
74 | current_agent = event.current_agent_name
75 | thinking_msg = f"\n{'=' * 50}\n🤖 Agent: {current_agent}\n{'=' * 50}\n"
76 | print(thinking_msg)
77 | thinking_msg_output += f"#### 🤖执行agent: {current_agent}\n"
78 | yield thinking_msg_output, final_output
79 | elif isinstance(event, AgentOutput):
80 | if event.response.content:
81 | thinking_msg = f"📤 Output: {event.response.content}"
82 | print(thinking_msg)
83 | if current_agent == "sql_table_agent" or current_agent == "markdown_table_agent":
84 | final_output += event.response.content
85 | else:
86 | router_output += event.response.content
87 | if event.tool_calls:
88 | tool_msg = f"🛠️ Planning to use tools: {[call.tool_name for call in event.tool_calls]}"
89 | thinking_msg_output += f"🛠️ Planning to use tools: {[call.tool_name for call in event.tool_calls]}\n"
90 | print(tool_msg)
91 | yield thinking_msg_output, final_output
92 | elif isinstance(event, ToolCallResult):
93 | tool_result_msg = (
94 | f"🔧 Tool Result ({event.tool_name}):\n"
95 | f" Arguments: {event.tool_kwargs}\n"
96 | f" Output: {event.tool_output}"
97 | )
98 | print(tool_result_msg)
99 | thinking_msg_output += f"#### 🔧工具调用结束: {event.tool_name}\n"
100 | yield thinking_msg_output, final_output
101 | elif isinstance(event, ToolCall):
102 | if call_count > 25:
103 | thinking_msg_output += f"##### 🛑 出现了点异常,达到最大调用次数,停止调用工具 \n"
104 | yield thinking_msg_output, final_output
105 | return
106 | tool_call_msg = (
107 | f"🔨 Calling Tool: {event.tool_name}\n"
108 | f" With arguments: {event.tool_kwargs}"
109 | )
110 | print(tool_call_msg)
111 | thinking_msg_output += f"#### 🔧工具调用开始: {event.tool_name}\n"
112 | yield thinking_msg_output, final_output
113 | if final_output == "":
114 | yield "", router_output
115 | else:
116 | yield "", final_output
117 |
118 |
119 | async def start_async_analysis(question):
120 | yield gr.update(visible=True), "数据处理中", gr.update(visible=True)
121 | async for thinking_output_str, result_str in analyze_question(question):
122 | yield gr.update(value=thinking_output_str), result_str, gr.update(visible=True)
123 | yield gr.update(visible=False), result_str, gr.update(visible=False)
124 |
125 |
126 | def load_excel(file):
127 | global is_uploaded
128 | global excel_table
129 |
130 | excel_table = ExcelTable(file)
131 | print(excel_table.get_markdown_head())
132 |
133 | print(
134 | f"成功加载 {len(excel_table.get_sheets_db())} 个工作表: {', '.join(get_all_table_names(excel_table.get_sheets_db()))}")
135 |
136 | is_uploaded = True
137 |
138 | return "Excel 文件已成功加载。"
139 |
140 |
141 | with gr.Blocks() as excel_view:
142 | gr.Markdown("### Excel 表格分析系统")
143 | with gr.Row():
144 | with gr.Column():
145 | file_input = gr.File(label="选择 Excel 文件")
146 | load_output = gr.Textbox(label="文件加载结果")
147 | question_input = gr.Textbox(label="请输入问题", placeholder="输入你的问题")
148 |
149 | with gr.Column():
150 | # 加一个模块现实实时思考产生的内容
151 | thinking_output = gr.Markdown(label="思考过程")
152 | answer_output = gr.Markdown(label="分析结果")
153 | # Replace Spinner with a hidden textbox to simulate loading state
154 | loading_indicator = gr.Textbox(visible=False, value="Loading...")
155 | # 添加 文件 导出按钮
156 | export_button = gr.Button("导出为 Markdown")
157 | export_button.click(
158 | fn=export_to_markdown,
159 | inputs=answer_output,
160 | outputs=gr.File(label="导出的 Markdown 文件")
161 | )
162 |
163 | loading_message = get_loading_view()
164 | # gr.processing_utils.send_custom_event(showLoading_js) # 显示加载弹框
165 | file_input.upload(load_excel, inputs=file_input, outputs=load_output)
166 | # Modify the submit call to add loading state control
167 | question_input.submit(
168 | fn=start_async_analysis,
169 | inputs=question_input,
170 | outputs=[thinking_output, answer_output, loading_message],
171 | queue=True
172 | )
173 |
174 | if __name__ == "__main__":
175 | excel_view.launch()
176 |
--------------------------------------------------------------------------------
/output/analysis_result.md:
--------------------------------------------------------------------------------
1 | 你好!请提供一下你需要我分析的表格,我会根据内容判断表格的类型,并给出充分的理由。如果需要进一步处理,我会将任务转交给合适的助手。请上传你的表格文件或者提供数据,我将使用`get_table_head_data_to_markdown`工具来获取和分析数据。
--------------------------------------------------------------------------------
/output/analysis_result.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/output/analysis_result.pdf
--------------------------------------------------------------------------------
/output/analysis_result_test.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/output/analysis_result_test.pdf
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | fpdf2==2.8.2
2 | gradio==5.25.2
3 | llama_index==0.12.31
4 | mistletoe==1.4.0
5 | openpyxl==3.1.5
6 | pandas==2.2.3
7 | pandasql==0.7.3
8 | quickchart.io==2.0.0
9 | tabulate==0.9.0
10 |
--------------------------------------------------------------------------------
/test/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/test/__init__.py
--------------------------------------------------------------------------------
/test/analyze_with_llm_test.py:
--------------------------------------------------------------------------------
1 | from core.excel_table import ExcelTable
2 | from tools.analyze_tool import analyze_with_llm
3 |
4 | if __name__ == '__main__':
5 | # 定义文件路径
6 | file_path = "../data/学生视力表.xls"
7 | excel_table = ExcelTable("../data/学生视力表.xls", merge_cells=False)
8 | result = analyze_with_llm(excel_table.get_markdown(), "请分析一下数据并给我报告")
9 | print(result)
10 |
--------------------------------------------------------------------------------
/test/test.py:
--------------------------------------------------------------------------------
1 | import logging
2 |
3 | from llama_index.core.agent.workflow import FunctionAgent, AgentWorkflow, ToolCallResult, AgentOutput, ToolCall
4 | from llama_index.core.memory import ChatMemoryBuffer
5 | from llama_index.core.storage.chat_store import SimpleChatStore
6 |
7 | from core.excel_table import ExcelTable
8 | from core.openai_like_llm import OpenAILikeLLM, OPENAI_MODEL_NAME, OPENAI_API_BASE, OPENAI_API_KEY
9 | from tools.quickchart_tool import generate_bar_chart, generate_pie_chart
10 |
11 | logging.basicConfig(level="DEBUG")
12 |
13 |
14 | llm = OpenAILikeLLM(model=OPENAI_MODEL_NAME, api_base=OPENAI_API_BASE, api_key=OPENAI_API_KEY)
15 |
16 | # 是否上传了文档
17 | is_uploaded = False
18 |
19 | chat_store = SimpleChatStore()
20 | chat_memory = ChatMemoryBuffer.from_defaults(
21 | token_limit=8000,
22 | chat_store=chat_store,
23 | chat_store_key="user",
24 | )
25 |
26 | # 分析表格干什么的代理
27 | analyze_agent = FunctionAgent(
28 | name="analyze_agent",
29 | llm=llm,
30 | description="你是一个有用的助手。",
31 | system_prompt=(
32 | """
33 | # 表格分析助手
34 | ## 功能描述
35 | 你是一个专业的表格统计分析建议生成助手,也是数据洞察助手,擅长输出图文并茂的数据报告。
36 |
37 | ## 工具使用说明
38 | # 表格分析助手
39 | ## 功能描述
40 | 你是一个专业的表格统计分析建议生成助手,也是数据洞察助手,擅长输出数据报告。
41 |
42 | ## 工具使用说明
43 | - generate_bar_chart 工具用于生成条形图,generate_pie_chart 工具用于生成饼图,返回图片url请你自己插入正文
44 | - 对于分析的数据你应该考虑调用图形工具去生成图片并插入正文
45 | - 请你一定要使用图片工具去生成图片,不要自己乱生成。
46 |
47 | ## 注意事项
48 | - 你应该正确的考虑使用什么图形化工具去生成图片(条形图好还是饼图好),不要一个劲的只使用一种。
49 | - 所有的数据和图表不能自己乱编造。
50 |
51 | # 输出要求
52 | - 仅回答与表格相关的问题,对于表格无关的问题请直接拒绝回答。
53 | - 依据表格中的数据,生成有针对性的统计分析建议。
54 | - 针对每个数据如果能够生成条形图应该都去调用一次工具去生成图片
55 | - 输出数据报告用Markdown格式,要图文并茂。
56 | - 不能无中生有乱造数据和图片。
57 | """
58 |
59 | ),
60 | tools=[generate_bar_chart, generate_pie_chart],
61 | memory=chat_memory,
62 | verbose=True
63 | )
64 |
65 |
66 | async def run_agent(user_question, markdown):
67 | agent_workflow = AgentWorkflow(
68 | agents=[analyze_agent],
69 | root_agent=analyze_agent.name,
70 | )
71 |
72 | handler = agent_workflow.run(
73 | user_msg=f'''
74 | ### 用户问题
75 | {user_question}
76 |
77 | ### 表格数据
78 | {markdown}
79 | ''',
80 | memory=chat_memory
81 | )
82 |
83 | current_agent = None
84 | final_output = ""
85 | router_output = ""
86 | async for event in handler.stream_events():
87 | if (
88 | hasattr(event, "current_agent_name")
89 | and event.current_agent_name != current_agent
90 | ):
91 | current_agent = event.current_agent_name
92 | print(f"\n{'=' * 50}")
93 | print(f"🤖 Agent: {current_agent}")
94 | print(f"{'=' * 50}\n")
95 | elif isinstance(event, AgentOutput):
96 | if event.response.content:
97 | print("📤 Output:", event.response.content)
98 | final_output += event.response.content
99 | else:
100 | router_output += event.response.content
101 | if event.tool_calls:
102 | print(
103 | "🛠️ Planning to use tools:",
104 | [call.tool_name for call in event.tool_calls],
105 | )
106 | elif isinstance(event, ToolCallResult):
107 | print(f"🔧 Tool Result ({event.tool_name}):")
108 | print(f" Arguments: {event.tool_kwargs}")
109 | print(f" Output: {event.tool_output}")
110 | elif isinstance(event, ToolCall):
111 | print(f"🔨 Calling Tool: {event.tool_name}")
112 | print(f" With arguments: {event.tool_kwargs}")
113 |
114 | print(f"最终结果:{final_output}")
115 |
116 |
117 | if __name__ == '__main__':
118 | # 定义文件路径
119 | file_path = "../data/score.xlsx"
120 |
121 | # 判断文件扩展名
122 | excel_table = ExcelTable(file_path, merge_cells=False)
123 | markdown_text = excel_table.show_markdown()
124 | question = "请分析学生视力变化并且给我一份报告"
125 |
126 | # asyncio.run(run_agent(question, markdown_text))
127 |
--------------------------------------------------------------------------------
/test/test_extract_table_names.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/23 13:31
5 | * @FileName: test_extract_table_names.py
6 | **************************************
7 | """
8 | from pandasql.sqldf import extract_table_names
9 |
10 | result = extract_table_names('SELECT MAX(`Temp`) FROM `df` LIMIT 20;')
11 | print(result)
12 |
--------------------------------------------------------------------------------
/test/test_re_parse_table_head.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/21 16:13
5 | * @FileName: test_re_parse_table_head.py
6 | **************************************
7 | """
8 | from core.excel_table import ExcelTable
9 | from tools.analyze_tool import analyze_with_llm
10 |
11 | if __name__ == '__main__':
12 | # 定义文件路径
13 | file_path = "../data/学生视力表.xls"
14 | excel_table = ExcelTable("../data/flightdata-head-hebing.xlsx", merge_cells=False)
15 | sheets_db = excel_table.get_sheets_db()
16 | df = sheets_db["flightdata"]
17 | print(df.head())
18 | # 重新定位表头
19 | row_index = 0
20 | print("位置0的数据:", df.iloc[0]) # 确认是否是Excel第一行(无效表头)
21 | header = df.iloc[row_index]
22 | print(f"header:{header}")
23 | df = df.iloc[row_index + 1:]
24 | # 设置新的表头
25 | df.columns = header
26 | df = df.reset_index(drop=True)
27 | sheets_db["flightdata"] = df
28 | print(f"重新定位表头成功,表名:flightdata, 新表头:{df.columns.tolist()}")
29 | print(df.head())
30 |
31 |
--------------------------------------------------------------------------------
/test/test_router_agent.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/18 16:27
5 | * @FileName: test_router_agent.py
6 | **************************************
7 | """
8 | import asyncio
9 |
10 | from llama_index.core.agent.workflow import AgentWorkflow, ToolCallResult, AgentOutput, ToolCall
11 | from llama_index.core.memory import ChatMemoryBuffer
12 | from llama_index.core.storage.chat_store import SimpleChatStore
13 |
14 | from agents.router_agent import RouterAgent
15 | from core.excel_table import ExcelTable
16 | from core.openai_like_llm import OpenAILikeLLM, OPENAI_MODEL_NAME, OPENAI_API_BASE, OPENAI_API_KEY
17 |
18 | # logging.basicConfig(level="DEBUG")
19 |
20 |
21 | llm = OpenAILikeLLM(model=OPENAI_MODEL_NAME, api_base=OPENAI_API_BASE, api_key=OPENAI_API_KEY)
22 |
23 | # 是否上传了文档
24 | is_uploaded = False
25 |
26 | chat_store = SimpleChatStore()
27 | chat_memory = ChatMemoryBuffer.from_defaults(
28 | token_limit=8000,
29 | chat_store=chat_store,
30 | chat_store_key="user",
31 | )
32 |
33 |
34 | async def run_agent(user_question, markdown):
35 | router_agent = RouterAgent(llm)
36 | agent_workflow = AgentWorkflow(
37 | agents=[router_agent.get_agent()],
38 | root_agent=router_agent.get_agent_name()
39 | )
40 |
41 | handler = agent_workflow.run(
42 | user_msg=f'''
43 | ### 用户问题
44 | {user_question}
45 |
46 | ### 表格数据
47 | {markdown}
48 | ''',
49 | memory=chat_memory
50 | )
51 |
52 | current_agent = None
53 | final_output = ""
54 | async for event in handler.stream_events():
55 | if (
56 | hasattr(event, "current_agent_name")
57 | and event.current_agent_name != current_agent
58 | ):
59 | current_agent = event.current_agent_name
60 | print(f"\n{'=' * 50}")
61 | print(f"🤖 Agent: {current_agent}")
62 | print(f"{'=' * 50}\n")
63 | elif isinstance(event, AgentOutput):
64 | if event.response.content:
65 | print("📤 Output:", event.response.content)
66 | final_output += event.response.content
67 | if event.tool_calls:
68 | print(
69 | "🛠️ Planning to use tools:",
70 | [call.tool_name for call in event.tool_calls],
71 | )
72 | elif isinstance(event, ToolCallResult):
73 | print(f"🔧 Tool Result ({event.tool_name}):")
74 | print(f" Arguments: {event.tool_kwargs}")
75 | print(f" Output: {event.tool_output}")
76 | elif isinstance(event, ToolCall):
77 | print(f"🔨 Calling Tool: {event.tool_name}")
78 | print(f" With arguments: {event.tool_kwargs}")
79 |
80 | print(f"最终结果:{final_output}")
81 |
82 |
83 | if __name__ == '__main__':
84 | # 定义文件路径
85 | file_path = "../data/SuperStoreUS-2015.xlsx"
86 |
87 | # 判断文件扩展名
88 | excel_table = ExcelTable(file_path, merge_cells=False)
89 | markdown_text = excel_table.get_markdown_head()
90 | print(markdown_text)
91 | question = "这个表格是什么类型的"
92 |
93 | asyncio.run(run_agent(question, markdown_text))
94 |
--------------------------------------------------------------------------------
/tools/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/11 13:57
5 | * @FileName: __init__.py.py
6 | **************************************
7 | """
8 |
--------------------------------------------------------------------------------
/tools/analyze_tool.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | import openai
4 | from llama_index.core.workflow import Context
5 |
6 | ANALYZE_LLM_MODEL_NAME = os.getenv("ANALYZE_LLM_MODEL_NAME")
7 |
8 |
9 | async def analyze_table(ctx: Context, user_question: str) -> str:
10 | """
11 | 表格数据分析工具
12 | 输入数据:
13 | :param user_question: 结合历史聊天记录总结出用户当前的实际问题
14 | :return: 分析结果
15 | """
16 | excel_table = await ctx.get("table")
17 | # 修正:使用 len() 函数获取字符串长度
18 | if len(excel_table.get_markdown()) > 3000:
19 | return "非正规表格数据过大(大于3000),本工具不支持分析,请重新上传表格"
20 | return analyze_with_llm(excel_table.get_markdown(), user_question)
21 |
22 |
23 | # 利用openai的接口去分析表格数据
24 | def analyze_with_llm(table_data: str, user_question: str) -> str:
25 | llm = openai.OpenAI(
26 | base_url=os.getenv("OPENAI_API_BASE"),
27 | api_key=os.getenv("OPENAI_API_KEY")
28 | )
29 | response = llm.chat.completions.create(
30 | model=ANALYZE_LLM_MODEL_NAME,
31 | messages=[
32 | {
33 | "role": "system",
34 | "content": "你是一个专业的表格统计分析建议生成助手,也是数据洞察助手,擅长输出数据报告,分析结果可以使用表格或者别的形式返回。"
35 | },
36 | {
37 | "role": "user",
38 | "content": f"""
39 | ## 注意事项
40 | - 注意即使用户问题中包含要图片,你也没有生成图片和图表的权限,你输出的文字报告我会再拿其它工具去生成图片(包括图片链接),所以你不能生成图片,而是报告中的数据尽量给我一些易于去生成图表的数据即可。
41 |
42 | ## 要求
43 | - 充分考虑文件布局,与实际表格内容
44 | - 按照markdown表格格式去理解表格数据
45 | - 要有好的记忆能力
46 | - 不要胡编乱造
47 |
48 | ## 表格数据如下
49 | {table_data}
50 | ## 用户问题如下
51 | {user_question}
52 | """
53 | }
54 | ]
55 | )
56 | return response.choices[0].message.content
57 |
--------------------------------------------------------------------------------
/tools/quickchart_tool.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/11 13:58
5 | * @FileName: quickchart.py
6 | **************************************
7 | """
8 | from typing import List, Dict
9 | from quickchart import QuickChart
10 |
11 |
12 | # 生成图片的公共函数
13 | def generate_chart(data) -> str:
14 | qc = QuickChart()
15 | qc.width = 500
16 | qc.height = 300
17 | qc.device_pixel_ratio = 2.0
18 | qc.config = data
19 | return qc.get_url()
20 |
21 |
22 | # 条形图工具
23 | def generate_bar_chart(labels: List[str], datasets: List[Dict[str, object]]) -> str:
24 | """
25 | 生成条形图工具
26 | 输入数据:
27 | :param labels: 数组
28 | :param datasets: 数组
29 | :return: url
30 |
31 | 输入数据样例:
32 | labels代表x轴,datasets代表y轴
33 | labels: ['January', 'February', 'March', 'April', 'May'],
34 | datasets: [
35 | { label: 'Dogs', data: [50, 60, 70, 180, 190] },
36 | { label: 'Cats', data: [100, 200, 300, 400, 500] },
37 | ],
38 | """
39 | char_data = {
40 | "type": "bar",
41 | "data": {
42 | "labels": labels,
43 | "datasets": datasets
44 | }
45 | }
46 | return generate_chart(char_data)
47 |
48 |
49 | """
50 | {
51 | type: 'pie',
52 | data: {
53 | labels: ['January', 'February', 'March', 'April', 'May'],
54 | datasets: [{
55 | data: [50, 60, 70, 180, 190]
56 | }]
57 | }
58 | }
59 | """
60 |
61 |
62 | # 饼图工具
63 | def generate_pie_chart(labels: List[str], datasets: List[Dict[str, object]]) -> str:
64 | """
65 | 生成饼图工具(只支持一组标签和一组对应的数据)
66 | 输入数据:
67 | :param labels: 数组
68 | :param datasets: 数组
69 | :return: url
70 | 输入数据样例:
71 | labels代表数据标签,datasets代表数据(饼图一般只有一个数据集)
72 | labels: ['January', 'February', 'March', 'April', 'May'],
73 | datasets: [
74 | { data: [50, 60, 70, 180, 190] },
75 | ],
76 | """
77 | char_data = {
78 | "type": "pie",
79 | "data": {
80 | "labels": labels,
81 | "datasets": datasets
82 | }
83 | }
84 | return generate_chart(char_data)
85 |
--------------------------------------------------------------------------------
/tools/table_tool.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/15 14:39
5 | * @FileName: excel_tool.py
6 | **************************************
7 | """
8 | import io
9 |
10 | from llama_index.core.workflow import Context
11 | from pandasql import sqldf
12 |
13 |
14 | def is_regular_table(df):
15 | markdown_text = df.to_markdown()
16 | print(markdown_text)
17 | if df.empty:
18 | print(f"包含空表")
19 | return False
20 |
21 | # 取出第一行
22 | columns = df.columns.tolist()
23 | print(columns)
24 |
25 | # # 处理合并单元格
26 | # df = df.ffill()
27 |
28 | markdown_text = df.to_markdown()
29 | print(markdown_text)
30 |
31 | return True
32 |
33 |
34 | # 合并单元格的函数
35 | def merge_cells(df):
36 | # 合并行
37 | df = df.ffill()
38 | return df
39 |
40 |
41 | def get_all_table_names(db):
42 | """获取所有已加载的表名(工作表名)"""
43 | return list(db.keys())
44 |
45 |
46 | def get_excel_description(df):
47 | buffer = io.StringIO()
48 | df.info(buf=buffer)
49 | info_str = buffer.getvalue()
50 | buffer.close()
51 | return info_str
52 |
53 |
54 | def get_excel_info_head(db):
55 | description = ""
56 | # 获取表结构描述
57 | # 将字典中的 DataFrame 分配变量名(例如表名)
58 | for sheet_name, df in db.items():
59 | info_str = get_excel_description(df)
60 | head_str = df.head().to_csv(sep='\t', na_rep='nan')
61 | item_str = f"表格结构描述:\n表名:{sheet_name}\n{info_str}\n\n前几行数据(不是全部数据,数据应该单独执行sql查询,请勿直接用于计算最终结果,看看表头列名是不是不是第一行,如果不是你要清洗一下):\n{head_str}\n\n----------------\n\n"
62 | description += item_str
63 | return description
64 |
65 |
66 | # 测试执行表是否有问题
67 | def test_run_sql_queries(db):
68 | for sheet_name, df in db.items():
69 | try:
70 | print("开始测试表:", sheet_name)
71 | query = f"select * from {sheet_name} limit 1"
72 | sql_result = sqldf(query, db).to_csv(sep='\t', na_rep='nan')
73 | print(f"结束测试表:{sheet_name},结果:{sql_result}")
74 | except Exception as e:
75 | print(f"测试表:{sheet_name} 时出错: {e}")
76 | return False
77 | return True
78 |
79 |
80 | async def get_table_data_to_markdown(ctx: Context):
81 | """
82 | 获取表格信息与数据并返回结果,无需参数,返回表格数据和描述给智能体进行数据分析
83 | """
84 | excel_table = await ctx.get("table")
85 | return excel_table.get_markdown()
86 |
87 |
88 | async def get_table_head_data_to_markdown(ctx: Context):
89 | """
90 | 获取小部分表格信息与数据并返回结果,无需参数,返回表格数据和描述给智能体进行数据分析
91 | """
92 | excel_table = await ctx.get("table")
93 | return excel_table.get_markdown_head()
94 |
95 |
96 | async def run_sql_queries(ctx: Context, queries: list[str]):
97 | """
98 | 批量执行 SQL 查询并返回结果。
99 | 参数:
100 | queries (str): 要执行的 SQL 查询语句列表。
101 | 返回:
102 | 返回序列化的执行结果
103 | """
104 | excel_table = await ctx.get("table")
105 | sheets_db = excel_table.get_sheets_db()
106 | results = ""
107 | # 把sheets_db展开成局部变量locals()方便sqldf执行
108 | for sheet_name, df in sheets_db.items():
109 | locals()[sheet_name] = df
110 | for query in queries:
111 | try:
112 | print(f"执行 SQL 查询: {query}")
113 | sql_result = sqldf(query, sheets_db)
114 | sql_result_csv = sql_result.to_csv(sep='\t', na_rep='nan')
115 | # 行数过大就只返回前30行
116 | if len(sql_result) > 30:
117 | sql_result = sql_result[:30]
118 | sql_result_csv = sql_result.to_csv(sep='\t', na_rep='nan')
119 | results += f"query: {query}, error: 结果行数过大只返回30行, result: {sql_result_csv} \n\n----------"
120 | else:
121 | results += f"query: {query}, result: {sql_result_csv}\n\n----------"
122 | except Exception as e:
123 | print(f"执行 SQL 查询时出错: {e}\n\n 现在我再次给你表格信息 {get_excel_info_head(sheets_db)}")
124 | results += f"query: {query}, result: 执行 SQL 查询时出错。{e}\n\n----------"
125 | return results
126 |
127 |
128 | async def get_excel_info_tool(ctx: Context):
129 | """
130 | 获取表格结构和示例数据
131 | 返回:
132 | str: 获取表格结构和示例数据。
133 | """
134 | excel_table = await ctx.get("table")
135 | sheets_db = excel_table.get_sheets_db()
136 | """
137 | 获取表格结构和示例数据
138 | 返回:
139 | str: 获取表格结构和示例数据。
140 | """
141 | return get_excel_info_head(sheets_db)
142 |
143 |
144 | async def re_parse_table_head(ctx: Context, sheet_name: str, row_index: int):
145 | """
146 | 重新设置表头(行号请看最左边的序号)
147 | 参数:
148 | sheet_name (str): 表名(sheet_name)
149 | row_index (int): 范围0-N,重新把表头指向row_index作为有效表头所在的行
150 | """
151 | excel_table = await ctx.get("table")
152 | sheets_db = excel_table.get_sheets_db()
153 | if sheet_name in sheets_db:
154 | df = sheets_db[sheet_name]
155 | # 重新定位表头
156 | df.columns = df.iloc[row_index]
157 | df = df.iloc[row_index + 1:]
158 | df = df.reset_index(drop=True)
159 | sheets_db[sheet_name] = df
160 | excel_table.set_sheets_db(sheets_db)
161 | await ctx.set("table", excel_table)
162 | print(f"重新定位表头成功,表名:{sheet_name}, 新表头:{df.columns.tolist()}")
163 | return f"重新定位表头成功,表名:{sheet_name}, 新表头:{df.columns.tolist()}"
164 |
165 | return "没找到sheet表格"
166 |
--------------------------------------------------------------------------------
/utils/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oujiangping/chat-excel/ecfbd7aa5563c4bee0bf61b93fa6d752cc51400a/utils/__init__.py
--------------------------------------------------------------------------------
/utils/excel_loader.py:
--------------------------------------------------------------------------------
1 | import pandas as pd
2 | import xlrd
3 | from openpyxl import load_workbook
4 |
5 |
6 | def load_excel_from_file(file_path, merge_cells=False):
7 | sheets_db = {} # {sheet_name: DataFrame}
8 | # 判断文件扩展名
9 | if file_path.endswith('.xlsx') or file_path.endswith('.xlsm') or file_path.endswith('.xltx') or file_path.endswith(
10 | '.xltm'):
11 | # 使用 openpyxl 打开 .xlsx 等格式文件
12 | wb = load_workbook(file_path)
13 | sheet_names = wb.sheetnames
14 | for sheet_name in sheet_names:
15 | sheet = wb[sheet_name]
16 | print("total rows:", sheet.max_row)
17 | data = []
18 | header = None
19 | row_index = 0
20 | for row in sheet.iter_rows(values_only=True):
21 | if row_index == 0:
22 | header = row
23 | row_index += 1
24 | continue
25 | data.append(row)
26 | df = pd.DataFrame(data, columns=header)
27 | # 去除sheet_name所有空格使得表名合法
28 | sheet_name = sheet_name.replace(" ", "")
29 | sheets_db[sheet_name] = df
30 | return sheets_db
31 | elif file_path.endswith('.xls'):
32 | # 使用 xlrd 打开 .xls 格式文件
33 | workbook = xlrd.open_workbook(file_path)
34 | for sheet_name in workbook.sheet_names():
35 | sheet = workbook.sheet_by_name(sheet_name)
36 | print("total rows:", sheet.nrows)
37 | df = None
38 | # 读取表头
39 | header = sheet.row_values(0)
40 | data = []
41 | for row in range(1, sheet.nrows): # 从第二行开始读取数据
42 | data.append(sheet.row_values(row))
43 | df = pd.DataFrame(data, columns=header) # 设置表头
44 | # 去除sheet_name所有空格使得表名合法
45 | sheet_name = sheet_name.replace(" ", "")
46 | sheets_db[sheet_name] = df
47 | return sheets_db
48 | elif file_path.endswith('.csv'):
49 | try:
50 | df = pd.read_csv(file_path)
51 | sheets_db['df'] = df
52 | print("total rows:", len(df))
53 | return sheets_db
54 | except Exception as e:
55 | print(f"读取 CSV 文件时出错: {e}")
56 | raise
57 | else:
58 | print("不支持的文件格式,请使用 .xls 或 .xlsx 格式的文件。")
59 | # 抛出异常
60 | raise ValueError("不支持的文件格式,请使用.xls 或.xlsx 格式的文件。")
--------------------------------------------------------------------------------
/utils/export_tools.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/15 10:43
5 | * @FileName: pdf_tools.py
6 | **************************************
7 | """
8 | import gradio as gr
9 | from fpdf import FPDF
10 | from mistletoe import markdown
11 |
12 |
13 | def export_to_pdf(text):
14 | if not text.strip(): # 判断文本是否为空
15 | gr.Warning("当前分析结果为空,不能导出")
16 | return None
17 | pdf = FPDF()
18 | pdf.add_page()
19 | pdf.add_font('ArialUnicode', '', './fonts/arialuni.ttf', uni=True)
20 | pdf.set_font('ArialUnicode', size=12)
21 | # pdf.add_font('fireflysung', '', './fonts/fireflysung.ttf', uni=True)
22 | # pdf.set_font('fireflysung', '', 14)
23 | # pdf.multi_cell(0, 10, txt=text)
24 | pdf_path = "../output/analysis_result.pdf"
25 | html = markdown(text)
26 | # md = (
27 | # MarkdownIt("commonmark", {"breaks": True, "html": True})
28 | # .enable("strikethrough")
29 | # .enable("table")
30 | # )
31 | # pdf.write(text=html)
32 | # html = md.render(text)
33 | print("----------------------------------")
34 | print(html)
35 | pdf.write_html(html)
36 | pdf.output(pdf_path)
37 | return pdf_path
38 |
39 |
40 | # 导出成markdown
41 | async def export_to_markdown(text):
42 | if not text.strip(): # 判断文本是否为空
43 | gr.Warning("当前分析结果为空,不能导出")
44 | return None
45 | md_path = "output/analysis_result.md"
46 | with open(md_path, 'w', encoding='utf-8') as f:
47 | f.write(text)
48 | # 关闭文件
49 | f.close()
50 | return md_path
51 |
--------------------------------------------------------------------------------
/view/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/22 14:06
5 | * @FileName: __init__.py.py
6 | **************************************
7 | """
8 |
--------------------------------------------------------------------------------
/view/view.py:
--------------------------------------------------------------------------------
1 | """
2 | **************************************
3 | * @Author : oujiangping
4 | * @Time : 2025/4/22 14:07
5 | * @FileName: view.py
6 | **************************************
7 | """
8 | import gradio as gr
9 | import time
10 | from concurrent.futures import ThreadPoolExecutor
11 |
12 | # 定义全局加载弹框(带遮罩层)
13 | loading_html = '''
14 |
15 |
16 |
17 |
正在处理中,请勿执行其它操作
18 |
19 |
20 |
21 |
50 | '''
51 |
52 |
53 | def get_loading_view():
54 | return gr.HTML(loading_html, visible=False)
55 |
--------------------------------------------------------------------------------