├── .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 | ![gradio.png](asserts/gradio.png) 21 | 22 | ![img.png](asserts/img.png) 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 | ![gradio.png](asserts/gradio.png) 21 | 22 | ![img.png](asserts/img.png) 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 | --------------------------------------------------------------------------------