This is a test version of Biostars. For the public version, visit https://www.biostars.org.
a python typeError

I am writing a python scripts to deal with my input file containing latitude and longitude infos, which I will convert to the geographical distance.

Here is a short list of my input entries

sampleID.unique    general_identifier    latitude    longitude
SEEDGWAS1003    27086    20.485433    -89.732539
SEEDGWAS1004    27110    20.969048    -97.382255
SEEDGWAS1006    27507    -23.267981    -57.309104
SEEDGWAS1007    27713    8.433333333    -62.46666667

And my scripts is as follows:

import math
from math import radians, cos, sin, asin, sqrt
import sys

filename = sys.argv[1]
outFileName = sys.argv[2]


class latiLongi:
    def __init__(self, filename):
        f = open(filename, "r")
        self.latitudes = []
        self.longitudes = []
        self.samples = []
        f.next() # skip header
        for line in f:
            fields = line.strip().split()
            latitude1 = float(fields[2])
            longitude1 = float(fields[3])
            sample1 = fields[0]
            self.latitudes.append(latitude1)
            self.longitudes.append(longitude1)
            self.samples.append(sample1)


def haversine(filename, lat2, lon2):
    LL = latiLongi(filename)
    lat1 = [lati for lati in LL.latitudes]
    lon1 = [longi for longi in LL.longitudes]
    sample = [sample for sample in LL.samples]
    lat2 = float(lat2)
    lon2 = float(lon2)
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    km = 6367 * c
    return (sample, km)

geoDis = haversine(filename, 18.099138, -100.243303)

outFile = open(outFileName, 'w')

for num in range(0, len(geoDis[0])):
    outFile.write(str(geoDis[0][num]))
    outFile.write("\t")
    outFile.write(str(geoDis[1][num])+"\n")

And I have got errors as follows:

Traceback (most recent call last):
  File "geoDisFromLongiLatiDecimal.py", line 49, in <module>
    geoDis = haversine(filename, 18.099138, -100.243303)
  File "geoDisFromLongiLatiDecimal.py", line 40, in haversine
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
TypeError: a float is required

I am a newbie in python. Could someone help to tackle my errors? Thanks!

Li

python

maybe more appropriate elsewhere, this being a bioinformatics site.

But aren't you passing a list, when you should be passing a float? As a first step, write a test of haversine; or rewrite haversine as two functions, one that takes a file and one that manipulates the extracted data

Thanks! I got it fixed. As my lat1 and lon1 are a series of numbers, while lat2 and lon2 just single number. I shouldnot do any computation between them.

Pro tip: why the succinctness in variable names? Don't be afraid to spend a couple more keystrokes and name your variables descriptively, e.g., lat_series, lon_series, lat_coordinate, lon_coordinate. Will make issues like these immediately obvious.

0 answers

No answers yet.

Log in to answer this question.