eshangj/stackoverflow_q_and_a_sample huggingface dataset:
Question: I'm learning JavaScript right now and I'm trying to display data from 2 tables, which is profile and posts of the user profile. Here is the API view API I tried to display the data on index.html using JavaScript. index.js function load_profile(author_id) { // Load posts list fetch(`/profile/${author_id}`) .then(response => response.json()) .then(response => { // Print profile & posts console.log(response.prof); console.log(response.posts); const content_profile = document.createElement('div'); content_profile.className = "content_profile"; const user = document.createElement('p'); user.innerHTML = `<h3>${response.prof.user}</h3>`; const followers = document.createElement('p'); followers.innerHTML = `Follower: ${response.prof.followers}`; const following = document.createElement('p'); following.innerHTML = `Following: ${response.prof.following}`; const a = document.createElement('a'); a.className = "btn btn-primary"; a.innerHTML = "Follow"; content_profile.append(user, followers, following, a); document.querySelector('#profile').append(content_profile); response.posts.forEach(post =>{ const list_item = document.createElement('ul'); const data_author = document.createElement('li'); data_author.innerHTML = post.author+" at "+post.timestamp+" say:"; const data_content = document.createElement('li'); data_content.innerHTML = post.content; const data_like = document.createElement('li'); data_like.innerHTML = post.like+" Likes"; list_item.append(data_author, data_content, data_like); document.querySelector('#postbox').append(list_item); }) }) }  index.html {% extends "sinpage/layout.html" %} {% load static %} {% block body %} <div class="container"> <div class="row"> <div class="col" id="userpage"> <h2>{{ request.user.username }}</h2> <div id="postit"> <form id="compose-form"> {{form.as_p}} <input type="submit" class="btn btn-primary" value="Post"> </form> </div> </div> <div class="col" id="profile"></div> <div class="col" id="postbox"></div> </div> </div> {% endblock %} {% block script %} <script src="{% static 'sinpage/index.js' %}"></script> {% endblock %}  So the profile data show up but the posts data didn't. This is my first time displaying 2 data using JavaScript, I think I'm doing it wrong? Any pointer is appreciated. Thanks. index.js updated. Now it's working! :)

Answer: Example function load() { fetch('https://my/api/call') .then(response => response.json()) .then(data => { // do something with data.profile return data }) .then(data => { // do something with data.posts }) }
Question: I'm using selenium and ChromeDriver, worked with it several times and have no errors. Suddenly today I got this warning:  The chromedriver version (114.0.5735.90) detected in PATH at C:\Work\Scrape\chromedriver.exe might not be compatible with the detected chrome version (129.0.6668.60); currently, chromedriver 129.0.6668.70 is recommended for chrome 129.*, so it is advised to delete the driver in PATH and retry  and an error message:  selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser version is 129.0.6668.60 with binary path C:\Program Files\Google\Chrome\Application\chrome.exe  Read a 1-year-old answered question here, I already used the code until now. The previous question are between Chromedriver 114 and Chrome 116, now my problem is the Chrome version 129. Should I downgrade my Chrome and how to do it? I'm using selenium 4.20

Answer: Your chrome browser seems to have upgraded recently to v129. You need to use matching chromedriver in your selenium code. Option 1: Download latest ChromeDriver(v129) from the following link: https://googlechromelabs.github.io/chrome-for-testing/#stable And use this chromedriver.exe in your driver path. (C:\Work\Scrape\chromedriver.exe) Options 2: Allow Selenium Manager to download the latest driver for you matching the chrome browser in your system. Code can be as simple as: from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.google.com/") driver.quit()  Refer below answer to know more about Selenium Manager:  https://stackoverflow.com/a/76463081/7598774
Question: With a class that inherits from dict, why does str() not use dict.__str__ when dict is earlier in the MRO of the class? Python 3.10.12 (main, Sep 11 2024, 15:47:36) [GCC 11.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> class A: ... def __str__(self): ... return "A" ... >>> class B(dict, A): ... pass ... >>> B.__mro__ (<class '__main__.B'>, <class 'dict'>, <class '__main__.A'>, <class 'object'>) >>> str(B()) 'A' >>> str(dict()) '{}' >>>  When calling str(B()), why is dict.__str__ not called in preference to A.__str__ ? Is it somehow related to dict having a slot_wrapper instead of a function? >>> dict.__str__ <slot wrapper '__str__' of 'object' objects> >>> A.__str__ <function A.__str__ at 0x75be4ea8a0e0> >>> B.__str__ <function A.__str__ at 0x75be4ea8a0e0>  EDIT re: Sub-Interpreters In a Python 3.12 sub-interpreter the behavior is different. This is what started my investigation. A Django application running in Apache with mod_wsgi exposed the difference. Inspecting dict.__str__: Python 3.10.12, main AND sub interpreters: <slot wrapper '__str__' of 'object' objects> Python 3.12.3, main interpreter: <slot wrapper '__str__' of 'object' objects> Python 3.12.3, sub interpreter: <slot wrapper '__str__' of 'dict' objects> This added dict.__str__ is what was making Django forms display errors as "{}" or "[]", instead of "". The fix was to add this line into the Apache site definition: WSGIApplicationGroup %{GLOBAL}  which, per modwsgi documentation: >> ... forces the WSGI application to run in the main Python interpreter...  The config was already using the directives: WSGIDaemonProcess WSGIProcessGroup WSGIScriptAlias EDIT This is a bug in Python 3.12.4 and earlier. See gh-117482

Answer: dict.__str__ is inherited from object, not implemented by dict. (The implementation is basically return repr(self) - it's not dict-specific.) dict might come before A in B.__mro__, but A comes before object, so A's __str__ implementation is found before object's implementation.
Question: I wanted to use selenium-wire to intercept requests from Selenium to remote host. I tried to install it using PIP, it installed successfully without any issues, but when I went to import it on my project its giving me error as follows: no module named 'blinker._saferef I tried to dig in the issue, but found nothing. I can tell that it is due to the library itself is now discontinued. Can you help me with this issue? I tried to find the root cause of the error expecting it to solve my issue, but couldn't find anything.

Answer: You seem to be facing issue which is not related to the library itself but the dependency of the library. Please uninstall the version of blinker._saferef, issue the command below: pip uninstall selenium-wire pip uninstall blinker  once its uninstall use the blinker version which is less than 1.8.0, use following command: pip install blinker==1.7.0  Finally install selenium-wire: pip install selenium-wire  Try to use the library, it should work.
Question: I've pairs of y and z locations which I'm plotting as a scatter plot as shown below.  Looking at the plot, we can visualize a tight boundary which includes all of the points. My question is how do we draw this boundary in python? Ideally, I would like to have a filled region representing this area. I've taken a look at scipy.spatial.ConvexHull, but it fails to capture the lower curve. My attempt: plt.scatter(yloc, zloc) points = np.column_stack((yloc, zloc)) hull = ConvexHull(points) for simplex in hull.simplices: plt.plot(points[simplex, 0], points[simplex, 1], 'r-')   If you want to play with the data, it is available here. Y locations are under the header 'Points:1' and Z locations are under 'Points:2'.

Answer: Thanks to the users for pointing me to alphashape. As the alphashape code provided by Keerthan draws piecewise linear boundaries, I wasn't completely satisfied with it. Here's how I managed to generate a smooth curve. Continuing from Keerthan's answer from scipy.interpolate import splprep, splev # Instead of ax.add_path, extract the outer points y = [i[0] for i in list(alpha_shape.exterior.coords)] z = [i[1] for i in list(alpha_shape.exterior.coords)] points = np.array([y, z]) # Create a parametric spline # Value of s handles tradeoff between smoothness and accuracy. tck, u = splprep(points, s=500, per=True) u_new = np.linspace(0, 1, 300) y_new, z_new = splev(u_new, tck) plt.fill(y_new, z_new, linewidth=2, color='tab:red', alpha=0.5)  Result with s=500 (which favours smoothness at a loss of completely capturing all the points) is as follows:
Question: I created a virtual environment using python -m venv venv  Now I'm opening a Python shell without activating the virtual environment by running import sys print(sys.path, sys.prefix)  I get ['', '/usr/lib/python312.zip', '/usr/lib/python3.12', '/usr/lib/python3.12/lib-dynload', '/usr/lib/python3.12/site-packages'] /usr  which is exactly what I'm expecting. While, if I activate the environment, the output is ['', '/usr/lib/python312.zip', '/usr/lib/python3.12', '/usr/lib/python3.12/lib-dynload', '/home/myname/mypath/venv/lib/python3.12/site-packages'] /home/myname/Projects/pypath/venv  What upset me a lot is that even inside the venv it seems that the interpreter is seraching packages firstly in the system-wide location, and only then inside the venv directory. Is this true?

Answer:  Is this true?  No. The system packages are at /usr/lib/python3.12/site-packages, which is not present at all when you're "inside" the venv. The paths before the venv-site (which is /home/myname/mypath/venv/lib/python3.12/site-packages in your case) are for standard library imports. For example, if you import csv or some other stdlib module, then csv.__file__ will be found at /usr/lib/python3.12/csv.py.
Question: My question is whether there is a way to have null until the full window can be filled at the start of a rolling window in polars. For example: dates = [ "2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04", "2020-01-05", "2020-01-06", "2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04", "2020-01-05", "2020-01-06", ] df = pl.DataFrame({"dt": dates, "a": [3, 4, 2, 8, 10, 1, 1, 7, 5, 9, 2, 1], "b": ["Yes","Yes","Yes","Yes","Yes", "Yes", "No", "No", "No", "No", "No", "No"]}).with_columns( pl.col("dt").str.strptime(pl.Date).set_sorted() ) df = df.sort(by = 'dt') df.rolling( index_column="dt", period="2d", group_by = 'b' ).agg(pl.col("a").mean().alias("ma_2d"))  Result b dt ma_2d str date f64 "Yes" 2020-01-01 3.0 "Yes" 2020-01-02 3.5 "Yes" 2020-01-03 3.0 "Yes" 2020-01-04 5.0 "Yes" 2020-01-05 9.0  My expectation in this case is that the first day should be null because there aren't 2 days to fill the window. But polars seems to just truncate the window to fill the starting days.

Answer: Can you check the length? (df.rolling(index_column="dt", period="2d", group_by="b") .agg( pl.when(pl.len() > 1) .then(pl.col("a").mean()) .alias("ma_2d") ) )  shape: (12, 3) ┌─────┬────────────┬───────┐ │ b ┆ dt ┆ ma_2d │ │ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 │ ╞═════╪════════════╪═══════╡ │ Yes ┆ 2020-01-01 ┆ null │ │ Yes ┆ 2020-01-02 ┆ 3.5 │ │ Yes ┆ 2020-01-03 ┆ 3.0 │ │ Yes ┆ 2020-01-04 ┆ 5.0 │ │ Yes ┆ 2020-01-05 ┆ 9.0 │ │ … ┆ … ┆ … │ │ No ┆ 2020-01-02 ┆ 4.0 │ │ No ┆ 2020-01-03 ┆ 6.0 │ │ No ┆ 2020-01-04 ┆ 7.0 │ │ No ┆ 2020-01-05 ┆ 5.5 │ │ No ┆ 2020-01-06 ┆ 1.5 │ └─────┴────────────┴───────┘  Alternatively, there is a dedicated .rolling_mean_by() method that supports min_periods. df.with_columns( pl.col("a").rolling_mean_by("dt", window_size="2d", min_periods=2) .over("b") .alias("ma_2d") )  shape: (12, 4) ┌────────────┬─────┬─────┬───────┐ │ dt ┆ a ┆ b ┆ ma_2d │ │ --- ┆ --- ┆ --- ┆ --- │ │ date ┆ i64 ┆ str ┆ f64 │ ╞════════════╪═════╪═════╪═══════╡ │ 2020-01-01 ┆ 3 ┆ Yes ┆ null │ │ 2020-01-01 ┆ 1 ┆ No ┆ null │ │ 2020-01-02 ┆ 4 ┆ Yes ┆ 3.5 │ │ 2020-01-02 ┆ 7 ┆ No ┆ 4.0 │ │ 2020-01-03 ┆ 2 ┆ Yes ┆ 3.0 │ │ … ┆ … ┆ … ┆ … │ │ 2020-01-04 ┆ 9 ┆ No ┆ 7.0 │ │ 2020-01-05 ┆ 10 ┆ Yes ┆ 9.0 │ │ 2020-01-05 ┆ 2 ┆ No ┆ 5.5 │ │ 2020-01-06 ┆ 1 ┆ Yes ┆ 5.5 │ │ 2020-01-06 ┆ 1 ┆ No ┆ 1.5 │ └────────────┴─────┴─────┴───────┘
Question: I am writing MP4 video files with the following PyAV-based code (getting input frames represented as numpy arrays - the sort produced by imageio.imread - as input): class MP4: def __init__(self, fname, width, height, fps): self.output = av.open(fname, 'w', format='mp4') self.stream = self.output.add_stream('h264', str(fps)) self.stream.width = width self.stream.height = height # these 2 lines can be removed and the problem still reproduces: self.stream.pix_fmt = 'yuv420p' self.stream.options = {'crf': '17'} def write_frame(self, pixels): frame = av.VideoFrame.from_ndarray(pixels, format='rgb24') packet = self.stream.encode(frame) self.output.mux(packet) def close(self): packet = self.stream.encode(None) self.output.mux(packet) self.output.close()  The colors in the output MP4 video are slightly different (apparently darker) than the colors in the input images: Screen grab of an image viewer showing an input frame:  Screen grab of VLC playing the output MP4 video:  How can this problem be fixed? I variously fiddled with the frame.colorspace attribute, stream options and VideoFrame.reformat but it changed nothing; of course I could have been fiddling incorrectly. As you can see, the input has simple flat color regions, so I doubt it's any sort of compression artifact, eg YUV420 dropping some of the chroma info or other such.

Answer: Adding frame = frame.reformat(format='yuv420p', dst_colorspace=av.video.reformatter.Colorspace.ITU709) before the call to encode fixes the problem. I don't know why both the format and the dst_colorspace arguments are needed for this to work, empirically they are.
Question: I have a polars dataframe that contains and ID, DATE and OS. For each day i would like to count how many uniques ID are until that day. import polars as pl df = ( pl.DataFrame( { "DAY": [1,1,1,2,2,2,3,3,3], "OS" : ["A","B","A","B","A","B","A","B","A"], "ID": ["X","Y","Z","W","X","J","K","L","X"] } ) )  Desired Output: shape: (3, 3) ┌─────┬─────┬─────┐ │ DAY ┆ A ┆ B │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ 1 ┆ 2 ┆ 1 │ │ 2 ┆ 2 ┆ 3 │ │ 3 ┆ 3 ┆ 4 │ └─────┴─────┴─────┘  It should looks like this, because on day 1, the are 3 values and 3 ID . On day 2 the ID "X" its reapeted with the same OS so, the columns A remains the same, and the other 2 are different so add 2 to B. On day 3, the ID X its reapeated with A, and the other 2 are different, so it sums again over each column. I think it could be solved with an approach like the following: ( df .pivot( index="DAY", on="OS", aggregate_function=(pl.col("ID").cum_sum().unique()) ) ) 

Answer: You can use Expr.is_first_distinct mark each of the first distinct entries of 'ID' within each 'OS'. Then you can pivot those results and take their cumulative sum. import polars as pl df = ( pl.DataFrame( { "DAY": [1,1,1,2,2,2,3,3,3], "OS" : ["A","B","A","B","A","B","A","B","A"], "ID": ["X","Y","Z","W","X","J","K","L","X"] } ) ) print( df .with_columns(pl.col('ID').is_first_distinct().over('OS')) .pivot( index='DAY', on='OS', aggregate_function=pl.col('ID').sum() ) .with_columns(pl.exclude('DAY').cum_sum()) ) # shape: (3, 3) # ┌─────┬─────┬─────┐ # │ DAY ┆ A ┆ B │ # │ --- ┆ --- ┆ --- │ # │ i64 ┆ u32 ┆ u32 │ # ╞═════╪═════╪═════╡ # │ 1 ┆ 2 ┆ 1 │ # │ 2 ┆ 2 ┆ 3 │ # │ 3 ┆ 3 ┆ 4 │ # └─────┴─────┴─────┘
Question: I have a column of lists in my polars dataframe. I would like to access and change a value by list index. Example input df = pl.DataFrame({ "values": [ [10, 20, 30, 40], [50, 60, 70, 80], [90, 100, 110, 120], ], })  Pseudocode df = df.with_columns( pl.col("values").list.eval(pl.element(3) = 1).alias("values2") )  Expected outcome df = pl.DataFrame({ "values": [ [10, 20, 30, 1], [50, 60, 70, 1], [90, 100, 110, 1], ], }) 

Answer:  take first 3 elements with list.head(). add 1 add remaining elements of list with list.tail() using -4 to get all elements except first 4. concat_list() to concat elements together.  df.with_columns( pl.concat_list( pl.col.values.list.head(3), 1, pl.col.values.list.tail(-4) ) )  shape: (3, 1) ┌───────────────────┐ │ values │ │ --- │ │ list[i64] │ ╞═══════════════════╡ │ [10, 20, 30, 1] │ │ [50, 60, 70, 1] │ │ [90, 100, 110, 1] │ └───────────────────┘
Question: I 'am trying to find similar vector with spacy and numpy. I found the code following url : Mapping word vector to the most similar/closest word using spaCy But I'm getting type error import numpy as np your_word = "country" ms = nlp.vocab.vectors.most_similar( np.asarray([nlp.vocab.vectors[nlp.vocab.strings[your_word]]]), n=10, ) words = [nlp.vocab.strings[w] for w in ms[0][0]] distances = ms[2] print(words)  error : --------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[139], line 6 1 import numpy as np 3 your_word = "country" 5 ms = nlp.vocab.vectors.most_similar( ----> 6 np.asarray([nlp.vocab.vectors[nlp.vocab.strings[your_word]]]), 7 n=10, 8 ) 10 words = [nlp.vocab.strings[w] for w in ms[0][0]] 11 distances = ms[2] File cupy/_core/core.pyx:1475, in cupy._core.core._ndarray_base.__array__() TypeError: Implicit conversion to a NumPy array is not allowed. Please use `.get()` to construct a NumPy array explicitly.  I'm using gpu, how can I fix this?

Answer: From the Reference - Mapping word vector to the most similar/closest word using spaCy Reference - https://docs.cupy.dev/en/stable/reference/ndarray.html You need to convert CuPy arrays to be explicitly converted to NumPy arrays before operations on the CPU Edit lets make reshape the word vector into a 2D array with one row and multiple columns import numpy as np your_word = "country" word_vector = nlp.vocab.vectors[nlp.vocab.strings[your_word]] word_vector_2d = word_vector.reshape(1, -1) # '-1' lets numpy infer the correct size for the second dimension ms = nlp.vocab.vectors.most_similar( word_vector_2d, n=10, ) words = [nlp.vocab.strings[w] for w in ms[0][0]] distances = ms[2] print(words)
Question: I'm to create a generator that accepts a name of the file or a fileobject, words that we're looking for in a line and stop words that tell us that we should skip this line as soon as we meet them. I wrote a generator function, but I paid attenttion that in my realisation I can't be sure that if I open a file it will be closed afterwards, because it is not guaranteed that the generator will reach the end of its iteration. def gen_reader(file, lookups, stopwords): is_file = False try: if isinstance(file, str): file = open(file, 'r', encoding='UTF-8') is_file = True except FileNotFoundError: raise FileNotFoundError('File not found') else: lookups = list(map(str.lower, lookups)) stop_words = list(map(str.lower, stopwords)) for line in file: original_line = line line = line.lower() if any(lookup in line for lookup in lookups) \ and not any(stop_word in line for stop_word in stop_words): yield original_line.strip() if is_file: file.close()  I was going to use context manager "with" and put the search code into it, but if I already got the file, then I'd write the same code again and it wouldn't be nice, would it? What are your ideas how I can improve my code, I ran of them.

Answer: You could write a context managed class that is iterable like this: from pathlib import Path from collections.abc import Iterator from typing import TextIO, Self class Reader: def __init__(self, filename: Path, lookups: list[str], stopwords: list[str]): self._lookups: set[str] = {e.lower() for e in lookups} self._stopwords: set[str] = {e.lower() for e in stopwords} self._fd: TextIO = filename.open() def __enter__(self) -> Self: return self def __exit__(self, *_) -> None: self._fd.close() def __iter__(self) -> Iterator[str]: for line in self._fd: words: set[str] = {e.lower() for e in line.split()} if (self._lookups & words) and not (self._stopwords & words): yield line.rstrip() with Reader(Path("foo.txt"), ["world"], ["banana"]) as reader: for line in reader: print(line)  Now let's assume that foo.txt looks like this: hello world banana world goodbye my friend  Then the output would be: hello world  Thus we ensure that the file descriptor is properly closed at the appropriate point. Note also the use of sets for optimum performance when checking against the lookups and stop words
Question: There is a DataFrame with option tickers at the zero level, prices (open, close, high, and low) at the first level, and option types at the second level (header structure: 'Ticker', 'open/close/high/low', 'Type'). The task: for each ticker, calculate the average price, then add columns with the average prices (header structure: 'Ticker', 'Average', 'Type') to the original DataFrame. My script executes almost correctly, but it corrupts the column names of the original DataFrame. Code: import pandas as pd import numpy as np df_f_avg = pd.DataFrame({ ('a1c9', 'open', 'call'): [3, 0.50, 3.0], ('a1c9', 'close', 'call'): [4, 0.35, 3.5], ('a1c9', 'high', 'call'): [1, 0.20, 1.5], ('a1c9', 'low', 'call'): [2, 0.09, 2.5], ('a1p9', 'open', 'put'): [5, 0.05, 4.0], ('a1p9', 'close', 'put'): [6, 0.10, 5.5], ('a1p9', 'high', 'put'): [7, 0.20, 6.0], ('a1p9', 'low', 'put'): [8, 0.31, 7.0]}) df_f_avg.columns.names = ['Ticker', 'Price', 'Type'] df_f_avg columns_name = df_f_avg.loc[:, pd.IndexSlice[:, 'open']].columns avg_group_ticker = pd.DataFrame(data=df_f_avg.loc[:, (slice(None), ['open', 'close', 'high', 'low'], slice(None))].T.groupby('Ticker').mean().T) avg_group_ticker.columns = columns_name avg_group_ticker.columns._levels[1].values[:] = 'avg' df_f_avg = pd.concat([df_f_avg, avg_group_ticker], axis=1) df_f_avg  It turns out like this: … Ticker a1c9 a1p9 a1c9 a1p9 Price avg avg avg avg Type call call call call put put put put call put 0 3.0 4.00 1.0 2.00 5.00 6.0 7.0 8.00 2.500 6.500 1 0.5 0.35 0.2 0.09 0.05 0.1 0.2 0.31 0.285 0.165 2 3.0 3.50 1.5 2.50 4.00 5.5 6.0 7.00 2.625 5.625  But it should look like this: … Ticker a1c9 a1p9 a1c9 a1p9 Price open close high low open close high low avg avg Type call call call call put put put put call put 0 3.0 4.00 1.0 2.00 5.00 6.0 7.0 8.00 2.500 6.500 1 0.5 0.35 0.2 0.09 0.05 0.1 0.2 0.31 0.285 0.165 2 3.0 3.50 1.5 2.50 4.00 5.5 6.0 7.00 2.625 5.625  Questions:  How can this be fixed (P.S. this is a shortened example, in reality, there will be dozens of tickers)? Perhaps you know a simpler and more efficient way to solve this task (simpler code, more reliable and universal, faster, less resource-intensive)? 

Answer: The issue is that you modify the original index since columns_name = df_f_avg.loc[:, pd.IndexSlice[:, 'open']].columns is making a reference to it. You must make a deep copy: columns_name = df_f_avg.loc[:, pd.IndexSlice[:, 'open']].columns.copy(deep=True)  You could also rename Price and groupby all levels: out = df_f_avg.join(df_f_avg.rename(columns=lambda x: 'avg', level='Price') .T.groupby(['Ticker', 'Price', 'Type']).mean().T )  Output: Ticker a1c9 a1p9 a1c9 a1p9 Price open close high low open close high low avg avg Type call call call call put put put put call put 0 3.0 4.00 1.0 2.00 5.00 6.0 7.0 8.00 2.500 6.500 1 0.5 0.35 0.2 0.09 0.05 0.1 0.2 0.31 0.285 0.165 2 3.0 3.50 1.5 2.50 4.00 5.5 6.0 7.00 2.625 5.625